標籤:

C++中如何創建一個不定長數組的數組指針?

假設我有若干二維數組,其第一維不定長

int p1[][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}};
int p2[][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
int p3[][4] = {{1, 2, 3, 4}, {4, 3, 2, 1}, {8, 7, 6, 5}};
int p4[][4] = {{1, 2, 3, 4}, {2, 2, 3, 4}, {3, 2, 3, 4}};
int p5[][4] = {{1, 2, 3, 4}};

然後我希望有一個數組指針指向這些二維數組

第一個想法

// 但是會報無法將int*[4] 轉換為 int**的錯誤
int (**p)[] = {p1, p2, p3, p4, p5};

第二個想法

// 會報excess elements in initializer的錯誤
int ((*p)[4])[3] = {p1, p2, p3, p4, p5};

所以我想得到一個由p1, p2, p3, p4, p5組成的數組該怎麼寫?


using ar_int_4 = int[4];

using p_ar_int_4 = ar_int_4*;

p_ar_int_4 ptrarr[] = { p1, p2, p3, p4, p5 };

或(盡量不要試圖寫這種,容易錯)

int (*ptrarr[])[4] = { p1, p2, p3, p4, p5 };


在C++裡面試圖用C的方法解決問題是不行的。

最好的辦法就是

using namespace std;

vector&&> vec;

vec.size

vec[0].size

這樣


瀉藥,就像大家說的,用vector,list,set等等等等。在C++里,我基本上也沒怎麼用過數組了,就算用,也都是一維的,太容易出錯了。

在C#、Java里才會用一部分數組,畢竟人家封裝的好。


謝邀。

我本人也是非常討厭數組語法的。所以最近實現C編譯器的時候就故意刪掉了數組2333...

如果一定要用數組,那麼你可以像其他幾位答主所說的那樣用decltype之類的做法。不過最好能配合類型別名來使用。

如果不是非用數組不可的話,那就總std::array吧。std::vector也可以(不過會產生堆分配)。手機碼字,實例晚上來補。


decltype(p1[0]) *p[] ={p1, p2, p3, p4, p5};


std::list

std::vector


其實只要理清層級關係就行了,

你需要的是一個數組,數組的元素是指針,指針指向的是一個長度為4個int的一維數組,所以你需要將p定義成這樣的類型:array(pointer(array(int, 4)), unknown),直接展開到C的類型就是int (*(p[]))[4] = {p1, p2, p3, p4, p5}; 同時由於[]的結合優先順序大於*,你可以將最裡面的那個括弧省略,也就是可以寫成int (*p[])[4] = {p1, p2, p3, p4, p5};


按照 C 的寫法應該是:

int (*p[])[4] = {p1, p2, p3, p4, p5};

但是既然是用 C++ ,最好的方法還是用模板容器:

using arr_type = std::vector&&>;
arr_type p1 = {{1, 2, 3, 4}, {5, 6, 7, 8}};
arr_type p2 = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
arr_type p3 = {{1, 2, 3, 4}, {4, 3, 2, 1}, {8, 7, 6, 5}};
arr_type p4 = {{1, 2, 3, 4}, {2, 2, 3, 4}, {3, 2, 3, 4}};
arr_type p5 = {{1, 2, 3, 4}};

然後想要拷貝

std::vector& p = {p1, p2, p3, p4, p5};

或者想用指針

std::vector& p = {p1, p2, p3, p4, p5};

都可以。


歪個樓,可以參考boost的ptr_vector


std::vector&&>


其實有個最簡單的寫法,就是用string,string本身就是個不定長數組。要多維就加入容器就好了


template&
using unique_ptr_vector = std::unique_ptr&&>;
std::vector&&>&> p;


其實就是要一個存這些數組退化成指針後的值的數組……

所以得退化一下……

#include &
// ...
// C++ 11
std::decay&::type arr[] = { p1, p2, p3, p4, p5 };
// or C++ 14
std::decay_t& arr[] = { p1, p2, p3, p4, p5 };

或者把它置於右值上下文來退化(加減幾都行)

// C++ 11
decltype(p1 + 0) arr[] = { p1, p2, p3, p4, p5 };

當然最後的實際類型是

int (*arr[5])[4];


std::vector&&>


推薦閱讀:

為什麼 C 語言的輸入輸出函數比 C++ 的輸入輸出流要快?
有沒有比較好的自學IT的網站?適用於不管是初學者還是其他段位的程序猿的網站?
如何評價2016年藍橋杯決賽?
C++ 是否適合做 GUI?

TAG:C | CC | 指針 |