数组
廖家龙 用心听,不照做

局部变量的回收:在大括弧执行完毕之后,定义在这个大括弧中的变量就会被系统立即回收,声明变量的时候,其实是找系统为你从高地址向低地址分配指定字节数的连续空间,当变量回收的时候,其实就是告诉系统变量占用的字节不再使用了,可以分配给别的变量了,变量所占用的字节的数据是不会清空的【垃圾值的由来】

当将全局变量声明出来以后,系统会自动的将全局变量中的数据清零

一维数组:

int arr[3];,其中所有的元素具有相同的数据类型,一旦创建,不能改变大小

数组中的元素在内存中是连续依次排列的:

遍历数组:

一维数组的初始化:
1)使用这种方式初始化,数组的长度就不能使用变量了,但是使用宏可以【也可以干脆直接省略数组中的长度,这样数组的长度就是由大括弧中的数据的个数来决定的】

1
2
int len=3;
int arr[len]={10,20,30}; //错误

2)int arr[3]={10};
这个时候数组的第0个元素的值是10,其他的元素的值被自动初始化为0,所以如果我们要将数组中的所有元素全部初始化为0,只需要在大括弧中写一个0就可以了

3)指定下标的初始化,其他的元素的值就自动初始化为0:
int arr[3]={[1]=10,[2]=20};

声明一个数组,在内存中从高字节向低字节申请连续的(数组的长度*每个元素的字节数)个字节的空间

数组的元素的本质就是一个普通类型的变量,一个数组就是由多个普通类型的变量联合而成的

C语言的数组名中存储的就是数组的地址!

数组的大小:sizeof(a)/sizeof(a[0])
sizeof给出整个数组所占据的内容的大小,单位是字节;sizeof(a[0])给出数组中单个元素的大小,于是相除就得到了数组的单元个数;这样的代码,一旦修改数组中初始的数据,不需要修改遍历的代码

数组的赋值:数组变量本身不能被赋值,要把一个数组的所有元素交给另一个数组,必须采用遍历

1
2
3
4
for(int i=0;i<length;i++){
b[i]=a[i];
}

二维数组:

二维数组的长度一般认为是元素的个数【行*列】

二维数组的遍历:a[i][j]是一个int,表示第i行第j列上的单元

二维数组的初始化:

1)

1.列数是必须给出的,行数可以由编译器来数
2.每行一个{},逗号分隔
3.最后的逗号可以存在,有古老的传统

2)

1
2
3
4
5
int arr[3][4]={{10},{20},{30}};
a[0][0]=10
a[1][0]=20
a[2][0]=30

其他元素会自动初始化为0

3)
int arr[3][4]={10,20,30,40,50};
按照顺序去初始化每一个元素,其他的元素的值就会被自动初始化为0

4)
int arr[3][4]={[1]={10,20,30,40},[2]={50,60,70,80}};
给指定的行初始化,其他的元素自动初始化为0

二维数组从高地址向低地址申请了连续的(行每一个元素占用的字节)个字节空间

二维数组在内存中仍然是一块连续的空间,并不是一个表格

求二维数组的长度的方法与一维数组一样:sizeof(arr)/sizeof(arr[0][0]);

求二维数组的行数:sizeof(arr)/sizeof(arr[0]);

求二维数组的列数:sizeof(arr[0])/sizeof(arr[0][0]);

如果函数的参数是一个一维数组,那么我们在传递的时候可以传递二维数组的某一行,二维数组的行其实是一个一维数组

二维数组也可以作为函数的参数【与一维数组类似】,但是其中形参的行数可以省略,列数不能省略,实参与形参的行数可以任意,实参的列数与形参的列数必须一致

解决方案【与一维数组稍微不同!】