传递一个多维数组作为参数传递给函数其他的答案。 传递一个暗淡的数组作为参数或多或少是微不足道的。 让我们来看看更有趣的传递2 dim数组的情况。 在C中,你不能使用指针构造指针(int **)而不是2 dim数组。 让我们做一个例子:
void assignZeros(int(*arr)[5], const int rows) {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < 5; j++) {
*(*(arr + i) + j) = 0;
// or equivalent assignment
arr[i][j] = 0;
}
}
在这里,我已指定一个函数,它作为第一个参数的指针5个整数的阵列。 我可以传递的参数有5列的任何2维数组:
int arr1[1][5]
int arr1[2][5]
...
int arr1[20][5]
...
您可以来一个想法,以定义可以接受任何2维数组并更改函数签名更一般的功能如下:
void assignZeros(int ** arr, const int rows, const int cols) {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
*(*(arr + i) + j) = 0;
}
}
}
这段代码可以编译,但是当试图按照与第一个函数相同的方式赋值时,你会得到一个运行时错误。 因此,在C中,多维数组与指针的指针...指针不同。 int(* arr)[5]是指向5个元素的数组的指针, int(* arr)[6]是一个指向6个元素数组的指针,它们是指向不同类型的指针!
那么,如何定义更高维度的函数参数呢?简单,我们只是按照模式! 海尔北京时间调整,以3维的阵列相同的功能:
void assignZeros2(int(*arr)[4][5], const int dim1, const int dim2, const int dim3) {
for (int i = 0; i < dim1; i++) {
for (int j = 0; j < dim2; j++) {
for (int k = 0; k < dim3; k++) {
*(*(*(arr + i) + j) + k) = 0;
// or equivalent assignment
arr[i][j][k] = 0;
}
}
}
}
如何你所期望的,它可以采取作为参数具有在第二维度4个元件和第三维度5中任3个暗淡阵列元素。任何这样的事情都可以:
arr[1][4][5]
arr[2][4][5]
...
arr[10][4][5]
...
但是,我们必须指定所有尺寸大小,直到第一个尺寸。
您通过引用传递数组,但是您正在修改其内容 - 因此,为什么您看到数据发生更改 –