6

是否可以将一维数组转换为二维数组?

我首先认为这很容易,只需将 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};

所以现在的问题是,有没有办法通过指针转换它?

4

5 回答 5

10

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

您可以通过声明指向数组的指针来实现该效果int

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

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

于 2012-10-02T14:35:11.317 回答
4

我知道您指定了指针...但看起来您只是想将数组中的数据存储在二维数组中。那么只有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

这就是你的全部目标,对吧?

于 2012-10-02T14:57:10.293 回答
2
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这只允许您访问 2D 数组的foo 内容

那么为什么会这样呢?

首先,记住下标表达式a[i]被解释为*(a + i); 我们在之后找到第i' 个元素a的地址并取消引用结果。所以blah[i]相当于*(blah + i); 我们找到后面的第 ' 个 3 元素数组的地址并i取消引用intblah结果,所以的类型是。 blah[i]int [3]

于 2012-10-02T16:35:05.537 回答
1

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

 int foo[] = {1,2,3,4,5,6};
 int *bla[2]={foo, foo+3};
于 2012-10-02T14:37:30.730 回答
1

您可以使用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 
于 2012-10-02T15:09:29.180 回答