目录
一、一维数组的创建和初始化
1.数组
数组是由数据类型相同的一系列元素组成。
2.一维数组的创建
type_t arr_name [const_n]
type_t 是指数组的元素类型
arr_name 数组的名字
[const_n] 常量表达式,用来指定数组的大小(通常默认必须是常量,但在C99语法中支持变量,即变长数组)
例:int arr1[10]; //内含10个int类型元素的数组
char ch[5]; //内含5个char类型元素的数组
3.一维数组的初始化
数字的初始化是指,在创建数组的同时给数组的内容一些合理初始值。
1.整数类型的数组
在不完全初始化时,其余元素默认为0。
int arr3[ ] = {1,2,3,4,5}; //未标注的情况下,会根据花括号中的内容,元素个数默认为5
2.字符类型的数组
- 字符数组以\0结尾。
- 在不完全初始化时,其余元素默认为0(或\0)。
- 字符用单引号引起来,字符串用双引号引起来。
同理,长度也是如此。
42是一个随机值。
4.一维数组的使用
要访问数组中的元素,通过使用数组下标数(也称为索引)表示数组中的各元素。
数组下标是从0开始的。
对于一维数组的基本访问:
5.地址
- 一维数组在内存中是连续存放的
- 随着数组下标的增长,地址是由低到高变化的
正是因为一维数组在内存中是连续存放的,所有能通过p++,打印整个数组。
二、二维数组的创建和初始化
1.二维数组的创建
int arr1[3][4]; //3行4列
char ch1[2][3]; //2行3列
2.二维数组的初始化
3.二维数组的使用
二维数组的使用是通过下标的方式。
例:打印二维数组
思路:通过下标访问数组。
4.二维数组在内存中的储存
打印数组中每个元素的地址,可以发现:
- 二维数组在内存中也是联系存放的
- 一行内部是连续的,跨行也是连续的
这也说明,二维数组在内存中的存放,可能并非我们想象的那么立体。
那么如何检验二维数组确实在内存中连续存放呢?
如图所示,通过数组元素的地址来打印数组,证明了数组的地址在内存中是连续存放的。
数组名
三、数组越界
数组的下标是有范围限制的。
数组的下标规定,从0开始,若数组有n个元素,最后一个元素的下标是n-1。
如果数组的下标小于0,或者大于n-1,就是数组越界访问了,超出了数组合法空间的访问。
C语言是不对数组下标做越界检查的,编译器不一定会报错,需要程序员写代码时,自己做越界检查。
四、数组作为参数函数
例:对数组中的元素进行排序,从小到大
优化:
注:int sz = sizeof(arr) / sizeof(arr[0]); 不能放在函数里去计算。因为数组传参的时候,传过去的不是整个数组,传过去的是数组首元素的地址,即形参arr的本质是指针,传过去之后,无法计算出正确的sz。
五、数组名
1.数组名是首元素的地址。
2.数组名是首元素的地址,但是有2个例外。
- sizeof(数组名)-数组名表示整个数组,计算的是整个数组的大小,单位字节。
- &数组名 -数组名表示整个数组,取出的是整个数组的地址。