目录
1.什么是二维数组?
在上篇文章中我们学习了一维数组,今天我们来了解一下二维数组。
一维数组中的元素都是内置类型的,如果我们将一维数组作为数组中的元素,那这时得到的就是二维数组;二维数组作为数组中的元素,得到的就是三维数组,以此类推,二维以上的数组我们统称为多维数组。
2.二维数组的创建
二维数组的语法格式如下:
type name_arr[常量值1][常量值2]
其中:
- type代表着数组的数据类型,可以是char、int、short、float等。
- name_arr代表着数组的名称,可以根据实际需求设置。
- 常量值1代表着数组有几行。
- 常量值2代表着一行数组有几个元素,即数组有几列。
例如:
int arr[3][5];
//代表着arr数组中存放着三行五列的整型元素
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}};
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}};
4.二维数组的使用
4.1 二维数组的下标
每个二维数组中的元素都有与之对应的下标,我们可以通过下标定位到需要的元素。二维数组的行和列都是从0开始的。
例如:
int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
如上图所示:arr[0][0]就是1;arr[2][4]就是7;arr[2][3]就是6。
#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]);
printf("%d\n", arr[2][3]);
return 0;
}
运行结果:
4.2 二维数组的输出和输入
当我们想要将数组的内容输入或输出时,可以像一维数组那样通过for循环来实现。代码如下:
#include <stdio.h>
int main()
{
int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
//输入
for(int i = 0; i < 3; i++)//遍历行
{
for(int n = 0; n < 5; n++)//遍历列
{
scanf("%d ", &arr[i][n]);//输入数据
}
}
//输出
for(int i = 0; i < 3; i++)//遍历行
{
for(int n = 0; n < 5; n++)//遍历列
{
printf("%d ", arr[i][n]);//输出数据
}
printf("\n");
}
return 0;
}
运行结果:
5.二维数组在内存中的存储
之前我们学习了一维数组在内存中的存储,现在我们同样用输出数组元素地址的方法来研究一下二维数组在内存中的存储方式。
#include <stdio.h>
int main()
{
int arr[3][5] = { 0 };
for(int i = 0; i < 3; i++)
{
for(int n = 0; n < 5; n++)
{
printf("arr[%d][%d]的地址为:%p\n", i, n, &arr[i][n]);
}
}
return 0;
}
运行结果:
由上述代码及其结果可得知:每一行中相邻的元素地址相差四(整型类型的大小);每两行相邻部分地址相差四;由此可得出结论:二维数组中的每个元素都是连续排列的。
6.变长数组
变长数组的使用实在C99及其之后。在C99之前,数组大小的指定只能为常量或常量表达式,又或者我们初始化数据时,可以省略数组大小。
int arr1[4];//常量
int arr2[3 + 5];//常量表达式
int arr3[] = { 1,2,3 };//初始化数据
在实际应用中,这三种创建方式是不够灵活的。创建大了浪费空间,创建小了又不够用,所以C99引入了变长数组(variable-length array,简称 VLA)的概念。允许我们通过变量来定义数组的大小。
请看下列代码:
int n = a + b;
int arr[n];
上述代码中,arr就是变长数组,它的长度取决于变量n的值,编译器无法确定,只有运行时才知道n的值,这也说明了变长数组的一个性质:变长数组不能初始化。变长数组的优点就是不必在开发时就随意的确定数组大小,可以在运行时根据需求进行精确确定。
下面使用gcc编译器来实践:
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);//根据输⼊数值确定数组的⼤⼩
int arr[n];//变长数组
int i = 0;
for (i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
for (i = 0; i < n; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
运行结果: