C void(**f[])()())将f定义为未指定大小的数组。。。这意味着什么?

C void(**f[])()())将f定义为未指定大小的数组。。。这意味着什么?,c,C,void(**f[])()()将f定义为一个未指定大小的函数指针数组,指向返回void的函数的指针 这在非常简单的解释中意味着什么如果有疑问,键入def: typedef void (*f1)(); // pointer to function returning void typedef f1 (*f2)(); // pointer to function returning f1 f2 f[]; // your array (not valid C!)

void(**f[])()()
f
定义为一个未指定大小的函数指针数组,指向返回
void
的函数的指针

这在非常简单的解释中意味着什么

如果有疑问,键入def:

typedef void (*f1)();  // pointer to function returning void
typedef f1 (*f2)();    // pointer to function returning f1

f2 f[];                // your array (not valid C!)
最终定义无效,因为
f[]
是不完整的类型,您只能定义完整类型的对象。不是定义的声明是可以的(
extern f2 f[];
),或者可以通过从带括号的初始值设定项列表中暗示数组大小来获得完整的类型,如
f2 f[]={A,b,c},在这种情况下,
f
具有(完整)类型
f2[3]

请注意,上面的typedef代码包含与您的声明相同数量的左括号、右括号、方括号和星号。

我不知道它是否简单,但
cdecl(1)
可以为您将其分开:

cdecl>解释无效(**f[])()
将f声明为指向返回void的函数指针的指针数组


(不使用代码格式,因为它引入了讨厌的水平滚动条和那条长长的描述性线条。)

想象一下,您有一个函数,我们称它为
a()
,它返回void

a()
在内存中有一个地址

现在假设您有一个函数
pa()
,它返回指向
a()
的指针,即
pa()
返回
a()的地址

现在,您不仅有一对这样的函数,还有几个:

  • b()
    返回void,
    pb()
    返回
    b()的地址。

  • c()
    返回void,
    pc()
    返回
    c()的地址

等等

现在,您希望将
pa()
pb()
pc()
等的地址存储在一个数组中,但您还不知道其中有多少地址,因此您声明了一个未指定大小的数组来保存所有这些地址


该数组的类型是指向函数的指针数组,该函数返回指向返回void的函数的指针

用非常简单的术语来说,这意味着你需要找到一种不同的、更简单的方式来表达这一切。你不可能简化这个解释而不出错。我需要理解它,每次想到它我的大脑都会陷入一个循环…@SteveJessop:我希望我能撤销那些日子里所有的评论。我不知道任何C或C++然后:(@ Salnod:我更新了帖子,包括了为什么代码不好的讨论。