数组
int array[5];
编译器识别到中括号后把 array 视为一个数组的地址,根据中括号里的内容增加补充信息。
int array[5] = {1,1,2,2,2}; //初始化
数组的遍历方式
for(index = 0; index < sizeof days / sizeof day[0]; index++)
每个元素的内存占用大小一致
VLA
VLA(变长数组),实际意思其实是「以变量作为长度的数组」——区别于「以常数作为长度的数组」。VLA的目的就是数组的长度是由一个变量指定的而非常数。
一维数组
完全初始化,只有在定义的时候方括号才表示个数其他时候都是指第几位,只有在定义的时候才可以使用大括号
int array[5] = {1,1,2,2,2};
部分初始化,未被初始化的元素为 0 ,
int array[5] = {1,1,2};
不初始化,所有元素都是垃圾值
int array[5];
常用初始化方法:
int array[5] = {0};
数组名
数组名不代表数组,而代表数组第一个元素的地址,
let obj = [] //js
int obj[5]; //c
js 中数组名代表数组,从定义方式就可以看出区别
数组参数
当数组作为函数的形参时,会退化成指针,int array [3] -> int *array ,此时里面的数字没有意义
int func (int array [3], int length) {}
1、array 只是指针
2、必须传入数组长度,否则信息不全,更高级的语言将长度作为数组的一部分但是会占用更多的内存
二维数组
关于二维数组的行列:
a[0][0] a[0][1]
a[1][0] a[1][1]
这样来看第一个数字代表行,最大的下标只能在右下角
int a[3][4] = {}; //初始化
int a[3][4] = {............};
ina a[3][4] = {
{....},
{....},
{....}
}
在内存中实际上二维数组也是按照像一维数组那样的存储
二维数组作为参数
int func(int array[][coloum], int coloum) {}
退化成
int func(int (*array)[coloum], int coloum);
数组作为返回值
int func() {
int res[] = {0};
return res;
}
由于数组名是地址,而且 res 是自动变量,所以当 func 函数调用完之后,数组占用内存被释放,res 变成野指针。如果要返回数组可以传入一个数组来存放。