您的位置:首页 > 编程语言 > C语言/C++

C++基础---动态数组

2015-08-16 16:59 423 查看

1. 动态数组

1.1 动态数组与静态数组的区别

静态数组

(1)静态数组的长度是预先定义好的,在整个程序中,一旦给定大小后就无法改变。声明的数组大小要尽可能达到最大,避免发生数组越界,但过度使用这种方法,会导致内存的操作环境变慢。

(2)对于静态数组,其创建非常方便,使用完也无需释放,要引用也简单,但是创建后无法改变其大小是其致命弱点。

动态数组

(1)是相对于静态数组而言的。

(2)指在声明时没有确定数组大小的数组,可以随程序需要而指定大小,有效利用存储空间。

(3)动态数组的内存空间是从堆(heap)上分配(即动态分配)的。是通过执行代码而为其分配存储空间。当程序执行到这些语句时,才为其分配。程序员自己负责释放内存。

(4)对于动态数组,其创建麻烦,使用完必须由程序员自己释放,否则严重会引起内存泄露。但其使用非常灵活,能根据程序需要动态分配大小。

注:动态数组较灵活、较方便,有助于有效管理内存。

1.2 动态数组的好处

在实际的编程中,往往会发生这种情况,即所需的内存空间取决于实际输入的数据,而无法预先确定。

为了解决上述问题,C++提供了一些内存管理函数,这些内存管理函数结合指针可以按需要动态地分配内存空间,来构建动态数组,也可把不再使用的空间回收待用,为有效地利用内存资源提供了手段

1.3 构建动态数组

遵循原则:

申请的时候从外层往里层,逐层申请;

释放的时候从里层往外层,逐层释放。

构建所需指针:

对于构建一维动态数组,需要一维指针;

对于构建二维,则需要一维,二维指针;

对于构建三维,则需要一维,二维,三维指针;

依此类推。

new和delete[]运算符用于动态分配和释放数组内存:

new:开辟数组空间

(1)开辟一维数组空间:

int *a = new int[row];
for (int i=0; i<row; i++)
{
a[i] = i;
}


(2)开辟二维数组空间:

int **a = new int*[row];
for (int i=0; i<row; i++)
{
a[i] = new int[col];
for (int j=0; j<col; j++)
{
a[i][j] = j;
}
}


(3)开辟三维数组空间:

int ***a = new int**[row];
for (int i=0; i<row; i++)
{
a[i] = new int*[col];
for (int j=0; j<col; j++)
{
a[i][j] = new int[height];
for (int k=0; k<height; k++)
{
a[i][j][k] = k;
}
}
}


(4)四维及其以上:依此类推。

delete[]:释放数组内存

(1)释放一维数组空间:

delete[] a;


(2)释放二维数组空间:

for(int i=0; i<row; i++)
{
delete[] a[i];
}
delete[] a;


(3)释放三维数组空间:

for(int i=0; i<row; i++)
{
for(int j=0; j<col; j++)
{
delete[] a[i][j];
}
}
for(int i=0; i<row; i++) { delete[] a[i]; } delete[] a;


(4)四维及其以上:依此类推。

注:要访问new所开辟的结构体空间,无法直接通过变量名进行,只能通过赋值的指针进行访问。用new和delete可以动态开辟,撤销地址空间。在编程序时,若用完一个变量(一般是暂时存储的数组),下次需要再用,但却又想省去重新初始化的功夫,可以在每次开始使用时开辟一个空间,在用完后撤销它。

1.4 动态数组程序实例

一维动态数组的创建与删除:

#include<iostream>

using namespace std;
int main()
{
//const int row= 5;//静态数组,数组长度必须为常量,大小固定,程序运行中不能修改
//cout<<"一维数组固定长度为:"<<row<<endl;
int row;//由于是动态分配数组内存空间,因此无需用常量
cout<<"设置一维数组长度:";
cin>>row;
int *p = new int[row];//new动态分配数组内存,一维动态数组
for (int i=0; i<row; i++)
{
p[i] = i;
}
for (int i=0; i<row; i++)
{
cout<<"p["<<i<<"] = "<<p[i]<<endl;
}
delete[] p;//delete[]释放数组内存
system("pause");
return 0;
}
=>设置一维数组长度:5
p[0] = 0
p[1] = 1
p[2] = 2
p[3] = 3
p[4] = 4


二维动态数组的创建与删除:

#include<iostream>

using namespace std;
int main()
{
int row;//由于是动态分配数组内存空间,因此无需用常量,第一维row的长度
int col;//由于是动态分配数组内存空间,因此无需用常量,第二维col的长度
cout<<"第一维row的长度:";
cin>>row;
cout<<"第二维col的长度:";
cin>>col;
int **p = new int*[row];//new动态分配数组内存,二维动态数组,申请第一维的空间row
for (int i=0; i<row; i++)
{
p[i] = new int[col];
for (int j=0; j<col; j++)
{
p[i][j] = j;
}
}
for (int i=0; i<row; i++)
{
for (int j=0; j<col; j++)
{
cout<<"p["<<i<<"]["<<j<<"]="<<p[i][j]<<"; ";
}
cout<<endl;
}
//释放数组内存
for(int i=0; i<row; i++)
{
delete[] p[i];
}
delete[] p;
system("pause");
return 0;
}
=>第一维row的长度:3
第二维col的长度:4
p[0][0]=0; p[0][1]=1; p[0][2]=2; p[0][3]=3;
p[1][0]=0; p[1][1]=1; p[1][2]=2; p[1][3]=3;
p[2][0]=0; p[2][1]=1; p[2][2]=2; p[2][3]=3;


三维动态数组的创建与删除:

#include<iostream>

using namespace std;
int main()
{
int row;//由于是动态分配数组内存空间,因此无需用常量,第一维row的长度
int col;//由于是动态分配数组内存空间,因此无需用常量,第二维col的长度
int height;//由于是动态分配数组内存空间,因此无需用常量,第三维height的长度
cout<<"第一维row的长度:";
cin>>row;
cout<<"第二维col的长度:";
cin>>col;
cout<<"第三维height的长度:";
cin>>height;
int ***p = new int**[row];//new动态分配数组内存,二维动态数组,申请第一维的空间row
for (int i=0; i<row; i++)
{
p[i] = new int*[col];
for (int j=0; j<col; j++)
{
p[i][j] = new int[height];
for (int k=0; k<height; k++)
{
p[i][j][k] = k;
}
}
}
for (int i=0; i<row; i++)
{
for (int j=0; j<col; j++)
{
for (int k=0; k<height; k++)
{
cout<<"p["<<i<<"]["<<j<<"]["<<k<<"]="<<p[i][j][k]<<"; ";
}
cout<<endl;
}
cout<<endl;
}
//释放数组内存
for(int i=0; i<row; i++)
{
for(int j=0; j<col; j++)
{
delete[] p[i][j];
}
}
for(int i=0; i<row; i++)
{
delete[] p[i];
}
delete[] p;
system("pause");
return 0;
}
=>第一维row的长度:3
第二维col的长度:4
第三维height的长度:5
p[0][0][0]=0; p[0][0][1]=1; p[0][0][2]=2; p[0][0][3]=3; p[0][0][4]=4;
p[0][1][0]=0; p[0][1][1]=1; p[0][1][2]=2; p[0][1][3]=3; p[0][1][4]=4;
p[0][2][0]=0; p[0][2][1]=1; p[0][2][2]=2; p[0][2][3]=3; p[0][2][4]=4;
p[0][3][0]=0; p[0][3][1]=1; p[0][3][2]=2; p[0][3][3]=3; p[0][3][4]=4;
p[1][0][0]=0; p[1][0][1]=1; p[1][0][2]=2; p[1][0][3]=3; p[1][0][4]=4;
p[1][1][0]=0; p[1][1][1]=1; p[1][1][2]=2; p[1][1][3]=3; p[1][1][4]=4;
p[1][2][0]=0; p[1][2][1]=1; p[1][2][2]=2; p[1][2][3]=3; p[1][2][4]=4;
p[1][3][0]=0; p[1][3][1]=1; p[1][3][2]=2; p[1][3][3]=3; p[1][3][4]=4;
p[2][0][0]=0; p[2][0][1]=1; p[2][0][2]=2; p[2][0][3]=3; p[2][0][4]=4;
p[2][1][0]=0; p[2][1][1]=1; p[2][1][2]=2; p[2][1][3]=3; p[2][1][4]=4;
p[2][2][0]=0; p[2][2][1]=1; p[2][2][2]=2; p[2][2][3]=3; p[2][2][4]=4;
p[2][3][0]=0; p[2][3][1]=1; p[2][3][2]=2; p[2][3][3]=3; p[2][3][4]=4;


参考文献:

[1] 百度搜索关键字:C++数组、动态数组、多维动态数组的创建与删除
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: