C++變長陣列
阿新 • • 發佈:2019-02-17
什麼是變長陣列?
變長陣列是指在編譯時不能確定陣列長度,程式在執行時需要動態分配記憶體空間的陣列。
1.普通方式實現一維變長陣列:
#include<iostream> using namespace std; int main() { int len; cin>>len; //用指標p指向new動態分配的長度為len*sizeof(int)的記憶體空間 int *p=new int[len]; /*注意int *p=new int[len];這一句,你不能這樣做: int p[len]; C++編譯器會報錯說len的大小不能確定,因為用這種形式宣告陣列,陣列的大小需要在編譯時確定。而且這樣也不行: int p[]=new int[len]; 編譯器會說不能把int*型轉化為int[]型,因為用new開闢了一段記憶體空間後會返回這段記憶體的首地址,所以要把這個地址賦給一個指標,所以要用: int *p=new int[len]*/ ........... delete[] p;//注意要登出指標p,使程式釋放用new開闢的記憶體空間 }
2.使用C++標準模版庫(STL)中的vector(向量)也可以實現變長陣列:
#include<iostream> #include<vector> using namespace std; int main() { int len; cin>>len; vector<int> array(len);//宣告變長陣列 for(int i=0;i<len;i++) { array[i]=i; cout<<array[i]<<"\t"; } return 0; }
使用完vector後呼叫~vector()解構函式釋放記憶體。
3.用vector實現變長二維陣列
#include <iostream> #include <vector> #include <iomanip> using namespace std; int main() { int i, j, m, //行數 n; //列數 cout << "input value for m,n:"; cin>>m>>n; //注意下面這一行:vector<int後兩個">"之間要有空格!否則會被認為是過載">>"。 vector<vector<int> > vecInt(m, vector<int>(n)); for (i = 0; i < m; i++) for (j = 0; j < n; j++) vecInt[i][j] = i*j; for (i = 0; i < m; i++) { for (j = 0; j < n; j++) cout<<setw(5)<<vecInt[i][j]<<":"<<setw(9)<<&vecInt[i][j]; cout<<endl; } return 0; }
4.實現變長n維陣列
首先介紹一下雙指標方法,在這裡雙指標就是指像指標的指標,比如你可以這樣宣告一個數組:
int **p = new int*[num1]; 而對每一個*p(一共num1個*p)申請一組記憶體空間:
for(int i=0; i<num1; ++i)
p[i] = new int[num2];
其中,num1是行數,num2是陣列的列數。
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
int num1,//行數
num2;//列數
cout<<"Please enter the number for row and column: "<<endl;
cin >> num1 >> num2;
//為二維陣列開闢空間
int **p = new int*[num1];
for(int i=0; i<num1; ++i)
p[i] = new int[num2];
for(int j=0;j<num1;j++)
{
for(int k=0;k<num2;k++)
{
p[j][k]=(j+1)*(k+1);
cout<<setw(6)<<p[j][k]<<':'<<setw(8)<<&p[j][k];
}
cout<<endl;
}
//釋放二維陣列佔用的空間
for(int m=0;m<num1;m++)
delete[] p[m];
delete[] p;
return 0;
}
由於陣列空間是動態分配的,陣列行之間的地址空間是不連續的,因為不同行的陣列元素的地址空間是用不同的new來分配的。而每一行之中列之間的地址空間是連續的。