嚴格來說,c++ 語言中沒有多維陣列,通常所說的多維陣列其實是陣列的陣列(盡量不要當成一維陣列理解,雖然可能儲存結構是如此實現的)。
多維陣列的宣告語句可以按照由內到外的閱讀順序來理解其實際含義。
對於二維陣列來說,常把第乙個維度稱為行,第二個維度稱為列。
【多維陣列的初始化:
允許使用花括號括起來的一組值初始化多維陣列,這點和普通的陣列一樣。下面的初始化形式中,多維陣列的每一行分別用花括號括了起來
int ia[3][4] = , // 第一行的初始值
, // 第二行的初始值
, // 第三行的初始值
};
其中內層巢狀著的花括號並非必須的,將內層花括號都去掉的宣告語句與以上語句也是等價的。
類似於一維陣列,在初始化多維陣列時也並非所有元素的值都必須包含在初始化列表之內:
int ia[3][4] = ,,}; // 除了ia[0][0], ia[1][0], ia[2][0] 其餘元素都被預設初始化為0
int ia[3][4] = ; // 除了ia[0][0], ia[0][1], ia[0][2] 其餘元素都被預設初始化為0
】
【多維陣列的下標引用:
如果表示式含有的下標運算子數量和陣列的維度一樣多,該表示式的結果將是給定型別的元素;反之,如果表示式含有的下標運算子數量比陣列的維度小,則表示式的結果將是給定索引處的乙個內層陣列。】
【使用範圍for 語句處理多維陣列:
但是如果使用&row,則在內層範圍for 迴圈中,row 將會被替換為其繫結的內層陣列,可以作為範圍for 迴圈的運算物件。for(auto &row : ia) // row 被推斷為繫結在含有四個元素的一維陣列上的引用
for(auto &col : row) // row 實際上是ia 中的某個含有四個元素的一維陣列,故col 被推斷為整形的引用
col++;
for(auto row : ia)
// row = ia[i] 觀察上一條語句,row 在每個迴圈中,將執行左邊這條語句,成為指向內層陣列首元素的指標,進而不能作為更內層範圍for 迴圈的運算物件
要是用範圍for 語句處理多維陣列,除了最內層的迴圈外,其他所有迴圈的控制變數都應該是引用型別。】
【指標和多維陣列:
當程式使用多維陣列的名字時,也會自動將其轉換成指向陣列首元素的位址。
因為多維陣列實際上是陣列的陣列,所以由多維陣列名轉換得來的指標實際上是指向第乙個內層陣列的指標。
for(auto p = begin(ia); p != end(ia); ++p)
for(auto q = begin(*p); q != end(*p); ++q)
(*q)++; // 實現的功能與範圍for 迴圈的功能相同
由於多維陣列的名字可以轉換為指標,多層陣列間的指標關係又比較混亂,可以使用auto 運算子,避免進行複雜的推斷型別的工作(倒不如說,auto 運算子的價值,就在於能夠快速高效地推斷出語句所需要的型別
)。】
【另外,使用型別別名來重定義內層陣列型別的名字,也能有效地簡化多層陣列間的複雜關係。】
C Primer 第3章 3 6 多維陣列
1.多維陣列其實就是陣列中巢狀陣列,陣列的元素還是陣列,這樣巢狀起來就沒有限制,一般稱二維陣列的第一維叫做行,第二位叫做列,其實學 int a 3 4 int a 3 4 2 int a 2 2 2 2 俄羅斯套娃,可以巢狀很多層,2.使用初始化列表對多維陣列進行初始化,如果初始化列表不全則後面的元...
C 筆記 3 6 多維陣列
嚴格來說,c 語言中沒有多維陣列,通常所說的多維陣列其實是陣列的陣列。二維陣列作為函式引數,不能省略二維大小二維陣列作為函式引數,實參可以直接使用二維陣列名,在被呼叫函式中對形引數組定義可以指定所有維數的大小,也可以省略第一維的大 明,如 void func int a 3 4 void func ...
C Primer 課後習題 3 6
練習 3.43 編寫3個不同版本的程式,令其均能輸出ia的元素。版本1使用範圍 for 語句管理迭代過程 版本 2 和版本 3 都使用普通的 for 語句,其中版本 2 要求下標運算子,版本 3 要求用指標。此外,在所有 3 個版本中都要直接寫出資料型別,而不能使用型別別名 auto 關鍵字或 de...