在我们的一个文件中,我看到了这个功能
void match(int states[*]);
我从未在C中看过这样的事情。有人可以解释一下括号中这个奇怪的算子是什么意思吗?
答案 0 :(得分:9)
这是C99中新增的语法。它仅对函数声明中的参数有效,该参数也不是定义。它表示一个未指定长度的可变长度数组;在这种情况下,由于它位于顶层,因此(通常)完全等同于int states[]
和int *states
。
如果传递指向数组的指针,则此语法很有用 - 例如,如果我们有类似的函数:
void foo(size_t n, int a[][n])
{
/* ... */
}
..然后我们可以编写一个兼容的声明,提供原型:
void foo(size_t n, int a[][n]);
或作为:
void foo(size_t, int a[][*]);
这些完全相同。
(顺便说一下,*
没有运算符,只是标点符号。)
答案 1 :(得分:5)
[*]
表示未指定大小的C99可变长度数组,它仅在原型中有效,但仍然是完整类型(即与[]
不同,表示不完整的数组类型)。 / p>
然而,你的例子毫无意义。一个更合理的例子是
// in header file:
void match(size_t, int *[*]);
// in source file:
void match(size_t count, int *states[count])
{
// ...
}
由于省略了参数名,数组声明不能引用第一个参数,因此必须引入占位符。
但是,由于参数调整仍然适用,原型与
相同void match(size_t, int **);
并丢弃数组类型信息。
对于更高维数的多维数组,情况并非如此,例如
double det(size_t rows, size_t cols, double mat[rows][cols]);
只丢弃rows
,即声明等同于
double det(size_t rows, size_t cols, double mat[][cols]);
和
double det(size_t rows, size_t cols, double (*mat)[cols]);
反过来对应于以下兼容声明
double det(size_t, size_t, double [*][*]);
double det(size_t, size_t, double [][*]);
double det(size_t, size_t, double (*)[*]);
要防止参数调整,请将指针传递给数组,即
double det(size_t rows, size_t cols, double (*mat)[rows][cols])
然后,sizeof *mat
应返回函数体中的预期值。
答案 2 :(得分:2)
这是一个C99 - ism,用于在原型中指定可变长度数组。见§6.7.5.2(特别是第4段)。 (我以前从未见过任何使用它的东西!)