c++筆記_多維陣列
一、多維陣列
當一個陣列當元素仍然是陣列時,通常使用兩個維度來定義它:一個維度表示陣列本身大小,另外一個維度表示其元素(也是陣列)大小:
int ia[3][4]; //大小為3當陣列,每個元素含有4個整數當陣列
//大小為10的陣列,每個元素都是大小為20的陣列,這些陣列的元素是含有30個整數的陣列
int arr[10][20][30] = {0};
二、多維陣列的初始化
允許使用花括號括起來的一組值初始化多維陣列,這點和普通的陣列一樣。下面的初始化形式中,多維陣列的每一行分別用花括號括了起來:
//大小為3當陣列,每個元素含有4個整數當陣列
int ia[3][4]={
{0,1,2,3}, //第一行的初始值
{4,5,6,7}, //第二行的初始值
{8,9,10,11} //第三行的初始值
};
其中內層巢狀的花括號非必需的,例如下面的初始化語句,功能和上面這段程式碼完全一樣:
//大小為3當陣列,每個元素含有4個整數當陣列
int ia[3][4]={1,2,3,4,5,6,7,8,9,10,11};
類似於一維陣列,在初始化多維陣列時也並非所有元素的值都必須包含在初始化列表之內。如果僅僅想初始化每一行的第一個元素,通過如下語句即可:
//大小為3當陣列,每個元素含有4個整數當陣列
int ia[3][4]={{0},{4},{8}};
如果把上面的語句省略掉內層的花括號,結果就大不一樣來:
//大小為3當陣列,每個元素含有4個整數當陣列
int ia[3][4]={0,3,6,9}; //顯示地初始化第1行,其他元素執行初始化
含義發生了變化,它初始化的是第一行的4個元素,其他元素被初始化為0。
三、多維陣列的下標引用
可以使用下標運算子來訪問多維陣列的元素,此時的陣列每個維度對應一個下標運算子。
//用arr的首元素為ia最後一行的最後一個元素賦值
ia[2][3] = arr[0][0][0];
int (&row)[4] = ia[1]; //把row繫結到ia的第二個4元素組上
在等號左側,ia[2]得到陣列ia的最後一行,此時返回的是表示ia最後一行的那個一維陣列而非任何實際元素;對和這個一維陣列再取下標,得到編號[3]的元素,也就是這一行的最後一個元素。
等號右側的運算子包含3個維度。首先通過索引0得到最外層的陣列,它是一個大小為20的多維陣列;接著獲取這20個元素陣列的第一個元素,得到一個大小為30的一維陣列;最後再取出其中的第一個元素。
三、使用for迴圈處理多維陣列
1.普通for迴圈
通常會用到兩層for迴圈來處理多維陣列:
#include<iostream>
using namespace std;
int main(void){
int ai[3][4]={
{0,1,2,3},
{4,5,6,7},
{8,9,10,11}
};
//外層迴圈行數
for(int i=0;i<3;++i)
{
//內層迴圈列數
for(int b=0;b<4;++b)
{
cout<<ai[i][b]<<" ";
}
cout<<endl;
}
return 0;
}
程式碼輸出:
0 1 2 3
4 5 6 7
8 9 10 11
2.使用範圍for迴圈
C++11新標準新增來範圍for語句,所以上面的程式可以簡化為如下形式:
int tmp = 0;
for (auto &b:ai) //對於外層陣列的每一個元素
{
for(auto &c:b) //對於內層陣列的每一個元素
{
c=tmp; //將下一個元素賦值給該元素
++tmp; //將tmp+1
cout<<c<<" ";
}
cout<<endl;
}
第一個for迴圈遍歷ai的所有元素,這些元素是大小為4的陣列,因此b的型別應該是含有4個整數的陣列的引用。第二個for迴圈遍歷那些4個元素陣列中的某一個,因此c的型別是整數的引用。每次迭代把tmp的值賦給ai的當前元素,然後tmp加1。
注意:要使用範圍for語句處理多維陣列,除了最內層的迴圈外,其他所有迴圈的控制變數都應該是引用型別。
四、指標和多維陣列
當程式使用多維陣列的名字時,也會自動將其轉換成指向陣列首元素的指標。
多維陣列實際上是陣列的陣列,所以由多維陣列名轉換得來的指標實際上是指向第一個內層陣列的指標:
int ai[3][4];
int (*p)[4] = ai; //p指向含有四個整數的陣列
p = &ai[2]; //p指向ai的尾元素
上述宣告中,圓括號必不可少:
int *ip[4]; //整型指標的陣列
int (*ip)[4]; //指向含有四個整數的陣列
相關文章
- JavaScript 學習筆記 - 多維陣列變為一維陣列JavaScript筆記陣列
- C/C++ 二維陣列的理解(多維陣列)C++陣列
- C++ ——vector陣列筆記C++陣列筆記
- PHP學習筆記6:表示式&多維陣列PHP筆記陣列
- C++ 獲取陣列大小、多維陣列操作詳解C++陣列
- 多維陣列陣列
- Java 學習筆記 二維陣列和物件陣列Java筆記陣列物件
- 多維陣列轉一維陣列(降維的多種方式)陣列
- 一維多維陣列陣列
- PHP中二維陣列與多維陣列PHP陣列
- 多維陣列排序陣列排序
- PHP 多維陣列排序PHP陣列排序
- scala語法 -多維陣列陣列
- 多維陣列扁平化陣列
- python多維陣列切片方法Python陣列
- Multik——Kotlin的多維陣列Kotlin陣列
- JS 陣列筆記JS陣列筆記
- GO 筆記-陣列Go筆記陣列
- 陣列筆記1陣列筆記
- C++ 使用 new 建立二維陣列C++陣列
- [JAVA] Java 陣列、多維陣列,動態、靜態初始化,陣列JVM記憶體模型分析Java陣列JVM記憶體模型
- 簡單介紹Lua一維陣列與多維陣列的使用陣列
- JavaSE 陣列:一維陣列&二維陣列Java陣列
- 多維陣列拍平一層陣列
- NumPy之:ndarray多維陣列操作陣列
- Java break、continue 詳解與陣列深入解析:單維陣列和多維陣列詳細教程Java陣列
- IOS筆記之陣列iOS筆記陣列
- 【筆記】字尾陣列筆記陣列
- JavaScript筆記(6)陣列JavaScript筆記陣列
- c++ -- 二維陣列引數傳遞C++陣列
- Java陣列宣告建立和使用以及多維陣列、Arrays類、稀疏陣列Java陣列
- c++遍歷陣列的多種方式C++陣列
- C/C++獲取二維陣列行列數C++陣列
- C++用new建立二維陣列的方法C++陣列
- js 一維陣列轉二維陣列JS陣列
- js 二維陣列轉一維陣列JS陣列
- 【筆記/模板】樹狀陣列筆記陣列
- 將一個多維陣列徹底的降維陣列