关于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型的指针的数组的函数(太绕了,注意段句)
。
1
2
3
4
5
6
7
8
9
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型) 1 2 3 4 5 6
二、指针的类型
看一个指针的类型,直接把指针的名字去掉,剩下的就是指针的类型。
如:
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]型 1 2 3 4 5 6 7 8 9
三、指针所指向的类型
要知道指针所指向的类型,把指针的名字和*去掉,剩下的就是指针所指向的类型。注意优先级。
如
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]型的指针 1 2 3 4 5 6
四、指针的值
指针的值就很简单了,指针本身的值就是一个地址,在32 位程序里,所有类型的指针的值都是一个 32位整数。在分析一个指针的时候应该分析指针的类型是什么?该指针指向了哪里?指针指向的是什么类型的数据?
原文链接:https://blog.csdn.net/qq_43715171/article/details/121876203