目录
一维数组(数组基础)
数组的创建
数组是一组相同类型的集合
创建数组eg.
C99标准后,数组长度可以使用变量
数组的初始化
数组的初始化是指,在创建数组的同时给数组的内容一些合理初始值(初始化)
可完全初始化或者不完全初始化,若不完全初始化,剩余元素默认为0
若不自定义数组长度,则默认恰好包含初始化的值
若为字符串(ch4)数组前三位值为abc, 第四位为\0,剩余为0
若直接初始化为字符(ch3),前三位为abc,其余为0
数组的使用
- [],下标引用操作符。它其实就数组访问的操作符
- 数组下标0 1 2 3 4 5 6...
- for 循环中求下标最大值(sz)
int sz = sizeof(arr) / sizeof (arr[0] )
一维数组在内存中的储存
仔细观察输出的结果,我们知道,随着数组下标的增长,元素的地址,也在有规律的递增
由此可以得出结论:数组在内存中是连续存放的。
二维数组
创建
行可省略,列不可省略
eg. arr [ ][4]
原因
因为数组在内存中连续存放,若不规定列的数量,访问时则无法计算坐标
对于二维数组int array[M][N], 说明如下:
- M和N都必须为常数,
- M代表数组有M行,N代表每行中有N个元素
- 其中M可以省略,省略后必须给出初始化表达式,编译器从初始化结果中推断数组有多少行
- N一定不能省略,因为N省略了就不能确定一行有多少个元素,也不能确定数组有多少行
初始化
使用
二维数组使用时可以理解为一个矩阵
二维数组的存储
- 连续储存,同一维数组
- 可以理解为数组的数组
内层数组名为arr[0], arr[1], arr[2]
这两个数组(分别为一维和二维)在内存中完全相同
仅有访问方式有区别
数组越界
- 数组的下标是有范围限制的。
- 数组的下规定是从0开始的,如果数组有n个元素,最后一个元素的下标就是n-1。
- 所以数组的下标如果小于0,或者大于n-1,就是数组越界访问了,超出了数组合法空间的访问。
- C语言本身是不做数组下标的越界检查,编译器也不一定报错,但是编译器不报错,并不意味着程序就是正确的,所以程序员写代码时,最好自己做越界的检查。
数组作为函数参数
往往我们在写代码的时候,会将数组作为参数传个函数
比如:我要实现一个冒泡排序(这里要讲算法思想)函数将一个整形数组排序。
数组传参只会传数组首元素的地址,所以如果在函数内计算数组大小,大小为4字节,等于首元素的大小
所以 sz (数组长度)应在函数外部计算,再传过去
数组名确实能表示首元素的地址
但是有2个例外:
- sizeof ( 数组名),这里的数组名表示整个数组,计算的是整个数组的大小,单位是字节
- &数组名,这里的数组名表示整个数组,取出的是整个数组的地址
二维数组数组名的理解
- 二维数组的数组名也表示数组首元素地址
- 但二维数组的首元素其实是 第一行的地址
行和列的算法
行数
整个数组大小 / 首行大小
列数
首行大小 / 首元素大小