在C头文件中,我看到`[*]`用作数组绑定。这是什么意思?

时间:2011-10-15 23:08:33

标签: c arrays

在我们的一个文件中,我看到了这个功能

void match(int states[*]);

我从未在C中看过这样的事情。有人可以解释一下括号中这个奇怪的算子是什么意思吗?

3 个答案:

答案 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段)。 (我以前从未见过任何使用它的东西!)