390 字
1 分钟
【C】右左定则
2026-05-19

定义#

右左法则:从未定义的标识符(要解析的名字)出发,先看它外面的括号,再向右看,再向左看。每遇到一对括号,就调换阅读方向;括号内全部解析完后,跳出该括号,重复直到整个声明读完。

用于读懂函数指针、数组指针、多级指针等复杂声明。

应用示例#

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 *pp 是指向 int 的指针
int *p[5]p 是含 5 个元素的数组,元素类型为 int*
int (*p)[5]p 是指向「含 5 个 int 的数组」的指针
int (*fp)(void)fp 是指向「无参、返回 int 函数」的指针
int *f(void)f 是函数,返回 int*(* 优先绑定函数名)

更多指针种类见 11-指针进阶

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

【C】右左定则
https://lysj.work/posts/studynotes/c/c右左定则/
作者
Sekiro
发布于
2026-05-19
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

目录