是否可以將一維數組轉換爲二維數組?通過指針將數組轉換爲二維數組
我,這將是很容易的第一因子評分,只需設置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};
所以問題是現在,有沒有辦法通過指針轉換它?
是否可以將一維數組轉換爲二維數組?通過指針將數組轉換爲二維數組
我,這將是很容易的第一因子評分,只需設置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*
(在此上下文中成爲foo
)初始化int bla[2][3]
。
可以通過聲明一個指向int
陣列達到這樣的效果,
int (*bla)[3] = (int (*)[3])&foo[0];
但可以肯定的是,實際的尺寸匹配,或破壞將接踵而至。
是的,如果你可以使用指針數組:
int foo[] = {1,2,3,4,5,6};
int *bla[2]={foo, foo+3};
我知道你specificed三分球......但看起來你只是想從存儲在一個二維數組有數據陣列。那麼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
這就是你去,對不對?
你可以使用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
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)
;請注意,下標表達式a[i]
被解釋爲*(a + i)
。我們在a
之後找到i
的第元素的地址並對結果進行解引用。所以blah[i]
相當於*(blah + i)
;我們發現i
「的地址第的int
3元素數組以下blah
和解除引用的結果,所以該類型的blah[i]
是int [3]
。