我目前正在为我的C-Midterm学习,我遇到了这个声明:
int **foo[][]()
在寻找解决方案时,这个宣言意味着我的导师实际上给出了两个不同的答案: 1)foo是一个函数数组数组,返回类型指向指向int的指针 2)foo是指向返回类型为int的函数的指针的数组数组 我知道"从变量的名称开始,继续向右,直到你到达终点或“#39;”'然后回到你的最后一个起点继续向左,直到你到达开始或者#(''''规则,所以我认为1)是正确的答案,但我不完全确定。
谢谢, Ozelotl
答案 0 :(得分:1)
这没什么特别的。这意味着它表面看起来像一个C声明,但它没有格式良好。这是非法的,因此没有任何意义。
首先,它看起来像一个二维数组声明,但在C语言中,需要一个数组声明来指定除第一个之外的所有大小。您的声明也省略了第二个尺寸,这使其成为非法。
其次,即使我们忽略了缺少的大小,它看起来像是一个函数数组的声明。在C中声明函数数组是违法的。
例如,这将产生合法的C声明
int (**foo[][42])()
但不是你原来的。
答案 1 :(得分:0)
这个声明的语法是foo[][]
声明一个二维数组(或者,如果第二个绑定指定了一个维度,它就会这样 - 因为它是非法的);然后剩下的就是:
int **bar(); // with bar = foo[][]
这是一个接受未指定参数并返回int **
的函数。但是,由于bar
是一种数组类型,因此尝试声明一组函数,这是非法的。 (不要与函数指针数组混淆,这样就可以了。)
语法规则是**
绑定到int
(而不是bar
)除非您使用括号强制它们绑定到bar
;所以他们是int **
类型的一部分,他们并不是说bar
是一个指针。