*p是取p指针所指向的内存内容
*p++是分两个部分的:先取指针内容,再移动指针
而结合具体的代码,移动指针是在本代码之后进行的:
对于第一题来说,当执行时*p++本身的值为a[1]的内容,然后执行p++后指向a[2],所以再取*p的值时,值为30
a[1]=20;a[2]=30;
p=&a[1]//指向a1
c=*p++;//执行*p++时,它的值c应该是20,此语句运行完成后,p批向a2
d=*p;//已经指向a2,所以d的值为30
而第二题来说,可以分成这两步:printf("%d",*p); p++
所以它在执行时,1肯定也是被执行的。因为第一次运行printf语句时,p是指向a【0】的
我觉得这样的问题就是为难初学者,看多了就明白了
先搜一下运算符的优先级 * 小于++ ,所以p++ 指向了a[2]
自增自减 运算符 有一个规律 先执行后运算
先直线printf("%d",*p) 然后运输p++;
你可以搞一个简单的 例如 j=0;
printf("%d",j++);也就明白了先执行后运算这句话了.
如果单独一句 *p++; 那么确实*p的值变成30。
但是for循环里的printf()中的*p++,它的默认操作是先取*p的值,执行完printf("%d",*p); 再执行p++;