对于每个时间步长,我都有一个二维矩阵a[ix][iz]
,其中ix
从0
到nx-1
不等,iz
从0
不等到nz-1
。
要组装所有时间步长的矩阵,我定义了长度为***b
的3D指针nx*nz*nt
。在时间it
处,矩阵可以用b[ix][iz][it]
表示,其中ix
的范围从0
到nx-1
,而iz
的范围从0
到nz-1
。
在时间循环中,我必须在时间it
处将2D数组/指针传递给函数void func(**ptr)
。由于b
是3D指针/数组,如何在主代码中调用它?喜欢func(b[it]);
吗?
答案 0 :(得分:3)
您可以将矩阵重组为b[it][ix][iz]
而不是b[ix][iz][it]
。这样,您将拥有2D矩阵数组,允许您使用b[it]
在任何给定的时间步长传递2D矩阵。
否则,如果您保持矩阵不变,则必须在时间it
上构建2D数组,然后将其传递到func()
-这是您可以通过重组避免的额外计算您的3D矩阵。
答案 1 :(得分:3)
最简单的方法是使用b
仅存储指向矩阵的指针,如下所示:
在每个时间步中,复制矩阵a
,然后将指向矩阵a
副本的指针插入b
中。
然后,您可以将b[i]
传递给函数func(b[i])
。
基本上,这也是frsim的建议。 在代码中:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define MAX_TIME 5
void func(int array[2][3]) {
for(size_t x = 0; x < 2; ++x) {
for(size_t y = 0; y < 3; ++y) {
printf("%i ", array[x][y]);
}
printf("\n");
}
printf("\n");
}
int main (int argc, char** argv) {
int a[2][3] = {{1, 2, 3}, {4, 5, 6}};
int b[MAX_TIME][2][3] = {0};
for(size_t time = 0; time < MAX_TIME; ++time) {
/* Calculate your new version of `a` here */
a[1][0] = time;
memcpy(b[time], a, sizeof(a));
printf("%zu ", sizeof(a));
}
for(size_t i = 0; i < MAX_TIME; ++i) {
printf("time: %zu \n", i);
func(b[i]);
}
}
数组有很多陷阱,特别是,数组不是指针。
但是:如果将数组传递给函数,则会发生的事情不是将数组本身传递给函数,而是传递给数组的指针。
二维数组也会发生同样的情况:当调用带有二维数组的函数时,传递给函数的不是数组,而是指针,并且该指针仍然只是int *
而不是int **
...参见例如this question