[c++]普通数组 与 动态数组

目录

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++中的数组之动态数组

    原文作者:Zachary Yu
    原文地址: https://blog.csdn.net/qq_43145072/article/details/100834467
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞