指针的前加加和后加加运算

发布时间 2023-09-17 14:05:56作者: 奋斗的小仔

目录:

前加加和后加加

前加加和后加加的区别就是先自增还是先参与运算。顾名思义,后加加就是先参与运算,在进行自增。先加加就是先进行自增,再参与运算。

以下面的代码为例:

int i = 1, j = 1;
int num1 = 0, num2 = 0;
num1 = i++;  // 先赋值,再自增
num2 = ++j;  // 先自增,再赋值
printf("num1=%d\n", num1);
printf("num2=%d\n", num2);
printf("i=%d\n", i);
printf("j=%d\n", j);

它的输出结果是:

num1=1
num2=2
i=2
j=2

对于num1=i++,可以拆分为两步,第一步是i先参与赋值运算num1=i,第二步是i进行自增,i=i+1。所以,结果是num1=1i=2;
对于num2=++j,第一步是先进行自增j=j+1,第二步是参与运算num2=j。所以,结果是num2=2j=2
下面的例子同理:

int m = 1, n = 1;
printf("m++:%d\n", m++);  // 先输出,再自增
printf("++n:%d\n", ++n);  // 先自增,再输出
printf("m=%d\n", m);
printf("n=%d\n", n);

输出:

m++:1
++n:2
m=2
n=2

如果没有别的运算,只是单独的自增操作,那么前加加和后加加是一样,只是执行了自增操作。

int h = 1, k = 1;
h++;  // 自增
++k;  // 自增
printf("h=%d\n", h);
printf("k=%d\n", k);

输出:

h=2
k=2

*p++

因为`++`运算符的优先级要大于`*`运算符,等价于`*(p++)`。 但是这是后加加,有了上面的分析,我们可以知道,它会先进行`*`操作,取出指针的内容,然后再对指针进行自增。 以下面的代码为例: ``` int a[10] = {1, 2, 3, 4, 5, 6}; int *p = a; printf("此时p指向的地址是:%d\n", p); printf("*p=%d\n", *p); // p指向首元素的地址 printf("此时p指向的地址是:%d\n", p); // 便于观察,再次输出一次地址 printf("*p++=%d\n", *p++); // 输出的是首元素的内容,然后指针自增 printf("此时p指向的地址是:%d\n", p); // 指针已经完成了自增,地址改变 ``` 输出: ``` 此时p指向的地址是:7077360 *p=1 此时p指向的地址是:7077360 *p++=1 此时p指向的地址是:7077364 ``` 可以看到`*p++`的内容是1,然后指针进行了自增,因为`int`类型是4个字节,所以地址加的数是4。(指针是根据所指向的变量类型大小自增的,不是简单地加1。)

*++p

同理,因为`++`的优先级大于`*`,`*++p`等价于`*(++p)`。是前加加,这里就是先进行指针的自增操作,再取出指针指向地址的内容。 示例: ``` int a[10] = {1, 2, 3, 4, 5, 6}; int *p = a; printf("此时p指向的地址是:%d\n", p); printf("*p=%d\n", *p); printf("此时p指向的地址是:%d\n", p); printf("*++p=%d\n", *++p); // 指针自增,然后取值 printf("此时p指向的地址是:%d\n", p); ``` 输出: ``` 此时p指向的地址是:7077360 *p=1 此时p指向的地址是:7077360 *++p=2 此时p指向的地址是:7077364 ``` 可以看到`*++p`是2,同样指针也完成了自增的操作。

++*p

这个其实`++`操作的对象就不是指针了,因为`++`和指针`p`之间还有个`*`运算符。`++`是不能跳过这个`*`运算符对`p`进行操作的。`++`是对`*p`进行自增。等价于`++(*p)。`所以,我们只有知道`p`指向的地址里面存储的内容,再对它进行前加加操作。 示例: ``` int a[10] = {1, 5, 7, 8, 9, 11}; int *p = a; printf("此时p指向的地址是:%d\n", p); printf("*p=%d\n", *p); printf("此时p指向的地址是:%d\n", p); printf("++*p=%d\n", ++*p); // 取值,对取出来的值自增 printf("此时p指向的地址是:%d\n", p); ``` 输出: ``` 此时p指向的地址是:7077360 *p=1 此时p指向的地址是:7077360 ++*p=2 此时p指向的地址是:7077360 ``` 可以看到,`p`指向的地址始终都没用改变。

(*p)++

这里使用括号,提升了`*`运算符的优先级,就是先取值,然后对取出来的值进行后加加。未改变指针指向的地址。 ``` int a[10] = {1, 5, 7, 8, 9, 11}; int *p = a; printf("此时p指向的地址是:%d\n", p); printf("*p=%d\n", *p); printf("此时p指向的地址是:%d\n", p); printf("(*p)++=%d\n", (*p)++); // 注意是后加加,所以输出的是为自增的值 printf("此时p指向的地址是:%d\n", p); ``` 输出: ``` 此时p指向的地址是:7077360 *p=1 此时p指向的地址是:7077360 (*p)++=1 此时p指向的地址是:7077360 ```