1. 程式人生 > >C++動態申請二維陣列

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呢!