复杂指针的声明

一个整型数

int a;

一个指向整型数的指针

int *a;

一个指向指针的指针,它指向的指针是指向一个整型数的

int **a;

一个有10个整型数的数组

int a[10];

一个有10个指针的数组,该指针是指向一个整型数的

int *a[10];

一个指向有10个整型数数组的指针

int (*a)[10];

一个指向函数的指针,该函数有一个整型参数并且返回一个整型数

int (*a)(int);

一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并且返回一个整型数

int (*a[10])(int);

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

这里对这个法则进行一个小小的修正,应该是从未定义的标识符开始阅读,而不是从圆括号读起。这是因为一个声明里面未定义的标识符只会有一个。

现在通过几个例子来讨论如何运用右左法则解读复杂指针声明。

int (*func)(int *p)

首先找到那个未定义的标识符func,它的外面有一对圆括号,而且左边是一个*号,这说明func是一个指针;然后跳出这个圆括号,先看右边,也是一个圆括号,这说明(*func)是一个函数,而func是一个指向这类函数的指针,就是一个函数指针,这类函数具有int*类型的形参,返回值类型是int。

int (*func)(int *p, int (*f)(int *));

func被一对括号包含,且左边有一个*号,说明func是一个指针,跳出括号,右边也有一个括号,那么func是一个指向函数的指针,这类函数具有int*和int (*)(int*)这样的形参,返回值类型为int类型。再来看一看func的形参int (*f)(int *),类似前面的解释,f也是一个函数指针,指向的函数具有int*类型的形参,返回值为int。

int (*func[5])(int *p);

func右边是一个[]运算符,说明func是一个具有5个元素的数组;func的左边是一个*,说明func的元素是指针。要注意这里的*不是修饰func的,而是修饰func[5]的,原因是[]运算符优先级别比*高,func先跟[]结合,因此*修饰的是func[5]。跳出这个括号,看右边,也是一对圆括号,说明func数组的元素是函数类型的指针,它所指向的函数具有int*类型的形参,返回值类型为int。

int (*(*func[5]))(int *p);

func被一个圆括号包含,左边又有一个*,那么func是一个指针;跳出括号,右边是一个[]运算符号,说明func是一个指向数组的指针。现在往左看,左边有一个*号,说明这个数组的元素是指针;再跳出括号,右边又有一个括号,说明这个数组的元素是指向函数的指针。总结一下,就是:func是一个指向数组的指针,这个数组的元素是函数指针,这些指针指向具有int*类型的形参,返回值为int类型的函数。

int (*(*func)(int *p))[5];

func是一个函数指针,这类函数具有int*类型的形参,返回值是指向数组的指针,所指向的数组的元素具有5个int元素的数组。

相关推荐

  1. 复杂指针声明

    2023-12-18 05:56:01       35 阅读
  2. C/C++ 容易混淆指针声明总结

    2023-12-18 05:56:01       29 阅读
  3. C++之类声明

    2023-12-18 05:56:01       31 阅读
  4. SQLitePRAGMA 声明

    2023-12-18 05:56:01       12 阅读
  5. 使用C++播放声音完整指南

    2023-12-18 05:56:01       32 阅读
  6. 声明理解【gpt】

    2023-12-18 05:56:01       41 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-18 05:56:01       14 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-18 05:56:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-18 05:56:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-18 05:56:01       18 阅读

热门阅读

  1. 安装Docker

    2023-12-18 05:56:01       46 阅读
  2. 测试:Selenium相关问题

    2023-12-18 05:56:01       33 阅读
  3. 【深入pytorch】transforms.functional 梯度流动问题

    2023-12-18 05:56:01       43 阅读
  4. CAD VBA 导出cass扩展数据到excel

    2023-12-18 05:56:01       43 阅读
  5. Skywalking告警规则示例

    2023-12-18 05:56:01       35 阅读
  6. C#实现一个安全的事件订阅器

    2023-12-18 05:56:01       37 阅读