通过指针将数组转换为二维数组

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

我第一次尝试这将是非常容易的,只需将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}; 

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

你不能用int*初始化一个int bla[2][3]foo在那个上下文中变成了什么)。

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

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

但要确保尺寸实际匹配,否则会造成严重破坏。

我知道你指定了指针…但看起来你只是试图将数据存储在2D数组中。 那么memcpy()从1维数组到二维数组的内容怎么样呢?

 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 

这就是你的全部,对吧?

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

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

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

 #include  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 
 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从1D转换为2D数组; 这只是允许您访问foo的内容, 就像它是一个2D数组。

那么为什么这样呢?

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