从C中的3D指针/数组调用2D指针/数组

时间:2018-06-29 20:04:00

标签: c arrays function pointers

对于每个时间步长,我都有一个二维矩阵a[ix][iz],其中ix0nx-1不等,iz0不等到nz-1

要组装所有时间步长的矩阵,我定义了长度为***b的3D指针nx*nz*nt。在时间it处,矩阵可以用b[ix][iz][it]表示,其中ix的范围从0nx-1,而iz的范围从0nz-1

在时间循环中,我必须在时间it处将2D数组/指针传递给函数void func(**ptr)。由于b是3D指针/数组,如何在主代码中调用它?喜欢func(b[it]);吗?

2 个答案:

答案 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