C语言:复杂指针声明
本文最后更新于:2025年6月25日 上午
前言
指针是一种保存变量地址的变量,简单指针容易分析,但是当指针稍微复杂,就很容易无从下手,比如:
1 |
|
普通指针
1 |
|
输出如下:
1 |
|
- pa是指向int类型的指针,它的值是变量a的地址
- ppa是指向pa的指针(二维指针)
- 占位符 %p 对应指针变量的值
- &p指的是指针p在内存中的地址
前置知识
运算符结合顺序
结合的优先级由大到小:
()
>[]
>*
著名的右左法则:先看最里面的括号,再看右边,再看左边。每当你遇到括号,你应该改变你的阅读方向。解析完括号内的所有内容后,跳出括号。重复此过程,直到解决整个语句。
Right-Left Rule: First look at the innermost parenthesis, then look to the right, and then to the left. Whenever you encounter parentheses, you should switch your reading direction. Once you have parsed everything inside the parentheses, jump out of the parentheses. Repeat this process until the entire statement is resolved.
参考:c pointer right and left rule
函数指针
函数指针是指向函数的指针变量
1 |
|
- p是函数指针
- 参数为(int,int),返回值为int
- 此后p相当于max,p(a,b)相当于max(a,b)
#复杂指针分析
int* f();
- 由上述结合顺序得,f先和()结合
- f 是一个函数 ,它的返回值是int* 类型,也即是指向int 类型的指针
int (* f)();
- 由于()的存在,f先和*结合,再和右侧的()结合
- f是一个函数指针,它指向的函数的返回值是int类型
- 程序中的每个函数都位于内存中的某个位置,所以存在指向那个位置的指针
int* (* f)();
- f是一个函数指针
- 它指向的函数的返回值是指向int类型的指针
int *f[]
- f是一个数组,该数组每个元素都是指向int类型的指针
int (*f)[10]
- f是一个指针
- 指向一个int类型的数组,该数组有十个int类型的值
int ** f
可以参考【C语言指针】char* argv[] 、char **argv、命令行传参
int (*f[])();
- f是一个数组
- 数组元素的类型是函数指针
- 函数的返回值是一个整型值
int *(*f[])();
- f是一个数组
- 数组元素的类型是函数指针
- 函数的返回值是指向 int 类型的指针
int (*(*(*pfunc)(int *))[5])(int *)
- pfunc是一个函数指针
- 函数的参数是指向int类型的指针
- 函数的返回值是一个指针,指向一个具有五个元素的数组,该数组的每一个元素都是一个指针
- 此指针指向一个函数,该函数的参数为int * ,返回类型为int
void (*signal(int sig, void (*func)(int)))(int);
- 简化声明
void (*signal(int sig, func))(int);
void (*)(int);
- signal 是一个函数
C语言:复杂指针声明
http://gls.show/p/279b9795/