今天继续复习数组的内容,一维数组说过了,接下来是二维数组!
一、 ⼆维数组定义
1.1 ⼆维数组的概念
上次学习的数组被称为⼀维数组,数组的元素都是“内置类型”的,如果我们把⼀维数组做为数组的元素,这时候就是⼆维数组,⼆维数组作为数组元素的数组被称为三维数组,⼆维数组以上的数组统称为多维数组。
-
注:数据类型主要分为内置类型和自定义类型两大类,其中内置类型又分为整形(int)、浮点型(float)、字符型(char)和布尔类型(bool)四种;自定义类型又分为数组(array)、结构体(struct)、枚举(enumeration)和联合体(union)四种。
-
二维数组具象化如下图所示:
1.2 ⼆维数组的创建
1 type arr_name[常量值1][常量值2];
2
3 例如:
4 int arr[3][5];
5 double data[2][8];
解释:上述代码中出现的信息
• 3表⽰数组有3⾏
• 5表⽰每⼀⾏有5个元素
• int 表⽰数组的每个元素是整型类型
• arr 是数组名,可以根据⾃⼰的需要指定名字
(具象化举例见上图二维数组)data数组意思基本⼀致。
1.3 ⼆维数组的初始化
- 同一维数组一样二维数组创建时也要初始化!
1.3.1 不完全初始化
int arr1[3][5] = {1,2};
int arr2[3][5] = {0};
- 数组中存放的内容见下图:
不完全初始化时,数组剩余的元素空间默认为0,这点同一维数组一样,一维数组没提到,这里补充一下!
1.3.2 完全初始化
int arr3[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
//另一种写法
int arr3[3][5] = {{1,2,3,4,5} ,{2,3,4,5,6} ,{3,4,5,6,7}};
1.3.3 按照行初始化
int arr4[3][5] = {{1,2},{3,4},{5,6}};
1.3.4 初始化时可省略行不能省略列
int arr5[][5] = {1,2,3};
int arr6[][5] = {1,2,3.4.5.6.7};
int arr7[][5] = {{1,2},{3,4},{5,6}};
-注:对于二维数组则可以看成是一维数组的嵌套,一维数组里的每个元素,又都是一个数组(包含几个元素),这个数组就是二维数组。会有些绕,慢慢理解!
二、 ⼆维数组的使用
2.1 ⼆维数组的下标
当我们掌握了⼆维数组的创建和初始化,那我们怎么使⽤⼆维数组呢?
其实⼆维数组访问也是使⽤下标的形式的,⼆维数组是有⾏和列的,只要锁定了⾏和列就能唯⼀锁定
数组中的⼀个元素。
二维数组的下标 行,列 都是从 0 开始的
图中最左侧绿⾊的数字表⽰⾏号,第⼀⾏蓝⾊的数字表⽰列号,都是从0开始的,⽐如,我们说:第2
⾏,第4列,快速就能定位出7。
#include <stdio.h>
int main()
{
int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
printf("%d\n", arr[2][4]);
return 0;
}
2.2 ⼆维数组的输入输出
二维数组的输入输出同一维数组的方法是一样的,同样采用FOR循环,只不过需要多加一个FOR循环,去把行,列的个数进行一一遍历。
下面直接上代码和运算结果,不再过多介绍。
#include <stdio.h>
int main()
{
int arr[3][5] = {0};
int i = 0;//遍历⾏
//输⼊
printf("输入数据:\n");
for (i = 0; i < 3; i++) //产⽣⾏号
{
int j = 0;
for (j = 0; j < 5; j++) //产⽣列号
{
scanf("%d",&arr[i][j]); //输⼊数据
}
}
//输出
printf("输出数据:\n");
for (i = 0; i < 3; i++) //产⽣⾏号
{
int j = 0;
for (j = 0; j < 5; j++) //产⽣列号
{
printf("%d ", arr[i][j]); //输出数据
}
printf("\n");
}
return 0;
}
- 这里代码把输入输出写到了一起,运行结果如下:
三、 ⼆维数组在内存中的存储
像⼀维数组⼀样,我们如果想研究⼆维数组在内存中的存储⽅式,我们也是可以打印出数组所有元素
的地址的。代码如下:
#include <stdio.h>
int main()
{
int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
int i = 0;
int j = 0;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 5; j++)
{
printf("&arr[%d][%d] = %p\n", i, j, &arr[i][j]);
}
}
return 0;
}
从输出的结果来看,每⼀⾏内部的每个元素都是相邻的,地址之间相差4个字节,跨⾏位置处的两个元素(如:arr[0][4]和arr[1][0])之间也是差4个字节,所以⼆维数组中的每个元素都是连续存放的。
如下图所⽰: