
3.1 一维数组

视频讲解
3.1.1 定义一维数组
数组就是存储一批同类型数据的地方,定义一维数组的语法格式为:

在定义数组时,需要在数组名后边紧跟一对方括号,其中的数量用来指定数组中元素的个数,因为只有告诉编译器元素的个数,编译器才能申请对应大小的内存给它存放。
上面三种数组类型,都占用多少字节的内存呢?

在本书的编译环境中,它们都是占用24字节的内存空间。在编译器编译程序的时候,这个空间就已经创建了。
3.1.2 访问一维数组
访问一维数组中的元素,同样是使用方括号:

注意:

3.1.3 循环与数组的关系
在此之前有些读者可能会感到疑惑:为什么循环变量通常初始化为0,而不是1呢?比如实现一个执行10次的循环,通常是这么写的:

而不是这样写(当然下面这样写也没错,这里只是讨论习惯问题):

这是因为我们常常需要使用循环来访问数组:

举个例子,下面代码尝试使用数组存放班级里10位同学的数学成绩,并计算出平均值:

程序实现如下:

3.1.4 数组的初始化
在定义数组的同时对其各个元素进行赋值,称为数组的初始化。数组的初始化方式有很多,下边逐一介绍。
(1)将数组中所有元素初始化为0,可以这样写:

(2)如果是赋予不同的值,那么用逗号分隔开即可:

(3)还可以只给一部分元素赋值,未被赋值的元素自动初始化为0:

(4)有时候还可以偷懒,可以只给出各个元素的值,而不指定数组的长度(因为编译器会根据值的个数自动判断数组的长度):

(5)C99增加了一种新特性:指定初始化的元素。这样就可以只对数组中的某些指定元素进行初始化赋值,而未被赋值的元素自动初始化为0:

3.1.5 可变长数组

视频讲解
在C99标准出现之前,要求定义数组的时候,数组的维度必须为常量表达式或者const的常量,所以那时候如果把代码写成下面这样,就会报错:

但是从C99标准开始,C语言正式支持可变长数组(Variable Length Array, VLA),这里的“变长”指的是数组的长度可以在程序运行时才决定,不过一旦完成定义,数组长度在其生命周期内就不能再改变了。请看下面例子:

程序实现如下:

3.1.6 字符数组
还记得之前介绍过,C语言是没有字符串类型的,那么C语言是如何存放和表示字符串的呢?有两种方式:字符串常量;字符类型的数组。字符串常量就是用双引号括起来的字符串,它一旦定下来就没有办法改变。更灵活的方式是使用字符类型的数组来存放和处理字符串,这样,数组中的每一个元素表示一个字符(注意:最后还需要添加一个字符串的结束符'\0')。
接下来快速回顾一下,定义字符数组的方式有哪些。最简单的是先定义指定长度的字符数组,然后给每个元素单独赋值:

还可以直接在定义的时候对字符数组进行初始化,这样会方便很多:
