c++筆記_多維陣列

學C++的小萌新發表於2020-12-12


一、多維陣列

當一個陣列當元素仍然是陣列時,通常使用兩個維度來定義它:一個維度表示陣列本身大小,另外一個維度表示其元素(也是陣列)大小:

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];		//指向含有四個整數的陣列

相關文章