1. 動态數組
1.1 動态數組與靜态數組的差別
-
靜态數組
(1)靜态數組的長度是預先定義好的,在整個程式中,一旦給定大小後就無法改變。聲明的數組大小要盡可能達到最大,避免發生數組越界,但過度使用這種方法,會導緻記憶體的操作環境變慢。
(2)對于靜态數組,其建立非常友善,使用完也無需釋放,要引用也簡單,但是建立後無法改變其大小是其緻命弱點。
-
動态數組
(1)是相對于靜态數組而言的。
(2)指在聲明時沒有确定數組大小的數組,可以随程式需要而指定大小,有效利用存儲空間。
(3)動态數組的記憶體空間是從堆(heap)上配置設定(即動态配置設定)的。是通過執行代碼而為其配置設定存儲空間。當程式執行到這些語句時,才為其配置設定。程式員自己負責釋放記憶體。
(4)對于動态數組,其建立麻煩,使用完必須由程式員自己釋放,否則嚴重會引起記憶體洩露。但其使用非常靈活,能根據程式需要動态配置設定大小。
注:動态數組較靈活、較友善,有助于有效管理記憶體。
1.2 動态數組的好處
- 在實際的程式設計中,往往會發生這種情況,即所需的記憶體空間取決于實際輸入的資料,而無法預先确定。
- 為了解決上述問題,C++提供了一些記憶體管理函數,這些記憶體管理函數結合指針可以按需要動态地配置設定記憶體空間,來建構動态數組,也可把不再使用的空間回收待用,為有效地利用記憶體資源提供了手段。
1.3 建構動态數組
-
遵循原則:
申請的時候從外層往裡層,逐層申請;
釋放的時候從裡層往外層,逐層釋放。
-
建構所需指針:
對于建構一維動态數組,需要一維指針;
對于建構二維,則需要一維,二維指針;
對于建構三維,則需要一維,二維,三維指針;
依此類推。
- new和delete[]運算符用于動态配置設定和釋放數組記憶體:
-
new:開辟數組空間
(1)開辟一維數組空間:
(2)開辟二維數組空間:int *a = new int[row]; for (int i=; i<row; i++) { a[i] = i; }
(3)開辟三維數組空間:int **a = new int*[row]; for (int i=; i<row; i++) { a[i] = new int[col]; for (int j=; j<col; j++) { a[i][j] = j; } }
(4)四維及其以上:依此類推。int ***a = new int**[row]; for (int i=; i<row; i++) { a[i] = new int*[col]; for (int j=; j<col; j++) { a[i][j] = new int[height]; for (int k=; k<height; k++) { a[i][j][k] = k; } } }
-
delete[]:釋放數組記憶體
(1)釋放一維數組空間:
(2)釋放二維數組空間:
(3)釋放三維數組空間:for(int i=; i<row; i++) { delete[] a[i]; } delete[] a;
for(int i=; i<row; i++) { for(int j=; j<col; j++) { delete[] a[i][j]; } } for(int i=; i<row; i++) { delete[] a[i]; } delete[] a;
(4)四維及其以上:依此類推。
注:要通路new所開辟的結構體空間,無法直接通過變量名進行,隻能通過指派的指針進行通路。用new和delete可以動态開辟,撤銷位址空間。在程式設計式時,若用完一個變量(一般是暫時存儲的數組),下次需要再用,但卻又想省去重新初始化的功夫,可以在每次開始使用時開辟一個空間,在用完後撤銷它。
1.4 動态數組程式執行個體
- 一維動态數組的建立與删除:
#include<iostream> using namespace std; int main() { //const int row= 5;//靜态數組,數組長度必須為常量,大小固定,程式運作中不能修改 //cout<<"一維數組固定長度為:"<<row<<endl; int row;//由于是動态配置設定數組記憶體空間,是以無需用常量 cout<<"設定一維數組長度:"; cin>>row; int *p = new int[row];//new動态配置設定數組記憶體,一維動态數組 for (int i=; i<row; i++) { p[i] = i; } for (int i=; i<row; i++) { cout<<"p["<<i<<"] = "<<p[i]<<endl; } delete[] p;//delete[]釋放數組記憶體 system("pause"); return ; } =>設定一維數組長度: p[] = p[] = p[] = p[] = p[] =
- 二維動态數組的建立與删除:
#include<iostream> using namespace std; int main() { int row;//由于是動态配置設定數組記憶體空間,是以無需用常量,第一維row的長度 int col;//由于是動态配置設定數組記憶體空間,是以無需用常量,第二維col的長度 cout<<"第一維row的長度:"; cin>>row; cout<<"第二維col的長度:"; cin>>col; int **p = new int*[row];//new動态配置設定數組記憶體,二維動态數組,申請第一維的空間row for (int i=0; i<row; i++) { p[i] = new int[col]; for (int j=0; j<col; j++) { p[i][j] = j; } } for (int i=0; i<row; i++) { for (int j=0; j<col; j++) { cout<<"p["<<i<<"]["<<j<<"]="<<p[i][j]<<"; "; } cout<<endl; } //釋放數組記憶體 for(int i=0; i<row; i++) { delete[] p[i]; } delete[] p; system("pause"); return 0; } =>第一維row的長度:3 第二維col的長度:4 p[0][0]=0; p[0][1]=1; p[0][2]=2; p[0][3]=3; p[1][0]=0; p[1][1]=1; p[1][2]=2; p[1][3]=3; p[2][0]=0; p[2][1]=1; p[2][2]=2; p[2][3]=3;
- 三維動态數組的建立與删除:
#include<iostream> using namespace std; int main() { int row;//由于是動态配置設定數組記憶體空間,是以無需用常量,第一維row的長度 int col;//由于是動态配置設定數組記憶體空間,是以無需用常量,第二維col的長度 int height;//由于是動态配置設定數組記憶體空間,是以無需用常量,第三維height的長度 cout<<"第一維row的長度:"; cin>>row; cout<<"第二維col的長度:"; cin>>col; cout<<"第三維height的長度:"; cin>>height; int ***p = new int**[row];//new動态配置設定數組記憶體,二維動态數組,申請第一維的空間row for (int i=0; i<row; i++) { p[i] = new int*[col]; for (int j=0; j<col; j++) { p[i][j] = new int[height]; for (int k=0; k<height; k++) { p[i][j][k] = k; } } } for (int i=0; i<row; i++) { for (int j=0; j<col; j++) { for (int k=0; k<height; k++) { cout<<"p["<<i<<"]["<<j<<"]["<<k<<"]="<<p[i][j][k]<<"; "; } cout<<endl; } cout<<endl; } //釋放數組記憶體 for(int i=0; i<row; i++) { for(int j=0; j<col; j++) { delete[] p[i][j]; } } for(int i=0; i<row; i++) { delete[] p[i]; } delete[] p; system("pause"); return 0; } =>第一維row的長度:3 第二維col的長度:4 第三維height的長度:5 p[0][0][0]=0; p[0][0][1]=1; p[0][0][2]=2; p[0][0][3]=3; p[0][0][4]=4; p[0][1][0]=0; p[0][1][1]=1; p[0][1][2]=2; p[0][1][3]=3; p[0][1][4]=4; p[0][2][0]=0; p[0][2][1]=1; p[0][2][2]=2; p[0][2][3]=3; p[0][2][4]=4; p[0][3][0]=0; p[0][3][1]=1; p[0][3][2]=2; p[0][3][3]=3; p[0][3][4]=4; p[1][0][0]=0; p[1][0][1]=1; p[1][0][2]=2; p[1][0][3]=3; p[1][0][4]=4; p[1][1][0]=0; p[1][1][1]=1; p[1][1][2]=2; p[1][1][3]=3; p[1][1][4]=4; p[1][2][0]=0; p[1][2][1]=1; p[1][2][2]=2; p[1][2][3]=3; p[1][2][4]=4; p[1][3][0]=0; p[1][3][1]=1; p[1][3][2]=2; p[1][3][3]=3; p[1][3][4]=4; p[2][0][0]=0; p[2][0][1]=1; p[2][0][2]=2; p[2][0][3]=3; p[2][0][4]=4; p[2][1][0]=0; p[2][1][1]=1; p[2][1][2]=2; p[2][1][3]=3; p[2][1][4]=4; p[2][2][0]=0; p[2][2][1]=1; p[2][2][2]=2; p[2][2][3]=3; p[2][2][4]=4; p[2][3][0]=0; p[2][3][1]=1; p[2][3][2]=2; p[2][3][3]=3; p[2][3][4]=4;
參考文獻:
[1] 百度搜尋關鍵字:C++數組、動态數組、多元動态數組的建立與删除