第 11 讲:数组
数组是什么?
在前文的知识点里,我们描述了很多有关重复性的内容,例如 C 语言提供的三大循环语句:while
、do-while
和 for
循环,还谈论了 for
的各种“奇葩”用法。今天要讲的重复性内容,并非针对执行操作,而是针对于数值存储。
试想一下,如果我们需要大量信息,而且它们需要的内容的类型近乎一致。比如我们要存储 50 个学生的数学成绩,如果我们单纯使用 50 个变量的话,显然是不好读也不好取。那么,有没有办法解决呢?有,这便是我们今天要说到的新的知识点:数组(Array)。
数组的定义
数组有类型(Type)一说,有维度(Rank)一说,也有长度(Length)一说,这是在初始定义的时候为其决定的,这类似于变量的定义。语法约定是这样的:
这样便定义了一个数组(有时候也把数组直接叫做数组变量),这个数组一共存放 50 个元素,且全部都是 int
类型的元素。
数组一共具有三大属性:类型、维度和长度,那么针对于这个数组变量而言,它的类型是 int
,维度是一维的,而长度是 50(即总元素个数)。所谓的维度,就是数组整体呈现几个维度的形式。我们今天讲的内容都是一维数组,即只有一个维度。
数组的赋值
数组赋值有两种操作,一种是自定义数据,在初始化的方式赋值,还有一种是后续赋值,后续赋值就需要借助循环语句来实现,因为它是采用的逐个元素的赋值的逻辑。
初始化赋值
初始化赋值方式是在定义语句上直接使用赋值符号 =
和一个大括号表示的集合序列来赋值的。
下面为了简化赋值,这里把 50 个元素更改为 10 个元素的数组,进行赋值。
这样的赋值操作是逐个对应的。这个 scores
数组的第一个元素数值是 1,第二个元素是 2,第三个是 4,第四个是 8,以此类推。
如果你赋值的数值过多,编译器层面就会报错,提示你不遵循语法规则,exe 的文件都不会让你成功生成。
不过,元素如果不够 10 个的话,赋值是成功的,也是不会出错的,但是剩余的元素都会被默认赋值为 0。
这表示 scores
数组里最后 6 个元素全部为 0。
如果你想把数组全部赋值为 0,可以采用下面两种方式赋值:
这是第一种赋值方式,小括号第一个部分写上数组名称,第二个部分写上赋值的初始值(这里是 0,其它数值需要非常复杂的转换得到,这里不作出讲解),第三个部分写上数组整体占的内存大小。
第二种是用大括号这种熟悉的方式赋值,只需要在大括号里写一个元素 0 即可。
这样就可以了,因为其它没有赋值的部分都会默认赋值为 0,而此时给了第一个元素也赋值为 0,所以相当于就是全部为 0 了。
在明确赋值元素足够的时候,中括号里的数值可以不写。比如
int scores[] = { 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024 };就等价于
int scores[10] = { 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024 };中括号里的数值,就等于后面大括号里元素的总个数 10 个。
后续赋值
你也可以借用循环语句赋值,但需要讲解存取数组的元素的语法才可以。现在我们来说一下,如何取出数组里的元素,和修改这些元素的值。
数组初始化的长度是否可以用变量表示?
思考一个问题。我们是否可以用一个变量来表示数组的长度呢?
这么书写,是否表示输入的数值是多少,数组初始化的时候长度就是多少呢?
在 C99 标准之前,这种写法一直都是不被允许的。在考试过程时,一般也不允许这种写法,不过 C99 标准开始允许你这么声明数组,即可变长数组(Variable Length Array,简称 VLA)。VLA 这种特性是在 C99 标准才引入的,所以如果你需要使用 VLA,考试里则是肯定不允许的。
数组内元素的存取
前文讲述了如何使用数组进行定义和初始化,它采用的是中括号的方式,写在数组名称的后面,中括号里写上总元素个数来表达。
在存取元素的时候,我们依旧用的是中括号,而且稍微在使用上和初始化里的中括号有一点区别:
[第几个元素 - 1]
在 C 语言里,取值是从 0 开始的,并非 1 开始,所以需要你注意数组取值的时候,中括号里写的数值是多少。比如取出第三个元素,则写的是 array[2]
,而非 array[3]
。
那么,整体使用的格式是这样的:
这个程序将会输出 96。
下面就可以说下后续赋值的方式了。
由于我们学习了循环语句,所以我们可以采用方便 for
循环为其赋值。
请注意,数组赋值用到了 for
循环,而我们之前说过,取值的中括号里写的数字是从 0 开始算的,所以最大的元素值是 9(因为 0 到 9 一共是 10 个元素了),所以初始化赋值的时候 i = 0
而不是 i = 1
,因为这个 i
就是表示这个中括号里的数值的;而条件写的是 i < 10
而不是 i <= 10
。
而上述逻辑里的 arr[i]
就表示 arr
数组的第 i + 1
个元素。比如 i
是 6,则 arr[i]
就表示的是第七个元素,因为从 0 开始计算。而最终执行完毕这个 for
后,整个数组的数值就是 1、2、3、4、5、6、7、8、9、10 了。
当然,你还可以为其进行手动赋值:
这样就可以为这个数组的第 2、7、10 个元素赋值 3、8 和 14,而其余元素的数值都会被默认初始化为 0。