目录
1.普通数组和动态数组的区别
(1)普通数组在内存中位于栈区,定义时就已经在分配了固定大小,且不能改变。有时也把普通数组叫做静态数组,以便与动态数组区分。
比如:
int a[10];
普通数组的优点是使用完毕后会自动销毁,不需要人为管理内存。
(2)动态数组在内存中位于堆区,运行时才分配内存大小,且可以改变。一般使用new或malloc分配内存,如:
int *a; //定义
a = new int[10]; //分配内存
//...
delete []a; //释放内存
动态数组的创建比较麻烦,并且创建后需要使用free或者delete释放,否则严重会引起内存泄露。
2.普通数组详解
(1)普通数组定义与初始化
_____ 几个注意点:
- 数组维度必须为常量表达式
- 可以通过列表初始化自动确定数组纬度
实例:
int n = 10;
const int m = 10;
int arr[n]; //错误,S不是常量表达式
int *p[10]; //正确,10是常量表达式
int a[m] = { 10 }; //正确,M是常量表达式
//注意下面情况!!
string C = "fishing_pan";
const int N = C.length();
char B[N]; //错误,N不是常量表达式,因为N在运行时候才被初始化
int a2[] = { 1,2,3,4}; //通过列表初始化,a2的维度自动设定为为4
(2)普通数组拷贝、赋值
- 不能将数组拷贝或赋值给另外一个数组
实例:
int a[] = { 0,1,2};
int a2[] = a ;//错误
int a3[] = { 5,6,7};
a3 = a; //错误
- 可以使用指针指向数组
实例:
int arr[4] = { 0, 1, 2 , 3 };
//下式等价于p = &arr[0],即p指向arr的第1个数arr[0] ,进而p+1指向arr的第2个数arr[1]
int *p = arr;
(3)普通数组访问元素
数组访问最简单的方式是用下标访问,如arr[0] ,arr[1], …
也可以用指针访问,如*p , *(p+1), …
指针访问虽然简单,但是容易出现超出范围的内存错误。因此可以使用迭代器访问;
int arr[4] = { 0, 1, 2 , 3 };
int *b = begin(arr); //指向数组首元素,begin()是c++ 11 引入的函数
int *e = end(arr); //指向数组末尾元素的下一位,end()是c++ 11 引入的函数
while(b!=e) //进行遍历。
{
cout<< *b<<endl; //解引用输出数组值。
b++;
}
(4)多维数组
其实c++并没有多维数组,所谓多维数组不过是数组的数组,这样理解十分重要。比如:
int ia[3][4];
可以理解为一个大小为3的数组,每个元素的类型为 “大小为4的数组”
由此来思考如何让指针指向多维数组的首元素,如下:
int ia[3][4]; //一个大小为3的数组,每个元素的类型为 “大小为4的数组”
int (*p)[4] = ia ;
第二行可以理解为,让p指向个大小为3的数组ia的首元素,符号[4]说明了数组ia的各个元素的性质。于是p[m][n]就与ia[m][n]内容相同.
多维数组的遍历方法比较多,可以参考这篇博客:
【c++】几种二维数组的遍历方式
3.动态数组详解
动态数组不需要在编译时就确定大小,它的大小在程序运行过程中确定,所以可以根据程序需要而灵活的分配数组的大小,相比静态数组,它更“灵活”、“自由”。但是动态数组需要进行显式的内存释放。
关于动态内存可以通过此博客进一步了解:【c++】动态内存 与 智能指针
(1)动态数组定义与初始化
定义:
int size = 10; //此处的size不是常量表达式。
int* Dynamic_Arr2 = new int[size]; //定义
初始化:
//默认的初始化;
int* Dynamic_Arr3 = new int[size]();
//显式的初始化
string* Dynamic_Arr4 = new string[size]{ "aa", "bb","cc", "dd", string(2, 'e') };
内存释放:
delete [ ] Dynamic_Arr4;
(2)多维动态数组
- 创建多维动态数组并申请内存
//-----------------三维数组内存申请-------------------//
int MAX_NUM = 10;
int COL_NUM = 5, ROW_NUM = 3;
double ***Arr3D = new double **[MAX_NUM];
for (int i= 0; i < MAX_NUM; i++)
{
Arr3D[i] = new double *[ROW_NUM];
for (int j = 0; j < ROW_NUM; j++)
{
Arr3D[i][j] = new double[COL_NUM];
}
- 多维动态数组内存释放
多维动态数组的释放是从最低维度开始的。先释放掉最低维度的一维数组,然后依次释放内存,直到释放掉最高维度。
for (int i = 0; i < MAX_NUM; i++)
{
for (int j = 0; j < ROW_NUM; j++)
{
delete[] Arr3D[i][j];
}
delete[] Arr3D[i];
}
delete[] Arr3D;
参考博客:【C++】细说C++中的数组之动态数组