我刚刚在网上浏览了一些代码,发现:

float * (*(*foo())[SIZE][SIZE])()

我如何阅读这份声明?对于阅读这样复杂的声明,是否有一套特定的规则?

推荐答案

我好久没这么做了!

foo开始,然后向右转.

float * (*(*foo())[SIZE][SIZE])()

foo是一个没有参数的函数...

不能向右走,因为有一个右括号.向左走:

float * (*(* foo())[SIZE][SIZE])()

foo是一个没有返回指针的参数的函数

不能再往左走了,让我们穿过括号再往右走

float * (*(* foo())[SIZE][SIZE])() float * (*(* foo())[SIZE][SIZE])() float * (*(* foo())[SIZE][SIZE])()

foo是一个没有返回指针的参数的函数 to an array of SIZE arrays of SIZE ...

到达右括号,再次向左到达指针符号:

float * (*(* foo())[SIZE][SIZE])()

foo是一个没有返回指针的参数的函数 to an array of SIZE arrays of SIZE pointers to ...

又是左括号,所以我们穿过它,再向右走:

float *( *(* foo())[SIZE][SIZE])() float *( *(* foo())[SIZE][SIZE])()

foo是一个没有返回指针的参数的函数 to an array of SIZE arrays of SIZE pointers to a function with no arguments...

直到最后

float * ( *(* foo())[SIZE][SIZE])()

foo是一个没有返回指针的参数的函数 to an array of SIZE arrays of SIZE pointers to a function with no arguments returning a pointer to float


不管是谁写的,请教他用typedef:

// Function that returns a pointer to float
typedef float* PFloatFunc ();

// Array of pointers to PFloatFunc functions
typedef PFloatFunc* PFloatFuncArray2D[SIZE][SIZE];

// Function that returns a pointer to a PFloatFuncArray2D
PFloatFuncArray2D* foo();

C++相关问答推荐

函数指针始终为零,但在解除引用和调用时有效

rSP堆栈指针在返回函数调用的值时有任何用途吗?

警告:C++中数组下标的类型为‘char’[-Wchar-subpts]

ATmega328P EEPROM未写入

在C++中访问双指针

防止规范模式在C++中 echo 特殊字符

等同于铁 rust 的纯C语言S未实现!()宏

如何使用FSeek和文件流指针在C中查找文件的前一个元素和前一个减go 一个元素

通过对一个大的Malloc内存进行切片来使用Malloc的内存片

从另一个宏函数调用C宏

Linux Posix消息队列

在我的函数中实现va_arg的问题

在哪里可以找到叮当返回码的含义?

访问未对齐联合的成员是否为未定义行为,即使被访问的成员已充分对齐?

C Makefile - 如何避免重复提及文件名

C 语言中霍尔分区的快速排序算法

在链表中插入一个值

在 C23 之前如何对空指针使用nullptr?

为什么使用 C 引用这个 char 数组会导致 Stack smasing?

如何确定 C 程序中的可用堆内存