1、第5章 数组5.1 一维数组5.2 二维数组5.3 字符数组5.4 字符串输入、输出函数第5章 数组5.1 一维数组第5章 数组一维数组是最简单的数组类型,数组中每个元素由相同的数组名和唯一的下标来确定并相互区别。5.1.1 一维数组的定义一维数组定义的基本格式为其中,类型符用于指定数组的数据类型。数组是同一类型的有序数据的集合,因此数组的数据类型也是该数组中所有组成元素的数据类型。数组名是表示某个特定数组的标识符,其命名方法遵循标识符命名规则。常量表达式用来表示数组的长度,说明所包含元素的个数。C语言不允许对数组的大小作动态定义,即数组的大小不依赖于程序运行过程中变量的值,因此方括号中的“常
2、量表达式”可以是整型常量或整型常量表达式,但不能是变量。5.1.2 数组元素的引用C语言规定,必须先对数组进行定义,然后才能对数组元素进行逐个引用,也就是要遵循“先定义,后使用”的原则。需要注意的是,由基本数据类型所构造的数据类型,只能引用其组成成员,而不能引用其本身,即数组名不代表整个数组。数组中每个元素的类型由数组的类型决定,每个数组元素由统一的数组名和唯一的下标确定。下标可以是常量、变量或表达式,但必须有确定的整数值。数组元素的下标总是从“0”开始的。所有元素以各自的下标为顺序,在内存中占用一段连续的存储单元。第5章 数组数组常与循环结构结合在一起使用,通过数组的下标和循环结构的控制变量
3、产生联系,可以很方便地引用数组元素。5.1.3 一维数组的初始化为使程序简洁,常在定义数组的同时为各数组元素赋值,称为数组的初始化。常见的初始化形式包括:(1)为全部元素赋值,按顺序将数值依次赋给数组中各元素。(2)若省略数组长度,则可由初始化式中数值的个数确定其长度。(3)若初始化式中数值的个数小于数组的长度,则不足的部分默认初始值为0。(4)利用上一特性,可以方便地为全部元素赋初值0。需要注意的是,初始化式以花括号限定,数值间用逗号隔开,初始化式不允许完全为空,即花括号内至少要有一个数值。如果在定义的同时不对数组初始化,则各元素的初始值并不确定。5.1.4 一维数组的存储形式数组的所有元素
4、在内存中是以连续字节的形式存放的,数组中各元素所占内存的大小由该数组的数据类型决定,整个数组所占内存的大小为一个元素所占内存的大小与元素的个数乘积。第5章 数组5.2 二 维 数 组第5章 数组维数超过一维的数组统称为多维数组。多维数组也是同类型数据的有序集合,存储形式与一维数组相同,即所有元素按顺序占用一段连续的存储单元。本节以多维数组中最常用的二维数组为例进行介绍。在表现形式上,一个二维数组常以行和列的排列形式(类似于数学中的矩阵)出现,这样有助于形象地表示二维数组的逻辑结构。5.2.1 二维数组的定义二维数组定义的基本格式为其中,类型符用于指定数组的数据类型,两个常量表达式分别指定了二维
5、数组的行数和列数,数组长度(即元素个数)由行数列数来确定。5.2.2 二维数组元素的引用与一维数组的引用相似,对二维数组的引用也是通过其下标实现的。在上一节的例题中可以看到一维数组的引用常与循环结构配合使用。类似的,二维数组常与两层嵌套的循环结构结合使用,通过外层循环控制行下标及内层循环控制列下标,可以很方便地实现对各个元素的访问。5.2.3 二维数组的初始化常用的二维数组的初始化包括以下形式:(1)在初始化式中,以花括号来限定数组中每一行的值。第5章 数组对于初学者来说,C语言的词汇即关键字,接近于我们使用的自然语言(这里指英语),在某种程度上可以见名知义。下面就让我们通过一个简单的程序来认
6、识和了解C语言。【例1.1】在屏幕上输出一行文字:欢迎使用C语言!对于上述代码,我们需要进行编辑、保存、编译和运行,从而在屏幕上输出相应的文字。编辑代码,必须有一个可以进行文字编辑的软件。Windows操作系统中自带的记事本或者MS WORD等软件,均可以完成代码的编辑与存储功能。在C语言程序设计中,程序代码编写完成后保存在扩展名为“.c”的文件中,该文件即为源程序文件。我们将上述代码保存在Lianxi_1_1.c源程序文件中。由于C语言是高级语言,因此需要将源程序翻译成计算机可以识别的机器语言,也就是要对源程序进行编译。程序在编译成功以后,即可以运行,在屏幕上输出相应的文字。第5章 数组对于
7、初学者来说,C语言的词汇即关键字,接近于我们使用的自然语言(这里指英语),在某种程度上可以见名知义。下面就让我们通过一个简单的程序来认识和了解C语言。【例1.1】在屏幕上输出一行文字:欢迎使用C语言!对于上述代码,我们需要进行编辑、保存、编译和运行,从而在屏幕上输出相应的文字。编辑代码,必须有一个可以进行文字编辑的软件。Windows操作系统中自带的记事本或者MS WORD等软件,均可以完成代码的编辑与存储功能。在C语言程序设计中,程序代码编写完成后保存在扩展名为“.c”的文件中,该文件即为源程序文件。我们将上述代码保存在Lianxi_1_1.c源程序文件中。由于C语言是高级语言,因此需要将源
8、程序翻译成计算机可以识别的机器语言,也就是要对源程序进行编译。程序在编译成功以后,即可以运行,在屏幕上输出相应的文字。第5章 数组(2)省略上式中的限定行的花括号,按元素在内存中的排列顺序依次赋值。(3)当可以通过初值的个数确定数组的长度时,可以不指定行的长度,但列的长度不能省略。(4)若初值个数小于数组的长度,则初始化式中不足的部分默认为0。(5)按初始化式中花括号的限定依次为各行中的元素赋初值,不足的部分默认为0。(6)为某行赋初值0,限定行的花括号不能省略且至少包含一个初值0。(7)当行的个数可以通过初始化式确定时,可以不指定行的长度,但列的长度不能省略。第5章 数组5.3 字 符 数
9、组第5章 数组用来存放字符型数据的数组是字符数组,字符数组中的每个元素在内存中占用一个字节的存储单元,用于存取一个字符。5.3.1 字符数组的定义一维字符数组定义的基本格式为虽然也可以定义一个整型数组来存放字符型数据,但会占用不必要的内存空间,因此不建议使用。二维字符数组定义的基本格式为5.3.2 字符数组的初始化字符数组的初始化与前面讲过的数值数组的初始化形式类似,常用形式包括以下几种:(1)按元素在内存中的排列顺序,将字符依次赋值给数组中各元素。如果花括号中提供的字符个数大于数组长度,则按语法错误处理。(2)在定义字符数组时,如果为全部元素赋初值,对于一维数组可省略数组长度。第5章 数组(
10、3)如果初始化式中字符个数小于数组长度,则不足的部分默认为空,即字符“0”。字符数组的初始化与数值数组的初始化形式基本相同,只是初始值为字符常量,由单引号限定。同理,二维字符数组的初始化也与前面介绍的二维数组的初始化形式相同。如果在定义时不对字符数组初始化,则各元素的初始值并不确定。5.3.3 字符数组的引用字符数组的引用与前面所讲数组的引用基本一致,唯一的区别是,对于字符数组常使用格式符“%c”来逐个引用数组元素。对于一维字符数组,程序通过一层循环结构完成对每一个数组元素的引用。对于二维字符数组,程序中定义了循环控制变量,通过两层循环嵌套来引用二维字符数组的各元素。在循环结构中,通过判断当前
11、元素的值是否为空字符“0”来判断当前行中的有效字符是否已经全部输出,并决定是否结束内嵌的循环结构。5.3.4 使用字符数组处理字符串C语言中没有字符串数据类型,而是通过字符数组来实现对字符串的处理。所以在C语言中字符串是字符数组,而C语言又规定以字符“0”作为“字符串的结束标志”,从而将字符串区别于一般的字符数组。在使用字符初始化字符数组时,初始化式由花括号限定且每个初值由单引号限定,字符初值之间用逗号隔开。在使用字符串初始化字符数组时,初始化式的花括号可以省略,整个字符串由双引号限定。同时系统会自动向数组的末端添加一个字符第5章 数组“0”作为结束标志。因此,使用字符串定义的数组长度为字符串
12、长度再加一个字节。5.3.5 字符串的输入/输出在字符串的输入/输出中,经常使用格式符“%s”。相对于格式符“%c”只能够对字符数组的元素进行逐一引用,格式符“%s”最大的特点是可以一次把整个字符串输入/输出。1以“%s”的形式输出字符数组在格式输出函数printf中使用“%s”时,输出列表的参数不是数组元素(变量),而是数组名(数组的首元素地址)。系统从字符数组的首元素地址开始,将存储单元内的字符依次输出,直到遇见(但不包括)第一个“0”(空字符)为止。2以“%s”的形式输入字符数组在格式输入函数scanf中使用“%s”时,输入列表的参数不是变量的地址(或数组元素的地址),而是数组名(即数组
13、的首元素地址)。系统从字符数组的首元素地址开始,将连续输入的字符一次写入存储单元,遇到输入的分隔符(制表符“Tab”、空格“Space”或回车“Enter”)时,在有效字符后自动添加一个“0”,并结束输入。习惯上,使用“Enter”结束输入。3以“%s”的形式一次输入与输出多个字符串利用“%s”的特点,可以一次输入与输出多个字符串。在输入时,以空格键“Space”、制表符“Tab”或回车键“Enter”作为一个字符串的结束标志,习惯上,空格键“Space”更符合文本书写的格式。在输出时,需要人为添加字符串之间的分隔符号。第5章 数组5.4 字符串输入、输出函数第5章 数组C语言本身没有输入/输
14、出语句,而是在C标准函数库中以标准的输入/输出设备为对象,提供了一系列“标准输入/输出函数”,程序设计人员可以通过调用这些函数来实现特定的输入/输出功能。“标准输入/输出函数”被定义在头文件“stdio.h”中,需要调用“标准输入/输出函数”的源程序文件必须在文件的开头使用预编译指令“#include”将该头文件包含到源程序文件中。5.4.1 puts函数puts函数即字符串输出函数。其作用是以第一个“0”作为结束标志,将一个字符数组中的有效字符输出到终端,并将“0”转换为“n”输出。调用puts函数的一般格式为需要注意的是,puts函数的参数只有一个,所以只能用于输出一个字符数组;若需要输出
15、多个字符数组,则需要调用多个puts函数。5.4.2 gets函数gets函数即字符串输入函数。其作用是以回车键“Enter”作为结束标志,将一个字符串输入到字符数组中,并将“Enter”转换为“0”输入。调用gets函数的一般格式为第5章 数组需要注意的是,gets函数的参数只有一个,所以只能向一个字符数组输入字符串;若需要向多个字符数组输入字符串,需要调用多个gets函数。除了输入与输出函数以外,大部分符合标准的C语言开发环境会提供大量的字符串处理函数以方便程序的开发,而这些函数通常被定义在头文件“string.h”中。调用字符串处理函数的源程序文件需要在文件的开头使用预编译指令“#include”,将该头文件包含到本程序中。在此,不对这部分函数做详细介绍。