1. 程式人生 > >C++程式設計筆記:二維陣列的動態分配與釋放

C++程式設計筆記:二維陣列的動態分配與釋放

當給定的條件不同時,二維陣列的動態分配方式不同。例如,已知二維陣列的行數(即第一維維度)為多少的情況下對其進行動態分配,與知道列數(第二維維度),或者兩個維度都未知的情況下,二維陣列的動態分配方式都不同,對應的釋放方式也不同。下面我們就來一一介紹。

1. 已知二維陣列的行數

const int ROW=3;//已知行數
int *a[ROW];//指標陣列

int col; //列數為未知,動態輸入
cin>>col;

//動態分配
for(int i=0;i<ROW;i++){
    a[i]=new int[col];
    /*輸入陣列元素
    for (int j = 0; j < col; j++){
        cin >> a[i][j];
    }*/
} /*列印陣列 for (int i = 0; i < M; i++){ for (int j = 0; j < col; j++){ cout << a[i][j] << " "; } cout << endl; } */ //釋放 for(int i=0;i<ROW;i++){ delete[] a[i]; }

上述方法中指標指向的陣列在記憶體中並不一定是連續存放的,如果需要保持記憶體的連續性,則需要一次分配記憶體。

1.1 已知二維陣列的行數,一次分配記憶體(保持記憶體的連續性)

const
int ROW=3;//已知行數 int *a[ROW];//指標陣列 int col; //列數為未知,動態輸入 cin<<col; //動態分配 a[0]=new int[ROW*col]; for(int i=1;i<ROW;i++){ a[i]=a[i-1]+col; } //釋放 delete[] a[0];

2. 已知二維陣列的列數

const int COL=2;//已知列數
int (*a)[COL];//陣列指標

int row;//行數為未知,動態輸入
cin<<row;

//動態分配
a=new int[row][COL];

//釋放
delete[] a;

3. 未知二維陣列的行數和列數

int **a;//指標的指標

int row,col;//未知行數和列數,動態輸入
cin<<row<<col;

//動態分配
a=new int*[row];
for(int i=0;i<row;i++){
    a[i]=new int[col];
}

//釋放
for(int i=0;i<row;i++){
    delete[] a[i];
}
delete[] a;

同樣的,上述方法中指標指向的陣列在記憶體中也不一定是連續存放的,如果需要保持記憶體的連續性,則需要一次分配記憶體。

3.1 未知二維陣列的行數和列數,一次分配記憶體(保持記憶體的連續性)

int **a;//指標的指標

int row,col;//未知行數和列數,動態輸入
cin<<row<<col;

//動態分配
a=new int*[row];
a[0]=new int[row*col]
for(int i=1;i<row;i++){
    a[i]=a[i-1]+col;
}

//釋放
delete[] a[0];
delete[] a;

特別注意一下,new和delete要配對使用,有多少個new就有多少個delete,且new和delete的形式保持一致,這樣才可以避免記憶體洩漏。