c - 我如何理解复杂的函数声明?

标签 c pointers declaration

我如何理解以下复杂的声明?

char (*(*f())[])();

char (*(*X[3])())[5];

void (*f)(int,void (*)()); 

char far *far *ptr;

typedef void (*pfun)(int,float);

int **(*f)(int**,int**(*)(int **,int **));

最佳答案

正如其他人所指出的,cdecl 是完成这项工作的正确工具。

如果您想在没有 cdecl 帮助的情况下理解这种声明,请尝试从内向外从右向左阅读

从列表中随机抽取一个示例 char (*(*X[3])())[5];
从 X 开始,这是正在声明/定义的标识符(也是最里面的标识符):

char (*(*X[3])())[5];
         ^

X是

X[3]
 ^^^

X 是 3 的数组

(*X[3])
 ^                /* the parenthesis group the sub-expression */

X 是一个包含 3 个 指向

的指针的数组
(*X[3])()
       ^^

X 是一个包含 3 个指针的数组 接受未指定(但固定)数量的参数的函数

(*(*X[3])())
 ^                   /* more grouping parenthesis */

X 是一个包含 3 个函数指针的数组,函数接受未指定(但固定)数量的参数 并返回一个指针

(*(*X[3])())[5]
            ^^^

X 是一个包含 3 个指针的数组,该函数接受未指定(但固定)数量的参数并返回一个指针 指向一个包含 5 个数组的数组

char (*(*X[3])())[5];
^^^^                ^

X 是一个包含 3 个函数指针的数组,该函数接受未指定(但固定)数量的参数并返回一个指向 5 char 数组的指针。

关于c - 我如何理解复杂的函数声明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1448849/

相关文章:

char * 在一个结构中,指向一个 char 数组,然后使用 strncpy。试图避免动态分配的内存

c++ - 为什么我不能如下设置接口(interface)类的成员变量

c - 函数声明中的数组大小

typescript - TS4023 : Exported Variable <x> has or is using name <y> from external module but cannot be named

c - 调用 fcntl() 的目的是什么,文件描述符为 -1,cmd 为 F_GETFL?

使用 yes 或 no 调用函数

c - 为什么 copy_to_user 打印的结果不正确?

c++ - 将 libpcap 数据包数据从 const u_char* 复制到另一个 const u_char*

c - 将变量引用到现有数组

c++ - 为什么这是按值调用,尽管我传递的是指针?