好比现实中的火车,一个火车头加上若干个火车车厢,车厢可以存放我们想要存放的物品;数组也是与火车类似的模型
一维数组
数组,可以理解成一串数据的组合;将内存想象成一列有若干个车厢的火车,每一个车厢都有属于自己的编号并按顺序排列。数组就是以某一节车厢为起点,根据定义时的元素数量,以及数据类型的长度,来分配一连串的内存空间
例如int类型的数组,因为int类型长度为4,所以每一个数组元素都能分配到四节连续的车厢(四个字节)的空间
int hc[4];
(网上找的图)
如上,我定义了一个有四个元素的int类型数组,就如图中所示,每四节车厢都可以存入一个int类型的数据(如常量6)
一维数组的定义
数据类型 数组名[数组内元素数量];
int oa[4];
如上为定义一维数组的语法
- 数据类型为数组内储存元素的类型
- 数组定义时需要声明数组能储存元素的数量,也就是数组长度
- 数组长度必须为常量如下所示为非法定义数组
int a = 6;
int oa[a]; //报错
我们也可以用宏定义的方式定义符号常量来给出数组长度,宏定义为头文件define
#define N 6
int oa[N];
宏定义的内容放在以后详说,读者可以自行查资料,这里只要知道这句代码的作用即可
一维数组的初始化
如上面的图,数组定义以后并没有对其初始化,这时候我们对其进行访问得到的一般是它的内存地址,初始化为对其赋予初始值
int oa[4] = {1,2,3,4};
可以看到,我们对数组进行初始化是在赋值符号(=)后面用大括号表示,并依序对数组内空间赋值。
如果对数组赋值时赋值数量大于数组长度,则会因为内存溢出而报错
int oa[4] = {1,2,3,4,5}; //内存溢出
如果对数组赋值是赋值数量小于数组长度,则会自动将剩下的元素自动赋值0
int oa[4] = {1,2};
for (int i=0; i<4; i++)
{
printf("%d ", oa[i]);
} //用循环遍历数组内容
运行结果为
1 2 0 0
一维数组的访问
数组内有多个同类型元素,我们可以用数组下标的方式进行访问
int oa[4] = {1,2};
for (int i=0; i<4; i++)
{
printf("%d ", oa[i]);
} //用循环遍历数组内容
数组的下标为以0为起点,从数组第一个元素开始,每个元素逐一递增的整形常量,如
- 0,1,2,3,4,5,6…
- 每个元素对应一个下标
- 对数组的访问可以用变量表示下标
int a = 2;
int oa[4] = {1,2,3,4};
printf("%d", oa[a]);
运行得到
3
二维数组
二维数组的定义
数据类型 数组名[行数][列数]
int oa[4][6];
如上为定义二维数组语法
- 行数与列数均与一维数组的数组长度一般,只能为常量
同一维数组一般,二维数组其实就是若干个(行数)一维数组(以为数组长度为列数)组合而成,并且这若干个一维数组在内存中均是连续的
如图所示,每一个格子都能存入一个数据
为了更直观理解二维数组,我们可以将它看成一个平面图
假设每个格子都为一个盒子,二维数组拥有
(行数)*(列数)个盒子,也就是能存入如此多个数据
二维数组的初始化
二维数组的初始化方式与一位数组一致
int oa[4][6] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24};
因为二维数组可以看成有行数个列数长度的一维数组,所以也可以用大括号来对每一个一维数组赋值
int oa[4][6] = {{1,2,3,4,5,6},{7,8,9,10,11,12},{13,14,15,16,17,18},{19,20,21,22,23,24}};
也如同一维数组一般,赋值时对缺少的部分会自动赋值为0
int oa[4][6] = {1,2,3,4};
结果如图
对二维数组中的一维数组逐一赋值时,也会对缺少部分自动赋值为0
int oa[4][6] = {{1,2,3,4},{7,8,9},{13,14,15,16,17,18}};
结果如图
二维数组的访问
二维数组的访问方式也同一位数组一般,可通过下标进行访问;二维数组的下标定位如图所示
通过下标直接访问
int oa[4][6] = {0};
printf("%d", a[3][6]);
也可以通过循环将数组打印出来
int oa[4][6] = {{1,2,3,4,5,6},{7,8,9,10,11,12},{13,14,15,16,17,18},{19,20,21,22,23,24}};
int main()
{
for (int i =0; i < 4; i++)
{ // 外层循环i控制行数
for (int j = 0; j < 6; j++)
{ //。内层循环j控制列数
printf("%d\t", oa[i][j]);
}
printf("\n");
}
}
运行结果如下
1 2 3 4 5 6
7 8 9 10 11 12
13 14 15 16 17 18
19 20 21 22 23 24
数组实际应用
通过这些基础方法便可以实现对数组的一系列操作,比如通过循环定位后交换两个元素的值
通过这种算法实现简单的数组排序,也可以思考一下怎么实现数组元素的查找,以及如何在数组中间插入一个数据