(共37张PPT)
第八章 数组
第八章 数组
数组是是一组有序的、同类型数据的集合 ,这些数据称为数组元素。
数组元素在内存中占据连续的存储空间。
同一数组中元素的类型相同。
根据数组中元素具有下标的个数可以把数组分为:一维数组、二维数组和多维数组。
一、一维数组的定义
当数组中每个元素只有一个下标的数组称为一维数组。
一维数组的定义方式为:
类型名 数组名[常量表达式];
例如: int array[10];
它表示定义了一个名为array的数组,此数组有10个元素,每个元素的数据类型为整型。
第一节 一维数组
一维数组定义的说明:
1.类型名用来说明数组元素的数据类型,可以是以前介绍过的任一种数据类型。
2.数组名由用户指定,命名规则和变量名相同,遵循标识符定义规则。
3.常量表达式规定了数组元素的个数,即数组的长度。整个数组所占字节数=类型长度×数组长度。
4.常量表达式中不能包括变量,即C语言不允许定义动态数组。
5.常量表达式中可以包括常量和符号常量。
6.每个数组元素只有一个下标,C语言规定数组第一个元素的下标总为0(称为数组的下界)。
7.定义数组后,C编译程序即为该数组在内存中开辟相应个数的存储单元,每个存储单元可以直接用相应的数组元素表示。
8.数组定义中,数组长度除多数情况下作显式说明外,有两种情况下不必或不能用长度说明,而用[]代替。
(1)给数组全体元素赋初值时,可省去数组长度说明。
(2)数组名作为函数的参数,在函数的参数说明部分,当指出参数是数组时,不能用长度说明。
二、一维数组的初始化
当系统为所定义的数组在内存中开辟一串连续的存储单元时,这些存储单元中并没有确定的值,数组的初始化就是指在定义数组时给数组元素赋初值。
一维数组初始化的定义形式为:
类型名 数组名[常量表达式或省略]={值0,值1,……};
其中,{}中各值是对应的数组元素初值,各值之间用逗号隔开。例如:
int a[5]={0,1,2,3,4};
也可以省略为:
int a[ ]={0,1,2,3,4};
说明:
1.可以只给部分数组元素赋初值。当{}中值的个数少于数组元素个数时,则表示初值只赋于数组开始的若干个元素,余下部分元素为相应类型的缺省值,int为整型数0,字符型为空格等。
2.{}中值的个数不能超过数组元素的个数。
3.只能给数组元素逐个赋值,不能给数组整体赋值。
4.对较大数组中的若干不连续的数组元素赋予非零的初值,其余数组元素为0值时,可以用“,”表示对应位置的元素为0值。
5.若全部元素均赋为0,可对数组不赋初值。
6. C语言中,还可以通过赋初值来定义数组的大小,这时数组说明符的一对方括号中可以不指定数组的大小。
例如:
int a[ ]={1,2,3}
此时就隐含的定义了a数组含有3个元素。
三、一维数组元素的引用
在定义数组之后,数组元素就可以被引用了。
引用一维数组元素的一般形式如下:
数组名 [下标表达式];
数组名后的一对方括号是不可缺少的,下标表达式可以是由整型的常量和变量构成的表达式。
例如:
int a[5] ={10,20,30,40,50};
可以使用a[0]表示第一个元素,即a[0]==10;…a[4]表示最后一个元素,即a[4]==50
说明:
(1)数组中的元素其实就是一个变量,占用一个存储单元。如数组a中的变量就是普通的int类型的变量,该类型变量的一切合法操作对于数组元素来说都是正确的。
例如:
a[0]=5;
a[0]++;
a[1] = a[0]+14;
printf(“%d”,a[4]);
(2)引用数组元素时,下标表达式的值的上限为定义时的常量表达式减1,下限为0。在引用时,要保证下标不能超过定义时的常量表达式减1,即下标不能越界。
例如,定义了int a[5];下标不能超过4,否则越界溢出,编译出错。
(3)数组是一个构造类型,是集合的概念,一次不能整体引用数组里的所有元素。企图简单的通过数组名a整体代表其中的5个int类型的变量是不行的。
第二节 二维数组
先看一个例子:
某校近三年招收各专业毕业生情况如下:
计算机 电子 管理 数学
2002 90 40 80 30
2003 100 50 90 40
2004 95 45 100 50
要把这些数据组织起来,可以有两种选择:
⑴按从左到右从上到下的顺序存入一个一维数
组中。(查询困难)
⑵每年用一个一维数组,把这些数据分别存入
三个数组中。 (增加一年数据困难)
一、 二维数组的定义
当数组元素的下标为两个时,该数组称为二维数组。
1.二维数组的定义格式
存储类型 数据类型 数组名[常量表达式1][常量表达式2];
功能:定义一个二维数组,有“长度1×长度2”个元素。其元素的存储类型和数据类型分别由定义中的“存储类型”和“数据类型”指定。
说明:
(1)存储类型、数据类型、数组名和长度的含义和选取方法同一维数组。
(2)数组元素的各维下标从0开始,最大下标为“长度 1”。
2.二维数组的逻辑结构和存储结构
二维数组的逻辑结构,可以看成是由若干行,每行由若干列组成。例如有如下数组定义语句:int a[3][4];则其逻辑结构如下:
a[0][0] a[0][1] a[0][2] a[0][3]
a[1][0] a[1][1] a[1][2] a[1][3]
a[2][0] a[2][1] a[2][2] a[2][3]
二维数组存储结构是“按行存放,先行后列”,
说明:
(1)数组名是用户定义标识符
(2)数组名后面的两对方括号必不可少,之间不能有空格。方括号中必须是常量表达式,表达式1表示数组的行数,表达式2表示数组的列数。其中必须是正的整型常量,绝对不能是变量。
(3)定义后,a数组在内存中占用6个连续的存储单元,按照行的顺序依次存储各个元素。 见书p75图8-2、图8-3.
(4)可以把二维数组看成是一个特殊的一维数组。
二、二维数组的初始化
在定义二维数组之后,系统只是在内存中开辟了一系列的连续存储单元,并没有对每一个数组元素进行赋值。因此,我们在定义数组之后要进行初始化。
二维数组初始化的方法有以下几种。
(1)分行给二维数组所有元素赋初值。
例如:int a[3][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11}};
初始化后,a[1][2]的值即是6。
(2)每行的初始值数可以少于该行元素的个数,此时系统对为赋值的元素默认为0.
例如:int a[3][4]={{0,1},{4},{8,9,10}};
初始化后,问a[0][1]和a[2][3]的值即为1和0。
(3)行数也可以少于数组应有的行数,此时系统对未赋值的行中所有元素默认为0.
例如:int a[2][3]={{10,20,30}};
初始化后,第0行的三个元素初值分别为10,20,30,但未赋值的第1行所有元素的初值均默认为0.
(4)可以省略内层的花括号对。
例如:int a[2][3]={10,20,30,40,50,}
(5)定义语句中的表达式1(行数)可以省略,但是表达式2(列数)不能省略。
如: int a[][3]={{10,20,30,},{40,50,60}};
该句省略了定义语句中的常量表达式1。系统会根据后面赋初始值的情况来判断,
注意:给二维数组赋初值时,行数不能超过定义的行数,每行的初值个数不能超过定义时的列数。下列的定义是错误的:
9.5.4 通过赋值定义二维数组的大小
在定义一个二维数组时,可以通过赋初值的个数来确定数组的大小,但只可以省略第1个方括号的常量表达式,而不能省略第2个括号的常量表达式。
例如:
int a[ ][2]={ {1,2}, {3}, {4}, {5} };
以上语句中,a数组中的第一维的常量表达式省略,在所赋初值中,有4对行向量,则第一维的大小可由所赋初值的行数来确定。即等价于:
int a[4][2]= { {1,2}, {3}, {4}, {5} };
当使用行花括号赋初值时,第1维的大小由赋初值的行数来决定。当省略行花括号时,第1维的大小按以下规则来决定:
(1)当初值的个数能被第2维的常量表达的值除尽时,所得商数就是第1维的大小;
(2)当初值的个数不能被第2维的常量表达的值除尽时,则:
第1维的大小 = 所得商数+1
例如:
int a[ ][2]={1,2,3,4};
按此规则,a数组的第一维大小应该是2,即
int a[2][2]={ {1,2}, {3,4} };
9.5.2 二维数组元素的引用
二维数组元素的引用方法也有两种,分别是“指针法”和“下标法”。这里只讨论“下标法”。假设定义了一个二维数组:int a[N1][N2],其引用形式为:
数组名[下标表达式1][下标表达式2]
二维数组元素的引用时注意事项:
(1)二维数组各维的下标也是从0开始
(2)下标表达式的值必须是整数,且不得超越数组定义的上、下界。
(3)引用二维数组元素时,一定要把两个下标分别放在两个括号内。