一、数组的定义
1、定义
数组:指针的特殊化。
它也是内存分配(空间申请)的一种形式,而不是一种全新的数据结构。
其目的就是为了定义一个连续的空间。
2、2个属性:
大小
读取方式
数据类型 数组名[m]:
[]:把数组名升级为一个连续空间
m:连续空间的个数。
数据类型:表示内存以何方式切割。
int a[100]; // 100个int这么大的连续空间
a[10] // 使用方式与指针是一样的
(1)m 就是一个建议符,只是在申请的时候用一下。后面使用的时候,编译器无法知道[]里面的数是否越界。
int a[100]; // 理论上,a的空间只有100个,但是只是建议;还是可以越界的。
(2)经典错误1:数组名是一个常量符号,只是一个标签常量,是无法改变的,一定不要放到=的左边
char buf[100];
buf = "hello world"; // 错误!
buf++; // 错误!
数组名是一个常量,指针是一个变量。
二、数组空间的初始化(数组空间的赋值问题)
原理:按照标签逐一赋值。(空间的赋值没有投机取巧的办法,只能这样做)
int a[10];
a[0] = x;
a[1] = y;
...
问题:
但如果这样赋值,程序员的工作量很大。
偷懒办法:让编译器进行一些自动处理,帮助程序员写如上的逐一赋值的程序。
方法:空间在定义时,就告知编译器初始化情况,这叫空间的第一次赋值。
int a[10] = 空间;
C语言本身/CPU内部本身,一般不支持空间和空间的拷贝,只支持int、int(4B)等之间小的拷贝。
int a[10] = {10, 20, 30}; -- > 学习arm汇编后,可以进行反汇编。
其内部相当于执行一个拷贝的过程。只是不同编译器调用不同的函数来做拷贝。
这句定义,其实CPU还是做了:
a[0] = 10;
a[1] = 20;
a[2] = 30;
a[3] = 0 / 随机值; (不同编译器可能有所不同)
...
所以,一定不要这样认为: