ʕ • ᴥ • ʔ
づ♡ど
🎉 欢迎点赞支持🎉
个人主页: 励志不掉头发的内向程序员;
专栏主页: C语言基础;
文章目录
[1.1 二维数组的概念](#1.1 二维数组的概念)
[2.1 不完全初始化](#2.1 不完全初始化)
[2.2 完全初始化](#2.2 完全初始化)
[2.3 按照行初始化](#2.3 按照行初始化)
前言
小伙伴们好啊,我们上一章节讲述了一维数组的各种基本语法,明白了一维数组的创建及输入输出以及销毁等,不知道大家有没有想过,数组难道只有一维嘛,有没有更高维,它们又是什么样子的呢,高维数组又有什么作用,那就让我们一起来看看吧。
一、二维数组的创建
1.1 二维数组的概念
我们之前学到了一维数组,数组里面储存的元素是我们计算机的内置类型,而我们把一维数组整体当作一个数组元素,很多个这样的数组的组合就是二维数组,如果我们把二维数组当作一个数组元素同理可得出三维数组,二维数组以上统称为多维数组。
1.2二维数组的创建
我们来看看二维数组的创建方式
type arr_name[常量值1][常量值2];
例如:
int arr[3][5];
char ch[4][3];
如上我们可以总结出以下几点:
1.数据类型,如 int arr[3][5] 的数据类型就是int型,也就是说它里面的各个元素都是int型。
2.我们可以知道arr后面带了两个常量值,这其中的常量值1 表示的是有几行,而常量值2则是表示有几列,如我们上面的那张图片就是3行5列的二维数组,所以就是arr[3][5]。
- 像arr呀,ch呀,都是数组名,是自己所赋予的最好是有意义的名字。
二、二维数组的初始化
我们在创建变量的时候进行赋值叫做初始化,二维数组的初始化和一维数组是相同的,都是用大括号进行初始化。
2.1 不完全初始化
和一维数组类似,但是又不完全相同,二维数组的初始化如果不完全的话,计算机也是会默认没有初始化的部分是为0的,我们可以来观察一下。
cs
int main()
{
int arr[3][5] = { 1, 2, 3, 4, 5 };
return 0;
}
这是一个3行5列的二维数组,而且数组类型是int型。
我们可以在监视的地方看到,arr这个二维数组是由三个一维数组组成的,而我们初始化先对二维数组里的第一个一维数组进行初始化,等一维数组的数据满了以后才会对第二个数组进行初始化,如果没有初始化的地方,计算机是默认为0的。那有没有什么办法能给我们二维数组中的第一个一维数组没满的情况下也能在第二个一维数组里输入元素呢,当然可以,我们可以在大括号里面再加一个大括号来区分二维数组和一维数组。
cs
int main()
{
int arr[3][5] = { {1, 2, 3}, {2, 3, 4}, {3, 4, 5} };
return 0;
}
如图所示,我们可以在大括号里面再加一个大括号用来表示二维数组的元素,也就是一维数组。
我们可以看到,它们每一个一维数组都不完全初始化了,这就是二维数组的不完全初始化。
2.2 完全初始化
二维数组的完全初始化和一维数组差不多,就是把每个元素都初始化,但是我们可以用大括号来区分不同二维数组的元素。
cs
int main()
{
int arr[3][5] = { {1, 2, 3, 4, 5}, {2, 3, 4, 5, 6}, {3, 4, 5, 6, 7} };
return 0;
}
2.3 按照行初始化
按行初始化本质上就是用大括号把二维数组的各个元素,也就是一维数组区分开来,然后再进行初始化,因为一维数组的个数即是行数。
另:我们知道一维数组可以省略数组名后面[ ]里的常量值,可以由计算机来计算常量值应该是多少,二维数组也是同理的,但是它不能两个[ ]里的都省略,它只能省略前面的内容而不能省略后面的内容,也就是它只能省略行而不能省略列,如果都省略掉行,计算机可以通过计算来知道应该有几行,但是如果省略掉列,那计算机就没办法知道一个元素内该赋予多少个值。所以只能省略行而不能省略列。
三、二维数组的使用
我们明白了二维数组的创建方式,那么二维数组该如何使用呢,它的使用方式和一维数组一样吗,我们接下来看看。
3.1二维数组的下标
我们都知道,二维数组是分为行和列的,数组名后面的第一个[]表示的就是行数,第二个[]表示的就是列数,所以说它把里面的每个元素都按行按列给了下表。
我们创建一个这样的三行五列的二维数组,它本质上是这个样子的。
它和一维数组相同,下标都是从0开始到n-1的,像元素1的下标就是0,0,我们想取1出来就让计算机输入arr[0][0]即可。
如果想取这个4,那就是arr[1][2],是先行再列,不是先列再行。
3.1二维数组的输入和输出
我们知道了一维数组的输入和输出主要是运用循环的方式实现的,那二维数组呢?二维数组不就是在一维数组的基础上增加了几行嘛,我们依然可以用循环来实现二维数组。
我们可以使用循环的嵌套,一个循环来控制二维数组的行数,一个循环来控制二维数组的列数,就如图所示,
cs
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]);
}
}
//当j遍历了一边后i++,这样就实现了遍历二维数组,我们在
//它每个元素进行输入,这就是二维数组的输入。
//输出
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 5; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
}
这样我们就实现了二维数组的输入和输出。
四、二维数组的内存存储
我们在表现二维数组的时候是张这个样子的,
但是二维数组在内存存储的过程中是什么样子的呢,是不是连续的呢,我们可以来看一下,具体的办法和一维数组相同。我们来看一下它们的地址。
cs
int main()
{
int arr[3][5] = { 0 };
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 5; j++)
{
printf("arr[%d][%d] = %p\n", i, j, &arr[i][j]);
}
}
return 0;
}
我们可以看到它们不但每个一维数组内连续的,而且数组之间的内存也是连续的,它在内存中的样子应该是这个样子的,
元素与元素之间在内存上是连续的,和一维数组是一样的。
五、C99中的变长数组
在C99标准前,C语言的在创建时只能用常量或者常量表达式,如
int arr[5] = { 0, 1, 2, 3, 4 };
int arr[2 + 3] = { 0, 1, 2, 3, 4 };
int arr[ ]= { 0, 1, 2, 3, 4 };
这样的语法限制让我们在创建数组的时候就很不灵活,如果创建大了就浪费空间,如果创建小了那就不够用,所以在C99中就引入了一个变长数组的特性,允许我们可以使用变量来指定数组大小。变长数组只是说我们可以用变量来改变数组,而不是说我们可以让数组任意变长变短。
cs
int main()
{
n = a + b;
int arr[n] = { 0 };
return 0;
}
遗憾的是vs2022虽然引用了很多C99的语法,但是变长数组却没有,所以这里就当了解一下吧。
总结
以上就是数组的全部内容,其实数组的本质是指针,这个我们在指针时再讲,我们接下来就开始来聊聊函数啦,感谢大家的观看,如果有错误请指出,我一定马上更正,谢谢大家。