今天来讲讲 *p , (*p)++,*p++,*(p++),++*p
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(){
int arr[5] = { 1, 2, 3, 4, 5 };
int *p = arr;
printf("%d\n", *p);
printf("%d\n", *(p++));
printf("%d\n", *p++);
printf("%d\n", (*p)++);
printf("%d\n", ++*p);
return 0;
}
我们先了解一下优先级,
tip1:*与++的优先级是相同的,他们的优先级都是自右向左
tip2:()的优先级比*与++高
优先级,结合性分析:
*p++ 由(tip1)知,p先与++结合,再与*结合,而是后置+,所以先用后加,先解引用p,打印这个数,然后指针+1
*(p++) 由(tip2)知,(p++)先结合,再与*结合,还是后置加,所以先用后加,先解引用p,然后指针+1;
结论:*p++等价于*(p++)
变量分析:
*(p++): 由(tip2)知道++和p结合,变量是p,p++,指针+1;
(*p)++ :括号的的优先级高,p先和*结合,得到*p,再++,*p是变量。
得出(*p)++:是对指针所指向数据进行+1操作
总结:
1,*(p++): 取出*p所指向的数据之后,p++,指针+1;
2,*p++: 同上
3,++*p: 解引用p,找到p指向的值,再进行+1操作,对值+1
4,(*p)++: 括号的优先级高,先和()结合,解引用p找到p指向的值,对值进行+1
本代码解释:
1,printf("%d\n", *p);
第一个,arr的首地址放到了,指针变量p中,*p解引用,找到数组的第一个元素
2,printf("%d\n", *(p++));
(p++),先结合,因为是后置+,先用后加,解引用p之后,指针p+1;
3,printf("%d\n", *p++);
和第二个一样 ,右结合,先和++结合,因为是后置+,所以先用后加,解引用p后,指针+1;
4,printf("%d\n", ++(*p));
括号优先级高,(*p)先结合,解引用找到了,一个值,然后对值+1;
5,printf("%d\n", ++*p);
*与++的优先级是一样的,结合性是从右向左,所以先解引用p,找到一个值,再对值+1;
完结