【问题标题】:convert array to two dimensional array by pointer通过指针将数组转换为二维数组
【发布时间】:2012-10-02 14:30:49
【问题描述】:

一维数组可以转换成二维数组吗?

我首先认为这很容易,只需将 2D 数组的指针设置为 1D 数组的开头,如下所示:

int foo[] = {1,2,3,4,5,6};
int bla[2][3] = foo;

因为我可以像这样轻松地创建一个二维数组:

int bla[2][3] = {1,2,3,4,5,6};

那么问题来了,有没有办法通过指针来转换呢?

【问题讨论】:

    标签: c arrays pointers


    【解决方案1】:

    您不能用int* 初始化int bla[2][3]foo 在这种情况下会变成什么)。

    你可以通过声明一个指向int数组的指针来达到这个效果,

    int (*bla)[3] = (int (*)[3])&foo[0];
    

    但要确保尺寸确实匹配,否则会发生严重破坏。

    【讨论】:

      【解决方案2】:

      我知道您指定了指针...但看起来您只是想将数组中的数据存储在二维数组中。那么只memcpy()一维数组到二维数组的内容呢?

      int i, j;
      int foo[] = {1, 2, 3, 4, 5, 6};
      int bla[2][3];
      memcpy(bla, foo, 6 * sizeof(int));
      for(i=0; i<2; i++)
         for(j=0; j<3; j++)
            printf("bla[%d][%d] = %d\n",i,j,bla[i][j]);
      

      产量:

      bla[0][0] = 1
      bla[0][1] = 2
      bla[0][2] = 3
      bla[1][0] = 4
      bla[1][1] = 5
      bla[1][2] = 6
      

      这就是你想要的,对吧?

      【讨论】:

        【解决方案3】:
        int (*blah)[3] = (int (*)[3]) foo; // cast is required
        
        for (i = 0; i < 2; i++)
          for (j = 0; j < 3; j++)
            printf("blah[%d][%d] = %d\n", i, j, blah[i][j]);
        

        请注意,这不会 foo 从一维数组转换为二维数组;这只是允许您访问foo 的内容就好像它是一个二维数组。

        那么为什么会这样呢?

        首先,记住下标表达式a[i]被解释为*(a + i);我们在a 之后找到i'th element 的地址并取消引用结果。所以blah[i]等价于*(blah + i);我们在blah 后面找到i'th 三元素数组int 的地址并取消引用结果,所以blah[i]typeint [3]

        【讨论】:

          【解决方案4】:

          是的,如果您可以使用指针数组:

           int foo[] = {1,2,3,4,5,6};
           int *bla[2]={foo, foo+3};
          

          【讨论】:

            【解决方案5】:

            您可以使用union 将一个数组别名到另一个数组:

            #include <stdio.h>
            
            union
            {
              int foo[6];
              int bla[2][3];
            } u = { { 1, 2, 3, 4, 5, 6 } };
            
            int main(void)
            {
              int i, j;
            
              for (i = 0; i < 6; i++)
                printf("u.foo[%d]=%d ", i, u.foo[i]);
              printf("\n");
            
              for (j = 0; j < 2; j++)
              {
                for (i = 0; i < 3; i++)
                  printf("u.bla[%d][%d]=%d ", j, i, u.bla[j][i]);
                printf("\n");
              }
            
              return 0;
            }
            

            输出(ideone):

            u.foo[0]=1 u.foo[1]=2 u.foo[2]=3 u.foo[3]=4 u.foo[4]=5 u.foo[5]=6 
            u.bla[0][0]=1 u.bla[0][1]=2 u.bla[0][2]=3 
            u.bla[1][0]=4 u.bla[1][1]=5 u.bla[1][2]=6 
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-04-17
              • 1970-01-01
              • 2018-03-27
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多