1.一维数组的创建和初始化
1.1数组创建
数组:是一组相同类型元素的集合
创建方式:
type_t arr_name [const_n]
//type_t是值数组的元素类型 ,arr_name是数组名,const_n是一个常量表达式,用来指定数组的大小。注:在c99中支持变长数组,即可用变量来指定数组大小,不支持c99的编译器则不能使用
1.2数组的初始化
初始化是指在创建数组的同时给数组的内容一些合理初始值,例:
int arr1[10] = {1,2,3};//不完全初始化,将数组前三个元素分别初始化为123,后面元素初始化为0
int arr2[] = {1,2,3,4}
int arr[10] = {0};
数组在创建的时候如果想不指定数组的确定的大小就得初始化。数组的元素个数根据初始化的内容
来确定。
1.4一维数组在内存中的存储
以一段代码为例:
我们发现数字首元素地址与下一位元素地址相差4,往后依次相差4,可知,随数组下标的增长,元素的地址也有规律的递增。于是我们得出结论:一维数组在内存中是连续存放的,数组地址由低地址向高地址递增。
2.二维数组的创建及初始化
2.1二维数组创建
int arr[3][4];
char arr[3][5];
2.2二维数组的初始化
int arr[3][4] = {1,2,3,4}; //其中[3]表示有三行,[4]表示有四列
int arr[3][4] = {{1,2},{3,4}};
注:二维数组如果有初始化,行可以省略,但列不能省略。
二维数组同样可以通过下标去寻找元素。
2.3二维数组在内存中的存储
与一维数组一样,二维数组在内存中也是连续存储的
你想象中的二维数组
实际上的二维数组
这也是为什么行可以为空,但列不能为空。
3.数组越界
数组下标在一个数组中是由界限的,数组下标规定从0开始,假定该数组有n个元素,那么它的范围就是[0——n-1】。如果下标小于0或者大于(n-1),那么就是数组越界访问。
c语言本身不做数组下标的越界检查,所以编译器不一定会报错,所以需要程序猿在写代码是注意自己的数组越界问题
4.数组作为函数参数
再写函数时,有时会将一个数组作为参数传给这个函数,以实现一个冒泡排序为例
当完成代码时发现结果并没有排序 ,这里就涉及到了数组名的概念:
数组名就是数组首元素地址(绝大多数情况下)
但存在两个例外:
1.sizeof(数组名),数组名不是数组首元素的地址,数组名表示整个数组,计算的是整个数组的大小
2.&数组名,数组名不是数组首元素地址,数组名表示整个数组,取出的是整个数组的地址
这里在main函数里,sizeof(arr)表示整个数组的大小,而传入bubble_sort函数中的arr,其实本质上是一个首元素地址,所以bubble_sort函数中求sz(元素个数)的求法错误。
正确写法:
在main函数中提前求出sz,再将sz作为一个参数传入bubble_sort函数中即可解决问题。