2012-12-18 160 views
3

如果我有幾個相同數據類型的數組,那麼將它們全部複製到2d數組中的最佳方法是什麼?例如從1d數組創建2d數組

int array1[] = {1,2,3,4,5,6,7,8,9,10}; 
int array2[] = {9,8,7,6,5,4,3,2,1,0}; 

int array2d[][]; 
//pseudo code array2d = array1 + array2 

使

array2d[0][0]; //=1 (first member of array1) 
array2d[1][0]; //=9 (first member of array2) 

考慮一個數組只是一個指向第一個元素,我想我能做到這一點,但它會創建一個編譯器錯誤。

array2d[0][0] = array1; 
array2d[1][0] = array2; 

我猜我不能使用引用複製,因爲數組需要在連續內存中的條目?有沒有像我可以使用的功能的memset?

+6

「考慮一個數組是隻是一個指向第一個元素的指針「...... nah,nah,nah,數組不是指向第一個元素的指針,這就解釋了爲什麼它不起作用(更多閱讀:http://stackoverflow.com/questions/1641957/is-array-name-a-pointer-in-c和http://stackoverflow.com/questions/4810664/how-do-i-use-arrays-in-c)。 –

回答

3

不可能。您需要將元素從一個數組複製到另一個數組。

此外,你可以模擬與指向數組的指針數組的2d數組。

int array1[] = {1,2,3,4,5,6,7,8,9,10}; 
int array2[] = {9,8,7,6,5,4,3,2,1,0}; 

int *array2d[2]; 

array2d[0] = array1; 
array2d[1] = array2; 

或本

int array1[] = {1,2,3,4,5,6,7,8,9,10}; 
int array2[] = {9,8,7,6,5,4,3,2,1,0}; 

int *array2d[] = {array1, array2}; 

cout << "[0][0]=" << array2d[0][0] << endl; 
cout << "[1][0]=" << array2d[1][0] << endl; 

或反向

如果你的目標是提出二維數組一些API,那麼你應該重構你的身邊。例如,你可以用指針模擬你的1D陣列:

// an ampty array 
int array2d[2][10]; 

// pointers to parts 
int *array1 = array2d[0]; 
int *array2 = array2d[1]; 

int n; 

// fill "arrays" 
for(int i=0, n=1; i<10; ++i, ++n) { 
    array1[i] = n; 
} 
for(int i=0, n=9; i<10; ++i, --n) { 
    array2[i] = n; 
} 

// now you are ready 
cout << "[0][0]=" << array2d[0][0] << endl; 
cout << "[1][0]=" << array2d[1][0] << endl; 
1

這不是一個實際的二維數組,但你可以做array2d指針數組到一維數組:

int* array2d[2]; 

array2d[0] = array1; 
array2d[1] = array2; 

否則,你就必須元素手動拷貝過來。

+0

多數民衆贊成通常這樣做,但它發送到api函數期望數組''數據類型' –

+0

API期望'**數據類型或數據類型[] []'?您應該閱讀評論中鏈接的問題,那裏有很多好的信息。 – WildCrustacean

1

有幾件事你可以做。如果您知道每個陣列中的數據將保持不變,則可以使用#define它,然後將其用於1D和2D陣列。或者,您可以將元素從1D數組memcpy存入2D數組。第二點說明如下:

#define ARRAY_1 { 1, 2, 3, 4, 5, 6 } 
#define ARRAY_2 {7, 8, 9, 10, 11, 12 } 

int array_1[] = ARRAY_1; 
int array_2[] = ARRAY_2; 

int two_dim_array[][] = { 
    ARRAY_1, 
    ARRAY_2, 
} 
2

如果你想要一個實際的二維數組(在內存中連續),你必須複製這些元素。但是,你可以用兩個指針數組效仿:

int *array2d[2]; 
array2d[0] = array1; 
array2d[1] = array2; 
1

定義和分配

int array1[] = {1,2,3,4,5,6,7,8,9,10}; 
int array2[] = {9,8,7,6,5,4,3,2,1,0}; 

int *array2d[2]; 
array2d[0] = array1; 
array2d[1] = array2; 

測試

printf("%d\t",array2d[0][0]); 
printf("%d\t",array2d[0][9]); 
printf("%d\t",array2d[1][5]); 

它給1 10 4