【问题标题】:call 2D pointer/array from 3D pointer/array in C从 C 中的 3D 指针/数组调用 2D 指针/数组
【发布时间】:2018-06-29 20:04:00
【问题描述】:

对于每个时间步,我有一个二维矩阵 a[ix][iz]ix0nx-1iz0nz-1 变化。

为了组装所有时间步长的矩阵,我定义了一个长度为 nx*nz*nt 的 3D 指针 ***b。在it 时,矩阵可以用b[ix][iz][it] 表示,其中ix0 变化到nx-1iz0 变化到nz-1

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

【问题讨论】:

    标签: c arrays function pointers


    【解决方案1】:

    您可以将矩阵重组为b[it][ix][iz] 而不是b[ix][iz][it]。这样,您将拥有一个二维矩阵数组,允许您在任何给定时间步使用b[it] 传入二维矩阵。

    否则,如果您保持矩阵不变,则必须在时间 it 构造 2D 数组,然后将其传递给 func() - 这是您可以通过重构 3D 矩阵来避免的额外计算。

    【讨论】:

      【解决方案2】:

      最简单的方法是使用您的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 *而不是@987654330 @... 参见例如this question

      【讨论】:

      • "但是指向数组的指针" --> "但是指向数组第一个元素的指针"。
      猜你喜欢
      • 1970-01-01
      • 2016-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-07
      • 2021-12-31
      • 1970-01-01
      相关资源
      最近更新 更多