先决条件: C语言中的指针
指针用于指向变量的位置。通过在指针名称之前加星号(*)来声明指针。
句法:
datatype *pointer_name;
当需要使用变量的位置初始化指针时,请在变量名称前使用&符(&) 。
例子:
// Declaration of integer variable
int var=10;
// Initialization of pointer variable
int *pointer=&var;
“与”号(&)用于获取变量的地址。我们可以在任何标识符前面加上一个&符号来直接找到其位置。
例子:
// This code prints the address of x
#include
int main()
{
int x = 10;
// Prints address of x
printf(
"Address of variable x = %p", &x);
return 0;
}
Address of variable x = 0x7fff3b690fd4
C支持一组丰富的内置运算,例如算术运算,关系运算,赋值运算,条件运算等,它们可以对标识符执行。像任何其他变量一样,这些操作也可以在指针变量上执行。
算术运算符
我们可以使用算术运算运算符对指针变量执行算术运算。我们可以使用指向该整数变量的指针添加整数或减去整数。下表显示了可以对指针变量执行的算术运算运算符:
例子:
*ptr1 + *ptr2
*ptr1 * *ptr2
*ptr1 + *ptr2 - *ptr3
我们还可以使用整数直接执行算术表达式。让我们看一下下面给出的示例,其中p1和p2是指针。
p1+10, p2-5, p1-p2+10, p1/2
下图显示了表达式/运算符与指针的精确协作方式。
如图所示,指针“ pa”和“ pb”分别指向整数变量“ a”和“ b” 。直接在整数变量和指针变量之间执行加法,结果分别存储在整数变量“ c”和“ x”中。两种结果是相同的。
让我们用给定的代码更好地理解指针算术表达式:
// Program showing pointer expressions
// during Arithmetic Operations
#include
int main()
{
// Integer variables
int a = 20, b = 10;
// Variables for storing arithmetic
// operations solution
int add, sub, div, mul, mod;
// Pointer variables for variables
// a and b
int *ptr_a, *ptr_b;
// Initialization of pointers
ptr_a = &a;
ptr_b = &b;
// Performing arithmetic Operations
// on pointers
add = *ptr_a + *ptr_b;
sub = *ptr_a - *ptr_b;
mul = *ptr_a * *ptr_b;
div = *ptr_a / *ptr_b;
mod = *ptr_a % *ptr_b;
// Printing values
printf("Addition = %d\n", add);
printf("Subtraction = %d\n", sub);
printf("Multiplication = %d\n", mul);
printf("Division = %d\n", div);
printf("Modulo = %d\n", mod);
return 0;
}
Addition = 30
Subtraction = 10
Multiplication = 200
Division = 2
Modulo = 0
注意:执行除法时,请确保在指针的“ /”和“ *”之间放置空格,因为它们在一起将构成多行注释(’/ *’)。
例子:
Incorrect: *ptr_a/*ptr_b;
Correct: *ptr_a / *ptr_b;
Correct: (*ptr_a)/(*ptr_b);
关系运算符
关系运算通常用于比较变量的值,以此为基础我们可以做出决策。给定的表显示了可以对指针变量执行的关系运算符。
例子:
*ptr1 > *ptr2
*ptr1 < *ptr2
关系表达式的值为0或1,为false或true。如果表达式为true,则表达式将返回值1;如果为false,则它将返回值0。
让我们用下面给出的代码更好地理解指针上的关系表达式:
// Program showing pointer expressions
// during Relational Operations
#include
int main()
{
// Initializing integer variables
int a = 20, b = 10;
// Declaring pointer variables
int* ptr_a;
int* ptr_b;
// Initializing pointer variables
ptr_a = &a;
ptr_b = &b;
// Performing relational operations
// less than operator
if (*ptr_a < *ptr_b) {
printf(
"%d is less than %d.", *ptr_a, *ptr_b);
}
// Greater than operator
if (*ptr_a > *ptr_b) {
printf(
"%d is greater than %d.", *ptr_a, *ptr_b);
}
// Equal to
if (*ptr_a == *ptr_b) {
printf(
"%d is equal to %d.", *ptr_a, *ptr_b);
}
return 0;
}
20 is greater than 10.
输出:
20 is greater than 10.
赋值运算符
分配运算符用于将值分配给标识符。有多种速记操作可用。下表给出了实际的赋值语句及其速记语句。
例子:
*a=10
*b+=20
*z=3.5
*s=4.56743
让我们借助以下代码更好地理解赋值运算符:
// Program showing pointer expressions
// during Assignment Operations
#include
int main()
{
// Initializing integer variable
int a = 30;
// Declaring pointer variable
int* ptr_a;
// Initializing pointer using
// assignment operator
ptr_a = &a;
// Changing the variable's value using
// assignment operator
*ptr_a = 50;
// Printing value of 'a' after
// updating its value
printf("Value of variable a = %d", *ptr_a);
return 0;
}
Value of variable a = 50
条件运算符
C中只有一种最常用的条件运算符称为三元运算符。三元运算符首先检查表达式,然后根据其返回值返回true或false,从而触发/选择另一个表达式。
句法:
expression1 ? expression2 : expression3;
例子:
c = (*ptr1 > *ptr2) ? *ptr1 : *ptr2;
- 如示例所示,假设* ptr1 = 20和* ptr2 = 10,则表达式的条件在此处变为true,因此它将返回真实表达式的值,即* ptr1,因此变量’c’现在将包含值20。
- 考虑相同的示例,假设* ptr1 = 30和* ptr2 = 50,则表达式的条件为false,因此它将返回假表达式的值,即* ptr2,因此变量’c’现在将包含值50。
让我们通过给定的代码了解概念:
// Program showing pointer expressions
// during Conditional Operations
#include
int main()
{
// Initializing integer variables
int a = 15, b = 20, result = 0;
// Declaring pointer variables
int *ptr_a, *ptr_b;
// Initializing pointer variables
ptr_a = &a;
ptr_b = &b;
// Performing ternary operator
result = ((*ptr_a > *ptr_b) ? *ptr_a : *ptr_b);
// Printing result of ternary operator
printf("%d is the greatest.", result);
return 0;
}
20 is the greatest.
一元运算符
主要有两个运算符,分别给出如下。
例子:
(*ptr1)++
(*ptr1)--
让我们通过给定的代码了解一元运算运算符的用法:
// Program showing pointer expressions
// during Unary Operations
#include
int main()
{
// Initializing integer variable
int a = 34;
// Declaring pointer variable
int* ptr_a;
// Initializing pointer variable
ptr_a = &a;
// Value of a before increment
printf("Increment:\n");
printf(
"Before increment a = %d\n", *ptr_a);
// Unary increment operation
(*ptr_a)++;
// Value of a after increment
printf(
"After increment a = %d", *ptr_a);
// Value before decrement
printf("\n\nDecrement:\n");
printf(
"Before decrement a = %d\n", *ptr_a);
// unary decrement operation
(*ptr_a)--;
// Value after decrement
printf("After decrement a=%d", *ptr_a);
return 0;
}
Increment:
Before increment a = 34
After increment a = 35
Decrement:
Before decrement a = 35
After decrement a=34
按位运算符
二进制运算符也称为按位运算运算符。它用于以位级别操作数据。按位运算符不能用于float和double数据类型。下表显示了所有按位运算运算符:
例子:
*ptr1 & *ptr2
*ptr1 | *ptr2
*ptr1 ^ *ptr2
让我们通过给定的代码了解概念:
// Program showing pointer expressions
// during Bitwise Operations
#include
int main()
{
// Declaring integer variable for
// storing result
int and, or, ex_or;
// Initializing integer variable
int a = 1, b = 2;
// Performing bitwise operations
// AND operation
and = a & b;
// OR operation
or = a | b;
// EX-OR operation
ex_or = a ^ b;
// Printing result of operations
printf("\na AND b = %d", and);
printf("\na OR b = %d", or);
printf("\na Exclusive-OR b = %d", ex_or);
return 0;
}
a AND b = 0
a OR b = 3
a Exclusive-OR b = 3