是的,请使用array[position],即使参数类型是int *array。在这种情况下,您提供的替代方案 (*array[position]) 实际上是无效的,因为 [] 运算符优先于 * 运算符,使其等效于试图取消引用 a[position] 的值的 *(array[position]),而不是这是地址。
多维数组有点复杂,但你可以做到:
int m = 10, n = 5;
int matrixOnStack[m][n];
matrixOnStack[0][0] = 0; // OK
matrixOnStack[m-1][n-1] = 0; // OK
// matrixOnStack[10][5] = 0; // Not OK. Compiler may not complain
// but nearby data structures might.
int (*matrixInHeap)[n] = malloc(sizeof(int[m][n]));
matrixInHeap[0][0] = 0; // OK
matrixInHeap[m-1][n-1] = 0; // OK
// matrixInHeap[10][5] = 0; // Not OK. coloring outside the lines again.
应该解释matrixInHeap 声明的方式是matrixInHeap 指向的“事物”是n int 值的数组,因此sizeof(*matrixInHeap) == n * sizeof(int) 或整行的大小矩阵。 matrixInHeap[2][4] 起作用是因为matrixInHeap[2] 将地址matrixInHeap 推进2 * sizeof(*matrixInHeap),这会跳过整整两行n 整数,从而得到第三行的地址,然后最后的[4] 选择第五行第三行的元素。 (记住数组索引从 0 开始,而不是 1)
在指向普通多维 c 数组时可以使用相同的类型,(假设您已经知道大小):
int (*matrixPointer)[n] = matrixOnStack || matrixInHeap;
现在假设您想要一个函数,将这些可变大小的矩阵之一作为参数。当变量较早声明时,类型具有有关大小的一些信息(堆栈示例中的两个维度,以及堆示例中的最后一个维度n)。因此,函数定义中的参数类型将需要 n 值,我们实际上可以这样做,只要将其作为单独的参数包含在内,像这样定义函数:
void fillWithZeros(int m, int n, int (*matrix)[n]) {
for (int i = 0; i < m; ++i)
for (int j = 0; j < n; ++j)
matrix[i][j] = 0;
}
如果我们不需要函数内部的m 值,我们可以完全省略它,只要我们保留n:
bool isZeroAtLocation(int n, int (*matrix)[n], int i, int j) {
return matrix[i][j] == 0;
}
然后我们只在调用函数时包含大小:
fillWithZeros(m, n, matrixPointer);
assert(isZeroAtLocation(n, matrixPointer, 0, 0));
这可能有点像我们正在让编译器为它工作,特别是在我们根本不在函数体内使用n(或仅作为类似函数的参数)的情况下,但在至少它有效。
关于可读性的最后一点:使用malloc(sizeof(int[len])) 等同于malloc(len * sizeof(int))(否则任何告诉你的人都不理解 c 中的结构填充)但是第一种编写方式让读者很明显我们正在谈论一个数组。 malloc(sizeof(int[m][n])) 和 malloc(m * n * sizeof(int)) 也是如此。