数组
1、数组认知:
a/静态分配空间 ————缺点:空间利用率差(1.不够用2、浪费空间)
b/所在内存空间特点:连续的(物理连续)【物理空间连续】---开销小——malloc分配的空间是否物理连续?(物理不连续但逻辑连续)malloc实现原理:链表链接所有的空闲的空间,组成最终分配的空间
2、如何使用数组:
a/定义数组:数组该定义多大? 无法解决数组大小问题 ——数组的缺点
注意事项:
c99- 可变长数组:可以用变量来定义数组的长度,不能在使用过程中已修改变量的值,来扩充数组的内存空间
柔性数组
c89定义数组时,必须要确定的长度---选择方式:通常用宏来表示数组的大小,可以提高代码的移植性————
b/数组的使用:
使用数组前要先清零——
面试题:数组名的作用
一维数组名:指针常量--不能修改元素的值(元素类型指针),保存的是数组首元素的地址
a:数组名。指针常量,保存数组首元素地址
&a:对数组名取地址,等于数组的地址;
*(&a) = a :对一维数组的地址取值等于数组首元素的地址
整型变量的地址用整型指针变量保存
字符变量的地址用字符指针变量保存
数组的地址用数组指针变量保存
数组指针变量:变量,保存的是地址,地址是数组的地址
int (*pa)[3] :pa是一个变量,保存的是地址,该地址是数组的地址,该数组是一个整型数组,有三个元素;
二维数组的定义:不能省略行但可以省略列
二维数组名的作用
二维数组名:指针常量(一维数组指针),保存首个一维数组的地址
三位维组
int aaa[2][2][2] = {{1,2,3,4},{5,6,7,8}};
第一个下标:第几个个二维数组
第二个下标:第几个个二维数组第几行
第三个下标:第几个个二维数组第几行第几列
如何定义数组指针变量----右左法则 int(*pa)[2]
使用场景:函数传参
三维数组名的作用:首个二维数组的地址
指针数组 int *p[3];
int main (int argc ,char *argv[]){}
使用注意事项
1、局部指针数组里元素都是野指针,需要分配空间
2、用完之后要释放并置空
传一维数组名,用元素的指针;因为一维数组的单位是元素
传二维数组名,用一维数组指针;因为二维数组单位是一维数组
传三维数组名,用二维数组指针;单位是二维数组,保存的是二维数组地址
传指针数组名,用指针的指针;
指针和数组的区别
空间分配、访问效率、安全性、函数形参
指针是动态分配的,数组是静态分配的,指针所指的空间不一定是连续的因为有可能是通过malloc分配的是动态分配,数组是静态分配的物理空间是连续的
访问效率 数组 > 指针 但指针更灵活,指针可以实现随机访问
安全性是数组 > 指针 指针容易造成野指针,造成内存泄露
函数传参 数组会退化成指针