1. 二维数组的创建
1.1 二维数组的概念
如果把一维数组做为数组的元素,这时候的数组就是二维数组,二维数组作为元素的数组就是三维数组,二维数组以上的数组统称为多维数组。
这里我们可以把每一行都看做是一个一维数组。
2. 二维数组的创建
定义二维数组语法:
type arr_name[常量值1][常量值2];
定义二维数组:
int arr[3][5];
这段代码表示,定义一个int
类型的数组arr
,3表示数组有3行,5表示每行有5个元素。
3.二维数组的初始化
二维数组的初始化和一维数组一样,也是用大括号来初始化。
3.1 不完全初始化
int arr1[3][5] = {1,2};
int arr2[3][5] = {0};
3.2 完全初始化
int arr3[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
3.3 按行初始化
int arr4[3][5] = {{1,2},{3,4},{5,6}};
注: 初始化时可以省略行,但不能省略列
int arr5[][5] = {1,2,3};
4. 二维数组的使用
4.1 二维数组的下标
二维数组的访问也是下标形式的,并且二维数组是有行和列的,只要锁定了行和列就能找到二维数组中的一个元素。
而二维数组的行是从0开始的,列也是从0开始的。
比如:
int main()
{
int arr[3][5] = { 1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7 };
// 第0行 第1行 第2行
printf("%d\n", arr[2][4]);
return 0;
}
4.2 二维数组的输入和输出
通过上面了解了访问二维数组的单个元素,如果想访问整个数组,那只要产生行和列的数字就可以,以上面代码为例,行的范围是 0~2,列的范围是 0~4 ,所以仍然可以借助循环来访问所有元素:
int main()
{
int arr[3][5] = { 0 };
//输入
//访问行
for (int i = 0; i < 3; i++)
{
//访问列
for (int j = 0; j < 5; j++)
{
scanf("%d", &arr[i][j]);
}
}
//输出
//访问行
for (int i = 0; i < 3; i++)
{
//访问列
for (int j = 0; j < 5; j++)
{
printf("%d ", arr[i][j]);
}
//打印完一行换行
printf("\n");
}
return 0;
}
5. 二维数组在内存中的存储
像一维数组一样,如果想观察二维数组的存储方式,也可以打印出所有元素的地址:
int main()
{
int arr[3][5] = { 0 };
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个字节,所以二维数组中的元素也都是连续存放的: