四、数组基础知识

目录

1.数组的概念

2. 一维数组的创建和初始化

2.1数组创建 

2.2数组的初始化

2.3数组的类型 

3.一维数组的使用 

3.1数组下标 

3.2数组元素的打印 

3.3数组的输入 

4.一维数组在内存中的存储 

5.sizeof计算数组元素个数 

6.二维数组的创建 

6.1二维数组的概念 

6.2二维数组的创建

7.二维数组的初始化

7.1不完全初始化 

 7.2完全初始化

7.3按行初始化 

7.4初始化时省略行 

8.二维数组的使用 

8.1数组下标 

8.2二维数组的输入和输出 

9.二维数组在内存中的存储 

10.C99中的变长数组 


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++。

  • 13
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值