目录
1.数组的概念
数组是一组具有相同类型元素的集合,它是一种顺序存储、随机访问的顺序表结构。最简单的数组类型就是一维数组,一维数组中的元素一个接一个地编排在单独一行内,这里假设有一个名为a的一维数组:
为了声明数组,需要指明数组元素的类型和大小。
2. 一维数组的创建和初始化
2.1数组创建
一维数组创建的基本语法如下:
type arr_name[常量值];
①:type指的是数组中存放的元素是什么类型,可以是int,float,double,char等,也可以是自定义类型。
②:arr_name指的是数组名,尽量做到见名知意
③:[ ] 中的常量值是用来指定数组大小的,根据实际需求指定即可
具体使用代码如下
2.2数组的初始化
有时候,我们在创建数组的时候,需要给定一些初始值,就称为数组的初始化。数组的初始化一般使用大括号,将数据放在大括号中。
数组的初始化也分成两种,一种是完全初始化,另一种是不完全初始化,完全初始化就是给数组中的每个元素都赋值,不完全初始化就是只赋值一部分,但是剩下未赋值的部分默认为0,可以通过调试来验证一下。 如下图所示,arr1中所有元素被赋值,arr2中剩余部分默认为0。
2.3数组的类型
如果前面提到过的数据类型,数组也是有类型的,数组算是一种自定义类型,去掉数组名留下的就是数组的类型。例如:
3.一维数组的使用
学习完了数组的基本语法,一位数组可以存放数据,存放数据的目的是对数据的操作,那我们如何使用一维数组呢?
3.1数组下标
C语言规定数组是有下标的,下标从0开始,例如一个数组的长度为10,则下标为0~9。为了存取特定的元素,可以在写数据名的同时在后面加上一个用方括号(下标引用操作符)围绕的整数值,这个整数值就是数组的下标。
有了下标访问操作符,我们就可以轻松的访问到数组的元素了。例如在上面的数组中,要访问下标为5的元素,就可以使用:arr[5] 来访问。例如:
3.2数组元素的打印
既然已经知道了如何访问数组中的一个元素,那如果想要访问整个数组的内容该怎么办呢?只要我们产生数组所有元素的下标就可以了,这就需要用到前面介绍过的for循环来产生1~9的下标,之后再使用下标访问就能实现了。 例如:
3.3数组的输入
知道了数组的访问,我们也可以利用同样的思想方法,自己给数组输入想要的数据,如下代码:
4.一维数组在内存中的存储
有了前面的知识,其实我们使用数组基本没有什么障碍了,如果要深入了解数组,最好能够了解一下数组在内存中的存储.
例如:依次打印数组元素的地址,来看一下有什么特点
从输出的结果分析,数组随着下标的增长,地址是由小到大变化的,并且我们发现,每两个相邻的元素之间相差4,因为这个数组的每个元素都是int类型,int类型占4个字节。所以我们得出结论:数组在内存中是连续存放的。
5.sizeof计算数组元素个数
在前面提到的遍历数组中,我们必须知道数组的元素个数,那C语言中有办法使用程序计算数组元素个数吗?答案就是可以使用sizeof。sizeof是C语言中的一个关键字,是可以计算类型或者变量大小的,其实sizeof也可以计算数组的大小。 例如
通过这段代码,我们可以求出数组的总大小,那根据小学数学就能算出,有了数组的总大小,并且每个元素的大小是相同的,就能求出一共有多少个元素。
只需要用数组总大小,除以一个元素的大小,得到的就是数组元素个数,例如:
通过这种方法,以后在遍历数组时,就不需要将数组元素个数写死了,使用上面的计算,不管数组怎么变化,计算出的大小也就随着变化了。
6.二维数组的创建
6.1二维数组的概念
前面提到的数组被称为一维数组,如果我们把一维数组做为数组的元素,这时候就是二维数组
6.2二维数组的创建
那么如何定义一个二维数组呢,语法如下:
type arr_name [常量值1][常量值2];
与一位数组不同的是,二维数组多了一个常量,其中,常量值1代表行,常量值2代表列。
7.二维数组的初始化
像一维数组一样,二维数组的初始化也是使用大括号的。
7.1不完全初始化
和一维数组一样,不完全初始化,剩余的内容默认为0。
7.2完全初始化
7.3按行初始化
7.4初始化时省略行
在二维数组初始化时可以把行省略,但是不能把列省略。
8.二维数组的使用
8.1数组下标
当掌握了二维数组的创建和初始化,那该怎么样使用二维数组呢?和一维数组类似,只要确定了行和列,就能通过下标访问进行使用。C语言规定,二维数组的行是从0开始的,列也是从0开始的。
图中左侧绿色数字代表行号,上面蓝色数字代表列号,所以arr[1][2] 很快就能定位到4这个数字。
8.2二维数组的输入和输出
知道了访问单个元素,那么如何访问整个二维数组呢,我们只需要通过一定的规律产生行和列的所有数字就行,以上代码为例,行的选择范围是0~2,列的选择范围是0~4,我们可以借助循环实现生成所有下标。
9.二维数组在内存中的存储
和一维数组一样,想要研究二维数组在内存中的存储方式,也可以通过打印出每个元素的地址来观察。
从结果来看,每一行内部的元素都是相邻的,地址相差4个字节,因为每个元素都int类型,int占四个字节,跨行位置的两个元素(例如arr[0][4]和arr[1][0])之间也是相差4个字节,所以可以得出结论,二维数组在内存中也是连续存放的。
10.C99中的变长数组
前面提到过,数组的长度必须用常量表达式进行定义,这样的语法限制,让我们在创建数组时就不够灵活,大了浪费空间,小了不够用,但是在C99中,有时候也可以使用变量。就是所谓的变长数组,
上面示例中,数组arr就是变长数组,因为它的长度取决于变量n的值,编译器无法事先确定,只有运行时才能知道n是多少。
变长数组的根本特征,就是数组长度只有运行时才能确定,所以变长数组不能初始化。有一个要注意的点就是:变长数组的意思是数组的大小可以使用变量来指定的,在程序运行的时候,根据变量的大小来指定数组的元素个数,而不是说数组的大小是可变的,数组的大小一旦确定就不能再变化了。
遗憾的是,在VS2022上,虽然支持大部分C99的语法,但是没有支持C99中的变长数组,没办法测试,感兴趣的可以在gcc编译器上的测试看看,例如Dev,小熊猫C++。