由于我发现没有人回答真正的问题,所以我在这里给出我的答案。
在 C99 中,您有可变长度数组 (VLA),其声明的长度在运行时计算,而不仅仅是像以前版本的 C 那样在编译时计算。但是将数组传递给函数有点棘手。
一维数组总是作为指针传递,因此
void sort(size_t n, int arr[n]) {
}
相当于
void sort(size_t n, int *arr){
}
更高的维度可以很好地传递给函数
void toto(size_t n, size_t m, int arr[n][m]){
}
相当于
void toto(size_t n, size_t m, int (*arr)[m]){
}
通过在这样的函数内部进行这样的定义,您可以使用表达式访问元素,如下所示arr[i][j]
并且编译器知道如何计算正确的元素。
现在是您发现的语法,该语法仅对原型这是您向前声明函数接口的地方
void toto(size_t, size_t, int arr[*][*]);
所以在这里你可以将数组维度替换为*
作为占位符。但这仅在您手头没有维度名称时才有用,并且使用与定义完全相同的版本会更清晰。
void toto(size_t n, size_t m, int arr[n][m]);
一般来说,为了保持一致的使用,将尺寸放在参数列表中的第一个位置非常重要。否则,当编译器解析声明时,它们将不被知道arr
.