身为c语言小白,看如下小例:
/* 指针运算中的优先级*/
#include<stdio.h>
int data[2] = {100,200};
int moredata[2] = {300,400};
int main(void){
int *p1,*p2,*p3;
p1 = p2 = data;
p3 = moredata;
printf("*p1 = %d,*p2 = %d,*p3 = %d\n", *p1,*p2,*p3);
printf("*p1++ = %d,*++p2 = %d,(*p3)++=%d\n", *p1++,*++p2,(*p3)++);
printf(" *p1 = %d,*p2 = %d,*p3=%d\n", *p1,*p2,*p3);
return 0;
}
结果是什么,不妨先想一下 ~~~~~ 一连串苦思冥想状】
然后运行结果如下:
*p1 = 100,*p2 = 100,*p3 = 300
*p1++ = 100,*++p2 = 200,(*p3)++=300
*p1 = 200,*p2 = 200,*p3=301
和你想的一样么?反正当初和我的不一样。。。一阵操作猛如虎,再看人头0-5。。。
为什么 *p1++ 不是101 ??? 为什么 ++p2 是200 ,(p3)++是300?
其实这就是优先级的问题和对指针的理解了:
1, * 和自增++ 优先级一致。
2, p1 p2 p3是指针。
3,表达式的值就是*地址 取出的值== 这点很重要!
那么*p1++ 正确的理解应是 先是计算*p1 取p1里的值100作为表达式的值,然后 p1向后移动1个自身长度的偏移量,也就是指向下一个地址。所以第二个printf输出的*p1++的值依旧是100 ,而到了第三个printf时,此时p1已经指向了下一个地址 ,所以此时取值得到200.
同理,*++p2 先是++p2 也就是将p2指向下一个地址,然后*p2 取值,得到data[1] 也就200,所以第三个printf打印*p2的值就是200.
其实比较难理解的是(*p3)++ 为什么是300 而不是301呢?根据我们前边说的 表达式的值 就是看*取的哪个地址的值。这里(*p3)取得就是p3此时对应的值也就是300 ,所以表达式的值就是300,这之后实际变为了(300)++ 变为301, 存入p3.所以第三个printer打印出的*p3的值是301.
所以再回头理解一遍:
*p1++ : *取的是哪个地址里的值呢 是p1的 所以表达式值为100,然后p1++运算,p1指向下一个地址。
*++p2:*取得哪个地址里的值呢?是++p1里的值,那么就是p1指向下一个地址 里面存在的值 也就是200了。
(*p3)++:*取得哪个地址里的值呢?是p3里的值,所以就是300,然后(300)++ 存入p3.
不知道 我理解的对不对,解释的对不对。
我小白一枚,望高手指教指点~不胜感激呀。
网友评论