C语言中的函数指针数组

3
我有这样一种定义。
int (*af[10])(int , *a[10][10])(int,int)

我需要像这样“这是指向函数数组大小为10的指针”来“翻译”它。我认为这里有一个错误,因为*a[10][10]没有定义类型。这正确吗?或者这行可以正确地翻译吗?
谢谢您提前的帮助。
最后我发现正确的定义应该像这样。
int (*af[10])(int ,int (*a[10][10])(int,int))

正确且合乎逻辑。

这是一个语法错误,因为第二个数组缺少定义类型或者其他原因。 - yakamuki
看起来是一个指向返回函数指针的函数指针。可以这样理解:"如果我取出 af,在 0 到 9 的范围内给它一个索引,然后解除引用,并使用两个参数(其中一个可能会拼写错误)调用结果,再使用两个 int 参数调用结果,那么我就得到了一个 int 值"。 - gnasher729
@yakamuki a的类型不完整。 - Lee Duhem
1
对于类似的问题,可以参考 http://cdecl.org。 - glglgl
@cdecl.org 认为函数可以返回一个函数。例如,它会报告 int (*af[10])(int *[10][10])(int,int); 是类型正确的。这是误导性的。在这种情况下,合适的编译器要可靠得多。 - Lee Duhem
显示剩余3条评论
2个回答

5

这不是一个有效的C语言声明。首先,缺少a的类型。更糟糕的是,(*af[10])(int , *a[10][10])就好像返回一个函数(这是不可能的)。

也许你的意思是:

int (*(*af[10])(int , int *a[10][10]))(int,int)

这将使af成为一个数组,其中包含10个指向接收int的函数指针和10个数组,每个数组有10个指向int的指针。它返回一个接收两个int并返回int的函数指针。请注意,HTML标记应保留。
int (*af[10])(int ,int (*a[10][10])(int,int))

这使得 af 成为一个由10个指向接收2个参数并返回int的函数指针组成的数组。第一个参数是int,第二个参数是一个多维数组(10x10),或者是指向接收两个int并返回int的函数指针的数组。在未来,您可能想要查看cdecl.org 来确认您的猜测。

是的,这正是我所想的,但当我对它们进行了更正时,我得到了一个否定的答案,据他们说这是正确的语法。 - yakamuki
@yakamuki 根据谁的说法? - Filipe Gonçalves
1
如果真的像你展示的那样,那是错误的。那不是有效的C语言。把它放进源文件中——它无法编译。 - Filipe Gonçalves
有趣的是,我向教授纠正了错误,他最终接受了我的更正,但他仍然要求翻译错误的那一行... - yakamuki
终于找到了,正确的代码应该是这样的 int (*af[10])(int ,int (*a[10][10])(int,int))。现在看起来很合理,非常感谢。 - yakamuki
显示剩余2条评论

0

我认为af实际上是一个数组:

af[10]

该数组包含指针:

*af[10]

这些是函数指针:

int (*af[10])(...)

而且参数列表存在语法错误,可能是int后面的逗号错误:

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

而且该行的其余部分都是垃圾。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接