在c++中,有的時候會遇到變長的數組(不管是一維的還是二維的),這個時候就需要用到動態數組了,並且要用new和delete兩個操作符,這倆操作符一般成對使用。
先說一維的動態數組吧,直接上代碼
1 #include<iostream> 2 using namespace std; 3 int main() 4 { 5 int n; //輸入數組長度 6 cin>>n; 7 int *p; //聲明一個指針 8 p=new int[n]; /*創建了一個長度為n的動態數組,並且返回這個數組的首地址給p,p就指向了這個動態數組,可以通過指針p 9 來操作數組,因為創建的動態數組並沒有名字,只返回了首地址給p,所以可以把p看作是這個動態數組的名字 */ 10 for(int i=0;i<n;i++) 11 cin>>p[i]; 12 for(int i=0;i<n;i++) 13 cout<<p[i]<<" "; 14 delete []p; //釋放這個一維的動態數組,而不是釋放指針p。用完以后要記得釋放掉 15 cout<<p; //輸出指針p的地址 16 return 0; 17 }
用完了以后,在14行釋放掉了這個動態數組,而不是釋放的指針p(以便接下來還能使用),接着又輸出了指針p的地址。如果你釋放掉了指針p,delete p; 那么接下來就
不能再使用用指針p了,因為p所占的內存空間已經釋放了,再用的話就會出錯。比如在第14行后加上 delete p;然后再執行下一條語句 cout<<p; 來輸出p的地址就會報錯
報錯如下:
說了這么多有點跑題了,只是想說明一下不要釋放錯。
再說一下二維的動態數組,上代碼
#include<iostream> using namespace std; int main() { int m,n; //輸入數組大小 int *column; int **p; //聲明一個二級指針 cin>>m; column=new int[m]; //column用來記錄每行元素的個數,因為每行元素的個數可能不同,如果都相同的話就不需要了 p=new int*[m]; //創建了一個有m行的的二維動態數組;可以看成數組p[m]中每個元素都是指針,用來指向一個數組 for(int i=0;i<m;i++) { cin>>n; column[i]=n; p[i]=new int[n]; //確定每行元素的個數,p[i](一級指針)為每行元素的首地址 } for(int i=0;i<m;i++) //輸入每行元素的值 { for(int j=0;j<column[i];j++) cin>>p[i][j]; } cout<<"---------輸出每行元素-----------\n"; for(int i=0;i<m;i++) //輸出每行元素 { for(int j=0;j<column[i];j++) cout<<p[i][j]<<" "; cout<<endl; } for(int i=0;i<m;i++) //用完釋放掉每行(釋放二級指針) delete []p[i]; delete []p; //釋放掉每行后,再釋放這個二維數組(釋放一級指針) cout<<"指針p的地址:"<<p; //輸出指針p的地址 return 0; }
注釋我寫的比較詳細,運行結果如下圖
可以看到每行的長度都可以不同,這個就根據個人需要了。