在定义指针的时候可能遇到层层嵌套的定义,有时候一眼看上去无法判断,可以根据以下步骤从内层一层一层进行判断:
1.首先找到定义的标识符(即变量名);
2.根据标识符左右两边的运算符的优先级和结合性进行一层一层的划分,用括弧标出来。*结合的第一个标识符决定了定义的指针总体类型。如int (*(p[n]))就是一个数组 int (*(p()))就是一个函数;
3.然后从第一层开始用手去掉最内层的*结合的第一个标识符(可能就是这个标识符,也可能由于标识符右侧出现优先级高于解引用运算符而是其他的一个整体)然后剩下的就是这个标识符的指针类型(即这个标识符内存储的就是余下部分的数据类型的地址)。
下面是一些常用的指针类型:
int *p 等价于 int (*p) 所以p是指向int类型的指针
int *p[n] 等价于 int (*(p[n])) 所以p[n]是指向int类型的指针,p是指向int类型的指针的数组(即这是一个存储int类型指针的数组)
int (*p)[n] 等价于 int ((*p)[n]) 所以p是指向 int [n]数据类型的指针,即存储的是一个一维数组的首地址
int *p() 等价于 int (*(p())) 所以p()的返回值是一个指向int类型的指针(即这是一个返回值为int类型指针的函数)
int (*p)() 等价于 int ((*p)()) 所以p是一个指向in ()t类型的指针,即存储的是一个返回值为int类型的函数的地址(即函数指针)
int **p 等价于 int (*(*p)) 所以p是一个指向int *类型的指针,即是一个int类型指针的指针,存储的是一个int类型指针所在的地址。