数组

  1. int array[5];

编译器识别到中括号后把 array 视为一个数组的地址,根据中括号里的内容增加补充信息。

  1. int array[5] = {1,1,2,2,2}; //初始化

数组的遍历方式

  1. for(index = 0; index < sizeof days / sizeof day[0]; index++)

每个元素的内存占用大小一致

VLA

VLA(变长数组),实际意思其实是「以变量作为长度的数组」——区别于「以常数作为长度的数组」。VLA的目的就是数组的长度是由一个变量指定的而非常数。

一维数组

完全初始化,只有在定义的时候方括号才表示个数其他时候都是指第几位,只有在定义的时候才可以使用大括号

  1. int array[5] = {1,1,2,2,2};

部分初始化,未被初始化的元素为 0 ,

  1. int array[5] = {1,1,2};

不初始化,所有元素都是垃圾值

  1. int array[5];

常用初始化方法:

  1. int array[5] = {0};

数组名

数组名不代表数组,而代表数组第一个元素的地址,

  1. let obj = [] //js
  2. int obj[5]; //c

js 中数组名代表数组,从定义方式就可以看出区别

数组参数

当数组作为函数的形参时,会退化成指针,int array [3] -> int *array ,此时里面的数字没有意义

  1. int func (int array [3], int length) {}

1、array 只是指针
2、必须传入数组长度,否则信息不全,更高级的语言将长度作为数组的一部分但是会占用更多的内存

二维数组

关于二维数组的行列:

  1. a[0][0] a[0][1]
  2. a[1][0] a[1][1]

这样来看第一个数字代表行,最大的下标只能在右下角

  1. int a[3][4] = {}; //初始化
  2. int a[3][4] = {............};
  3. ina a[3][4] = {
  4. {....},
  5. {....},
  6. {....}
  7. }

C语言-数组 - 图1
在内存中实际上二维数组也是按照像一维数组那样的存储

二维数组作为参数

  1. int func(int array[][coloum], int coloum) {}

退化成

  1. int func(int (*array)[coloum], int coloum);

数组作为返回值

  1. int func() {
  2. int res[] = {0};
  3. return res;
  4. }

由于数组名是地址,而且 res 是自动变量,所以当 func 函数调用完之后,数组占用内存被释放,res 变成野指针。如果要返回数组可以传入一个数组来存放。