C++動態申請二維陣列
動態申請陣列,在C/C++程式設計之中也算是比較常見的操作,動態申請一維陣列相信列位也都能從書中找到,但對於動態申請二維陣列,似乎書中甚少提及,不過沒關係,看完本文之後我們對於這個操作也就能有個清晰的認識了。下面我們進入正文:
動態申請一維陣列的方法很簡單,我們都知道陣列是一段連續的記憶體空間,所以只要我們擁有陣列首地址,那我們就能對陣列元素逐個訪問,而陣列名有時是被解釋為陣列首地址(指標)的,基於這個事實,我們就可以得到:
int *p_arr = new int[10]; //如此,我們就成功地動態申請得到了一維陣列
//new操作返回陣列首地址,用一個指標儲存
有了上述的解釋,或許有人就會進行以下的操作:
int **p_arr = new int[10][10]; //既然一維陣列是一級指標
//那二維陣列是否就是二級指標呢?
我們可以編譯執行一下,然後我們就能看到問題了,不能將int(*)[]轉換為int **。由此,我們就可以引出第一種動態申請二維陣列的方法了:
#include "iostream" using namespace std; int main(int argc, char *argv[]) { int (*p_arr)[4] = new int[4][4]; for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { p_arr[i][j] = i * j; } } for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { cout << p_arr[i][j] << " " << ends; } } return 0; }
方括號中的值必須為二維陣列第二維的值,雖然可以不是,但這將會引出一個比較麻煩的問題——按索引訪問元素是,所得到的或許就不是我們期望的了,這點大家可以自己嘗試一番。
下面我們介紹第二種二維陣列的動態申請方法,第二種申請方法基於動態一維陣列的申請,我們是將動態一維陣列轉換為二維陣列,為何可行?只因為二維陣列雖然物理結構像一張二維表一般,但其實實質還是一整段連續的記憶體空間的,與一維陣列一樣,所以我們就可以對其進行一定的轉換,轉換方法如下:
#include "iostream" using namespace std; int main(int argc, char *argv[]) { int nRow, nCol; cin >> nRow >> nCol; int *p_arr = new int[nRow * nCol]; int (*pp_arr)[nCol] = (int(*)[nCol])p_arr; for (int i = 0; i < nRow; i++) { for (int j = 0; j < nCol; j++) { pp_arr[i][j] = i * j; } } for (int i = 0; i < nRow; i++) { for (int j = 0; j < nCol; j++) { cout << pp_arr[i][j] << " " << ends; } } return 0; }
看完上述兩種方法,我們就差不多清楚地瞭解了動態二維陣列的申請方式,此外,我們還有一個比較取巧的方式:我們可以先申請一個一維指標陣列,然後再對其元素逐個進行申請陣列空間,雖然這也可行,但我們並不推薦這樣做,理由是,我們不能保證這個陣列的連續性!失去了連續性的陣列,那我們還不如去使用STL呢!