较早的编译器是不同意这样做的,所以一些书籍比方以Tc解说的书本都说数组的下标不能是变量。在vc6.0下亦是如此。
只是在一些较新的编译器如dev c++已经支持了,例如以下代码不会报错
![](http://img.e-com-net.com/image/info8/b8d97b5613f94ed2ba791cad57d0b2ed.gif)
![](http://img.e-com-net.com/image/info8/2f88dd3f1cd145f59c0e47b51acdbd4b.gif)
1 #include2 #include 3 int main() 4 { 5 int a; int i; 6 scanf("%d",&a); 7 int c[a]; 8 for( i =0 ;i) 9 scanf("%d",&c[i]); 10 for( i =0 ;i) 11 printf("%d",c[i]); 12 }
如果想用变量定义数组有很多种方式
首先可以使用指针:
一维:
![](http://img.e-com-net.com/image/info8/b8d97b5613f94ed2ba791cad57d0b2ed.gif)
![](http://img.e-com-net.com/image/info8/2f88dd3f1cd145f59c0e47b51acdbd4b.gif)
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个对象。
二维:
![](http://img.e-com-net.com/image/info8/b8d97b5613f94ed2ba791cad57d0b2ed.gif)
![](http://img.e-com-net.com/image/info8/2f88dd3f1cd145f59c0e47b51acdbd4b.gif)
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]这样转换着用。
![](http://img.e-com-net.com/image/info8/b8d97b5613f94ed2ba791cad57d0b2ed.gif)
![](http://img.e-com-net.com/image/info8/2f88dd3f1cd145f59c0e47b51acdbd4b.gif)
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的大小,总之普通数组能够的它都能够,普通数组没有的它更有。
第一种方法
![](http://img.e-com-net.com/image/info8/b8d97b5613f94ed2ba791cad57d0b2ed.gif)
![](http://img.e-com-net.com/image/info8/2f88dd3f1cd145f59c0e47b51acdbd4b.gif)
1 #include <string.h> 2 #include3 #include 4 #include 5 using namespace std; 6 7 8 int main() 9 { 10 int N=5, M=6; 11 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 ) 20 { 21 cout< " "; 22 } 23 cout<<"\n"; 24 } 25 return 0; 26 }
第二种方法
![](http://img.e-com-net.com/image/info8/b8d97b5613f94ed2ba791cad57d0b2ed.gif)
![](http://img.e-com-net.com/image/info8/2f88dd3f1cd145f59c0e47b51acdbd4b.gif)
1 #include <string.h> 2 #include3 #include 4 #include 5 using namespace std; 6 7 8 int main() 9 { 10 int N=5, M=6; 11 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 ) 16 { 17 cout< " "; 18 } 19 cout<<"\n"; 20 } 21 return 0; 22 }
以上就是动态数组的定义方法啦。