天天看点

【C语言进阶剖析】27、数组的本质分析

1 数组的概念

2 数组的大小

3 数组地址与数组名

4 数组名的盲点

5 小结

数组是相同类型的变量的有序集合

【C语言进阶剖析】27、数组的本质分析

数组在一片连续的内存空间中存储元素

数组元素的个数可以显示或隐式指定

如下定义两个数组 a 和 b

【C语言进阶剖析】27、数组的本质分析

有两个问题?

a[2],a[3],a[4] 的值是多少?

b 包含了多少个元素?

下面我们就来实际操作一下:

可以看到数组 a 只初始化了前两个元素,后面三个元素没有初始化,自动初始化为 0。 数组 a 的长度为 20 字节,里面保存了 5 个 int 型的数据类型,数组 b 元素的个数被隐式初始化,根据元素的个数确定数组长度,所以数组 b 长度为 2,里面有两个 int 型的变量。 求解数组长度的方法:数组长度除以单个元素长度 sizeof(a)/sizeof(a[0]) 如果想将数组所有元素都初始化为 0,可以这么写: int a = { 0 }; 也就是第一个元素初始化为 0,后面的默认初始化,也是 0

数组名代表数组首元素的地址

数组的地址需要用取地址符 & 才能得到

数组首元素的地址值与数组的地址值相同

数组首元素的地址与数组的地址是两个不同的概念

数组名就是数组首元素的地址,所以 a 和 &a[0] 是一样的。 数组的地址指的是整个数组的地址,数值上等于数组首元素的地址,但是含义是不一样的。数组首元素的地址表示第一个元素的地址,一共只有一个元素,数组的地址表示整个数组的地址,一共有 5 个元素。这就好比是你家住小区第一户,你家的编号和小区编号一样,但是不能说整个小区都是你家。

数组名可以看做一个常量指针

数组名“指向”的是内存中数组首元素的起始位置

数组名不包含数组的长度信息

在表达式中数组名只能作为右值使用

只有在下列场合中数组名不能被看作常量指针

数组名作为 sizeof 操作符的参数

数组名作为 & 运算符的参数

为了更好的区别指针与数组,下面看个例子

不管数组大小如何变化,指针永远是 8 个字节(64位系统),指针与数组完全不是一概念

1、数组是一片连续的内存空间

2、数组的地址和数组首元素的地址意义不同

3、数组名在大多数情况下被当作常量指针处理

4、数组名其实并不是指针,不能将其等同于指针