深入理解C语言的指针

一、指针的优先级

括号()的优先级最高,其次是数组[],然后是剩余的*,最后是类型。指针p与优先级高的先结合,对于比较复杂的指针,结合后就视为一个整体temp,然后再与剩下的结合进行分析,慢慢看例子就明白了。

如:(这些例子也不用全部看懂,这里知道优先级就行,然后看了后面的内容再返回来看这些例子,就会容易得多)

int p;				// p是一个普通的int型变量
int *p;				// p先与*结合,后与类型结合,所以p是一个指针,指针指向的内容是int型
int p[3];			// p先与[]结合,然后与类型结合,说明p是一个数组,数组里面的内容是int型
int *p[3];			// p先与[]结合,说明p是一个数组,然后再与*结合,说明数组p里面存放的是指针,然后与类型结合,说明指针指向的内容是int型,p是一个由返回整型数据的指针所组成的数组
int (*p)[3];		// ()的优先级最高,(*p)说明p是一个指针,然后与数组[3]结合,说明指针指向的是大小为3的一个数组,然后与类型结合,说明指针所指向的数组里面的内容为int型,p是一个指向由整型数据组成的数组的指针
int **p;			// p先和最近的*结合,说明p是一个指针,然后再与剩下的*结合,说明指针p指向的是一个指针,然后与int结合,说明指针p所指向的指针(*p)所指向的内容(**p)为int型
int p(int);			// p先于(int)结合,说明这是一个函数,函数的参数为int型,然后与外面的int结合,说明函数返回的内容是int型
int (*p)(int);		// ()的优先级最高,(*p)说明p是一个指针,然后与(int)结合,说明指针所指向的内容是函数,函数的参数为int型,然后与外面的int结合,说明指针p所指向的内容(*p)是一个函数,该函数的返回内容为int型
int *(*p(int))[3];	// 一层一层的剥开,p首先与(int)结合,说明p是一个函数(这里说了p是一个函数),函数的参数为int型,然后与*结合,说明函数返回的是一个指针,然后与数组[3]结合,说明是返回的指针指向的是一个数组,然后与*结合,说明数组里面的内容是指针,然后与外面的int结合,说明数组里面的指针指向的内容是int型。所以p是一个参数为int型并且返回的是一个指向内容为int*型的数组的函数,由于int*是指针,指针指向的内容为int型,所以p返回的就是一个指向内容为指向内容为int型的指针的数组的函数(太绕了,注意段句)。
int *(*p(int))[3];	// 这个过于复杂,再来一遍
// 括号里面的内容是一个整体,直接把(*p(int))替换为ptr,那么表达式就变成了
int *ptr[3];		// 这就简单多了,通过上面的例子可以知道,ptr是一个数组,数组里面的内容为指针,指针指向的内容为int型,即ptr是一个内容为指向内容为int型的数组
*p(int);			// 同样通过上面的例子可以知道p是一个函数,函数的参数为int型,函数的返回内容是指针
// 下面就把他们结合起来
int *(*p(int))[3];	// p是一个函数,函数的参数为int型,函数的返回内容是一个指针,该指针指向的内容是一个数组,数组里面的内容为指针(该指针指向的内容为int型)

二、指针的类型

看一个指针的类型,直接把指针的名字去掉,剩下的就是指针的类型。

如:

int p;				// 去掉p,p是一个普通的int型变量
int *p;				// 去掉p,说明指针的类型是int *型
int p[3];			// 去掉,说明p的类型为int [3],是一个普通的数组
int *p[3];			// 去掉p,说明指针的类型是int *[3]型
int (*p)[3];		// 去掉p,说明指针的类型是int (*)[3]型
int **p;			// 去掉p,说明指针的类型是int **型
int p(int);			// 去掉p,剩下int (int),是一个普通的函数
int (*p)(int);		// 去掉p,说明指针的类型是int (*)(int)型
int *(*p(int))[3];	// 去掉p,说明指针的类型是int *(*(int))[3]型

三、指针所指向的类型

要知道指针所指向的类型,把指针的名字和*去掉,剩下的就是指针所指向的类型。注意优先级

int *p;				// 去掉p和*,说明指针所指向的类型是int型
int *p[3];			// 因为[]的优先级高,所以p先和[3]结合,说明p是一个数组,再与*结合,说明这是一个指针数组,所以这里首先将p[3]去掉,然后再去掉*,剩下int,所以指针数组p[3]里面的元素所指向的内容为int型
int (*p)[3];		// 去掉p和*,说明指针所指向的类型是int [3]型,所以指针p指向的是大小为3的int型数组
int **p;			// 去掉p和*,说明指针所指向的类型是int *型
int (*p)(int);		// 去掉p和*,说明指针所指向的类型是int (int)型,所以指针p指向的是参数为int的函数,函数的返回类型为int型
int *(*p(int))[3];	// 因为()优先级高,p和(int)结合,说明p是一个函数,然后与*结合,说明函数的返回类型是一个指针,所以这里应该直接把(*p(int))去掉,剩下int *[3],所以函数p返回的是一个指向int *[3]型的指针

四、指针的值

指针的值就很简单了,指针本身的值就是一个地址,在32 位程序里,所有类型的指针的值都是一个 32位整数。在分析一个指针的时候应该分析指针的类型是什么?该指针指向了哪里?指针指向的是什么类型的数据?

五、参考资料

让你不再害怕指针

猜你喜欢

转载自blog.csdn.net/qq_43715171/article/details/121876203