C语言指针——你必须明白的几个指针!!!

Source

今天来讲讲     *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;

 完结