是否可以将单维数组转换为二维数组?
我首先认为这将非常简单,只需将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};
所以现在的问题是,有没有办法通过指针转换它?
答案 0 :(得分:9)
您无法使用int bla[2][3]
int*
初始化foo
。
您可以通过声明指向int
,
int (*bla)[3] = (int (*)[3])&foo[0];
但请确保尺寸实际匹配,否则会造成严重后果。
答案 1 :(得分:4)
我知道你指定了指针...但看起来你只是试图将数据存储在2D数组中。那么从一维数组到二维数组的内容只是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
这就是你的全部,对吗?
答案 2 :(得分:1)
是的,如果你可以使用指针数组:
int foo[] = {1,2,3,4,5,6};
int *bla[2]={foo, foo+3};
答案 3 :(得分: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
答案 4 :(得分:1)
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
之后找到a
'元素的地址,并取消引用结果。因此blah[i]
相当于*(blah + i)
;我们在i
后找到int
' 3元素数组blah
的地址并取消引用结果,因此类型blah[i]的{是int [3]
。