2017-04-07 19 views
4

我有各種各樣的,不同長度的若干二維陣列:正確的方式來使用一個數組來訪問不同的長度的多個陣列在C++

int Array_A[][2] = {{...}, {...}, {...}, ...}; 
int Array_B[][2] = {{...}, {...}, ...}; 
int Array_C[][2] = {{...}, ...}; 

我需要另一個陣列,讓我來訪問這些陣列:

??? Full_Array[] = {Array_A, Array_B, Array_C}; 

???什麼是我應該使用的正確類型?我試過uint**uint*,但都不起作用。

如果這是不可行的,假設我不能改變的定義Array_AArray_B,...什麼是定義Full_Array的好辦法?

+1

你正試圖創建一個數組數組,所以... –

+2

不,他們試圖創建一個指針數組。 – aschepler

+0

@OliverCharlesworth它不是一個三維數組。原始的二維數組可以任意長。 – stanleyli

回答

7

Array_AArray_B,和Array_C是2個int小號陣列的所有陣列,所以它們都可以經歷陣列到指針轉換在頂層成指針的2個int列數組。因此Full_Array需要是指向數組的指針的數組。聲明可以寫成:

int (*FullArray[])[2] = {Array_A, Array_B, Array_C}; 

注意,有沒有辦法告訴哪些子陣列的長度,除非你有哨兵值。

+0

雖然這是一個有用的問題,但我不會回答這個問題。 – Peter

1

如果陣列Array_AArray_BArray_C大小相同的,你可以使用&運營商創建的指針並將其存儲在數組中。如果它們的大小不同,則&運算符將創建不同的指針類型,並且您將無法將它們存儲在指針數組中。

int Array_A[3][2] = { ... }; 
int Array_B[3][2] = { ... }; 
int Array_C[3][2] = { ... }; 

typedef int (*PtrType)[3][2]; 
PtrType Full_Array[] = {&Array_A, &Array_B, &Array_C}; 

以下將是一個錯誤。

int Array_A[][2] = { {}, {}, {} }; // Implied dimensions [3][2] 
int Array_B[][2] = { {}, {} };  // Implied dimensions [2][2] 
int Array_C[][2] = { {}, {}, {} }; // Implied dimensions [3][2] 

typedef int (*PtrType)[3][2]; 
PtrType Full_Array[] = {&Array_A, &Array_B, &Array_C}; 
1

除了已經發布的答案,你可能要考慮使用decltype自動推斷類型:

using PtrToArrayElem = 
    decltype(&(Array_A[0]));      // C++11, or 
// std::decay_t<decltype(Array_A)>;    // C++14 alternative, or 
// typename std::decay<decltype(Array_A)>::type; // C++11 version of above 
PtrToArrayElem arrayOfPtrsToFirstElements[] = {Array_A, Array_B, Array_C}; 

的好處是,如果你改變了其中一個數組類型,那麼你不需要在這裏更改代碼。只要確保其餘的代碼(訪問指針數組)也是通用的。


當然,這也適用,如果你願意要的地址存儲陣列本身,而如果它們是相同的尺寸只會工作:

using PtrToArray = decltype(&Array_A); 
PtrToArray arrayOfPtrToArray[] = {&Array_A, &Array_B, &Array_C}; 

注:爲了描述這個答案,選擇變量名稱。你當然應該使用有意義的名字。

+0

這不起作用,因爲三個數組中的每一個都可以有不同的長度。 – Brian

+1

@Brian這不會工作**如果數組有不同的長度。引用這個問題:「我需要另一個存儲這些數組的*地址的數組*」這實際上是「正確的」答案。但是,當然,使用數組到指針的轉換對OP來說可能更有意義。儘管我的回答並沒有改變:如果明智,使用'decltype' –

+0

我不同意,Daniel。 OP在第一行中陳述,陣列具有不同的長度。換句話說,'Array_A','Array_B'和'Array_C'的第一維可能不同。如果是這樣的話,它們是不同的類型,所以指向它們的類型是不同的。 – Peter

相關問題