重新总结C++中的动态数组原理
最编程
2024-01-06 18:45:15
...
动态数组是指在编译时不能确定数组长度,程序在运行时需要动态分配内存空间的数组。
1.变长一维数组
实现变长数组最简单的是变长一维数组,你可以这样做:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
//文件名:array01.cpp #include<iostream> using namespace std; int
main(){
int
len;
cin>>len; //用指针p指向new动态分配的长度为len*sizeof(int)的内存空间
int *p= new
int [len]
;...........delete[]p; return0; } |
注意int*p=newint[len];这一句,你不能这样做:int p[len];C++编译器会报错说len的大小不能确定,因为用这种形式声明数组,数组的大小需要在编译时确定。
而且这样也不行:
int p[]=new int[len];
编译器会说不能把int*型转化为int[]型,因为用new开辟了一段内存空间后会返回这段内存的首地址,所以要把这个地址赋给一个指针,所以要用int*p=new int[len];
array01.cpp实现了一个变长的一维数组,但是要养成一个好习惯,就是注意要注销指针p,使程序释放用new开辟的内存空间。
当然使用C++标准模版库(STL)中的vector(向量)也可以实现变长数组:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
//文件名:array02.cpp #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" ;
} return0; } |
2.动态指针数组
在构造函数中分配空间: arr = new TYPE*[size]; for(int k=0; k<size;k++) arr[k] = new TYPE; 在析构函数中回收资源: for(int k=0;k<size; k++) delete arr[k]; delete []arr; 再来一个示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
#include <iostream> using namespace std; int
main()
{ int
** arr;
arr = new
int * [ 3 ];
for
( int
k= 0 ; k< 3 ; k++)
{
arr[k] = new
int ;
cin>>*arr[k];
}
for
( int
k= 0 ; k< 3 ; k++)
cout<<*arr[k]<< " " ;
cout<<endl;
|