【发布时间】:2010-03-03 04:21:46
【问题描述】:
我们可以通过以下方式在头文件中声明函数吗?
extern int ap( char[][] );
我们可以在函数中使用 char[][] 吗?
【问题讨论】:
-
你为什么不试试看。
-
@darren:“尝试”很少是测试语言结构有效性的正确方法。那里有足够多的“它在 GCC 中有效”的受害者(例如)。
我们可以通过以下方式在头文件中声明函数吗?
extern int ap( char[][] );
我们可以在函数中使用 char[][] 吗?
【问题讨论】:
【讨论】:
对于二维数组,您必须提供最后一维的大小,否则编译器不知道如何使用它。 (虽然可以省略名称。)
像这样:
extern int ap( char[][10] );
【讨论】:
char[][] 不是有效的数组类型,因为您不能有不完整类型的数组,并且char[] 是不完整的。我知道这很令人困惑,因为您确实有两种数组类型,所以这是另一个具有相同问题的示例:char a[3][]。数组 a 的长度为 3,元素类型为 char[],但 char[] 还是不完整的,这是 invalid。
当你有一个“多维数组”时,你真的有一个数组数组。例如,typedef int U[3][5]; 使 U 成为长度为 3 的数组,其中长度为 5 的整数数组,等效于typedef int H[5]; typedef H U[3];。
函数参数可以省略最左边维度的原因是,只有函数参数,T[N] 形式的数组类型被转换为T*,N 可以省略,将T[] 赋予T*。这仅适用于“最顶层”或“最外层”。
所以,所有这些函数声明都是相同的:
int f1(int a[3][5]);
int f2(int a[][5]);
int f3(int (*a)[5]);
typedef int T[5];
int f4(T a[3]);
int f5(T a[]);
int f6(T* a);
当然,您可以删除上述任何声明中的参数名称a,而无需更改它们。
【讨论】:
然而,在函数声明中省略参数名称是完全有效的。但是,当你定义函数时,你必须给数组一个名字,然后你可以通过这个名字来引用它。
【讨论】:
不,这是不允许的 - 它试图将参数声明为指向不完整数组类型的指针。
数组类型必须用大小来完成,像这样:
extern int ap( char[][10] );
【讨论】: