較早的編譯器是不同意這樣做的,所以一些書籍比方以Tc解說的書本都說數組的下標不能是變量。在vc6.0下亦是如此。
只是在一些較新的編譯器如dev c++已經支持了,例如以下代碼不會報錯

1 #include <stdio.h> 2 #include <stdlib.h> 3 int main() 4 { 5 int a; int i; 6 scanf("%d",&a); 7 int c[a]; 8 for( i =0 ;i<a;i++) 9 scanf("%d",&c[i]); 10 for( i =0 ;i<a;i++) 11 printf("%d",c[i]); 12 }
如果想用變量定義數組有很多種方式
首先可以使用指針:
一維:

1 cin>>n; 2 3 int* a=new int[n]; 4 5 if ((a) == NULL) 6 7 { 8 //動態分配失敗 9 }
可是new出來的一定不要忘了delete掉
delete []a; // 正確的使用方法
delete a; // 錯誤的使用方法
后者相當於delete a[0],漏掉了另外n-1個對象。
二維:

1 //設有m行n列 2 cin>>m>>n; 3 int **a = new int* [m]; 4 for(int i = 0; i < m; i++) 5 { 6 a[i] = new int [n]; 7 }
這樣就相當於產生了一個二維數組a[m][n]了,可是對於我們平時聲明的數組a[m][n],a[i][j]=a[i*n+j],由於是連續的一片內存,而這樣動態聲明的數組隨意的a[k]都是一個int*類型,即一個地址了,
所以僅僅能a[i][j]或者*(*(a+i)+j)來訪問數組的元素,而不能a[i*n+j]這樣轉換着用。

1 //釋放內存: 2 for(int i = 0; i < m; ++i) 3 4 { 5 6 delete []a[i]; 7 } 8 delete []a;
還有就是使用STL容器
之所以動態聲明數組,相比是大小不確定,聲明太大了怕浪費空間,而vector就不用指定大小,當存的數據變多,自己主動擴大容量,比方如果vector默認大小是8,當你再往里存第9個元素時,容器自己主動擴容,變為16,16再不夠用,擴為32,2倍2倍的增長,這樣就依據須要擴容,不會浪費空間,也能夠像普通數組那樣直接指定vector的大小,總之普通數組能夠的它都能夠,普通數組沒有的它更有。
第一種方法

1 #include <string.h> 2 #include <vector> 3 #include <iostream> 4 #include <algorithm> 5 using namespace std; 6 7 8 int main() 9 { 10 int N=5, M=6; 11 vector<vector<int> > obj(N); //定義二維動態數組大小5行 12 for(int i =0; i< obj.size(); i++)//動態二維數組為5行6列,值全為0 13 { 14 obj[i].resize(M); 15 } 16 17 for(int i=0; i< obj.size(); i++)//輸出二維動態數組 18 { 19 for(int j=0;j<obj[i].size();j++) 20 { 21 cout<<obj[i][j]<<" "; 22 } 23 cout<<"\n"; 24 } 25 return 0; 26 }
第二種方法

1 #include <string.h> 2 #include <vector> 3 #include <iostream> 4 #include <algorithm> 5 using namespace std; 6 7 8 int main() 9 { 10 int N=5, M=6; 11 vector<vector<int> > obj(N, vector<int>(M)); //定義二維動態數組5行6列 12 13 for(int i=0; i< obj.size(); i++)//輸出二維動態數組 14 { 15 for(int j=0;j<obj[i].size();j++) 16 { 17 cout<<obj[i][j]<<" "; 18 } 19 cout<<"\n"; 20 } 21 return 0; 22 }
以上就是動態數組的定義方法啦。