C语言复杂指针解析:右左法则

右左法则不是C标准里面的内容,它是从C标准的声明规定中归纳出来的方法。C标准的声明规则,是用来解决如何创建声明的,而右左法则是用来解决如何辩识一个声明的,两者可以说是相反的。

右左法则原文:

The right-left rule:Start reading the declaration from the innermost parentheses,go right,and then go left.When you encounter parentheses(圆括号), the direction should be reversed.Once everything in the parentheses has been parsed, jump out of it.Continue till the whole declaration has been parsed.

右左法则含义:首先从最里面的圆括号开始阅读,首先向右看,再往左看。每当遇到圆括号时,就应该调转阅读方向。一旦解析完圆括号里面所有东西,就跳出圆括号。重复整个过程直到整个声明解析完成。

  • 遇到 [] 是数组,数组里面存的是什么,有多少元素;
  • () 是函数,函数的入参是什么,返回值是什么;
  • * 是指针,指针指向了什么,指向了数组的话,数组里面有多少元素,指向了函数的话(函数指针)入参和返回值分别是什么;

按照 右左法则(Right-Left Rule)逐一解析:


✅ 示例 1:int *p[5];

含义:

p 是一个包含 5 个元素的数组,每个元素是 int 指针。

解析:

  1. p 开始;
  2. 右边有 [5] → 是个数组;
  3. 左边有 * → 是指针;
  4. 所以 p 是一个指针数组:每个元素是 int*

✅ 示例 2:int (*p)[5];

含义:

p 是一个指针,指向一个包含 5 个 int 的数组。

解析:

  1. (*p) 括号先看 → p 是一个指针;
  2. 外部 [5] 是数组;
  3. 所以:p 指向 int[5]

✅ 示例 3:int *(*p)[5];

含义:

p 是一个指针,指向一个有 5 个元素的数组,每个元素是 int*

解析:

  1. (*p)[5]p 是一个指向数组的指针;
  2. * → 每个元素是 int*
  3. 所以:pint*[5] 的指针。

✅ 示例 4:int (*f(int))[10];

含义:

f 是一个函数,接受一个 int 参数,返回一个指针,指向包含 10 个 int 的数组。

解析:

  1. f(int) → 是函数;
  2. 返回 (*...)[10] → 是数组指针;
  3. 所以:f 返回 int[10] 的指针。

✅ 示例 5:int *(*fp)(int);

含义:

fp 是一个指针,指向一个函数,该函数接受一个 int 参数,返回一个 int*

解析:

  1. (*fp) → 是函数指针;
  2. (int) → 函数参数;
  3. 返回值是 int*

✅ 示例 6:int (*a[3])(double);

含义:

a 是一个数组,包含 3 个元素,每个元素是一个函数指针,该函数接受一个 double 参数,返回 int

解析:

  1. a[3] → 是数组;
  2. (*a[3]) → 数组中的元素是函数指针;
  3. (double) → 函数参数;
  4. 所以:a 是函数指针数组。

✅ 示例 7:int (*(*x)(void))[3];

含义:

x 是一个函数,接受无参数,返回一个指针,指向包含 3 个 int 的数组。

解析:

  1. x(void) → 是函数;
  2. 返回 (*...)[3] → 数组指针;
  3. 所以:x 是函数,返回 int[3] 的指针。

✅ 示例 8:int *const *p;

含义:

p 是一个指针,指向一个常量指针,后者指向 int

解析:

  1. *const → 常量指针;
  2. 外面还有 *p 指向常量指针;
  3. 所以:pint* const 的指针。

✅ 示例 9:const int *p;

含义:

p 是一个指针,指向 const int(不能通过 p 修改所指内容)。

解析:

  1. const int 是被修饰类型;
  2. *pp 是指针;
  3. 所以:pconst int 的指针。

✅ 示例 10(挑战级):int (*signal(int, int (*)(int)))(int);

含义:

signal 是一个函数,它接受两个参数:

  • 一个 int
  • 一个函数指针,该函数接受一个 int 参数并返回 int

整个 signal 函数返回一个函数指针:这个函数也接受 int 参数并返回 int

解析:

  • signal(...) → 是一个函数;
  • 参数:
    • int
    • int (*)(int) → 函数指针;
  • 返回值是:(*...)(int) → 函数指针;
  • 所以:signal 返回函数指针:int f(int)

👉 这是 Unix 系统中 signal 函数的声明,常见于 <signal.h>

posted @ 2025-06-14 15:24  aixueforever  阅读(46)  评论(0)    收藏  举报