一、定义两个指针变量p和q,q=p++的结果会如何?是p先做自增,再将值赋给q,还是p先将值赋给q,然后再自增?
为了验证这个结果,我们可以写一个简单程序:
#include <stdio.h>
int main() {
int a[] = {6, 8, 10};
int *p = a;
int *q;
printf("p=%p *p=%d\n", p, *p);
q = p++;
printf("p=%p *p=%d\n q=%p *q=%d\n", p, *p, q, *q);
return 0;
}
先定义一个一维数组a和两个指针变量p和q,并将a的首地址赋给p,先输出p和*p的值,也就是数组a的首地址,接着做q=p++,再输出p、*p和q、*q的值,与之前p和*p的值做比较。结果如下:
p=0xbfa4f1c4 *p=6
p=0xbfa4f1c8 *p=8
q=0xbfa4f1c4 *q=6
从运行结果可以看到,p的值增加了4,刚好是int型变量的长度,也就是指针p在数组中所值的对象从第一个数6变成了第二个数8,而q的值等于原来p的值,指向的也是原来p所指向的值6。
因此,q=p++这个表达式中,是p的值先赋给了q,然后再将p++的值赋给p。其实++后置运算符起的作用,先进行赋值运算,再进行自增运算。
二、*p++ = 3的结果又如何?这个3到底是赋给了谁?
还是通过一个简单的程序来解决这个问题:
#include <stdio.h>
int main() {
int a[] = {6, 8, 10};
int *p = a;
printf("before p=%p\n", p);
*p++ = 3;
printf("after p=%p\n", p);
printf("after:%d %d %d\n", a[0], a[1], a[2]);
return 0;
}
在这个程序中,定义了一个数组a和一个指针变量p,并将a的首地址赋给了指针p,第一个printf函数输出的就是数组a的首地址。
进行*p++=3运算之后,输出的结果如下:
before p=0xbfdcada4
after p=0xbfdcada8
after:3 8 10
经过运算之后,p的值增加了4,就是一个int型数的长度,a[0]的值变成了3,由此可知,是先将3这个值赋给了p指向的a[0],然后进行p++,并赋给p,使p的指向向前一个数据,变成a[1]。这个例子中,还是++后置运算符的作用,先进行了赋值运算,在进行自增运算。
指针的自增和自减运算有很多值得注意的地方,千万要谨慎,以免犯错。