390 字
1 分钟
【C】右左定则
定义
右左法则:从未定义的标识符(要解析的名字)出发,先看它外面的括号,再向右看,再向左看。每遇到一对括号,就调换阅读方向;括号内全部解析完后,跳出该括号,重复直到整个声明读完。
用于读懂函数指针、数组指针、多级指针等复杂声明。
应用示例
1. 函数指针
int (*func)(int *p);- 找到
func,外层有()且左侧有*,故func是指针 - 跳出括号,右侧是
(int *p),说明指向函数,参数为int*,返回int - 结论:
func是「指向int func(int*)这类函数的指针」
2. 嵌套函数指针参数
int (*func)(int *p, int (*f)(int *));func仍是函数指针;第二个参数f也是int (*)(int*)类型的函数指针
3. 指针数组 + 函数指针
int (*(*func)[5])(int *p);func被()和左侧*包围 → 指针- 右侧
[]→ 指向数组 - 再向左
*→ 数组元素是指针 - 再向右
()→ 指向函数,参数int*,返回int
结论:func 是指向「长度为 5 的数组」的指针,数组每个元素是「int (*)(int*)」类型的函数指针。
与常见类型对照
| 声明 | 读法 |
|---|---|
int *p | p 是指向 int 的指针 |
int *p[5] | p 是含 5 个元素的数组,元素类型为 int* |
int (*p)[5] | p 是指向「含 5 个 int 的数组」的指针 |
int (*fp)(void) | fp 是指向「无参、返回 int 函数」的指针 |
int *f(void) | f 是函数,返回 int*(* 优先绑定函数名) |
更多指针种类见 11-指针进阶。
分享
如果这篇文章对你有帮助,欢迎分享给更多人!
部分信息可能已经过时
相关文章 智能推荐
