配色: 字号:
C程序课件第7章数组
2012-04-24 | 阅:  转:  |  分享 
  
第七章数组7.1一维数组7.2二维数组7.3字符数组7.4程序举例一、一维数组二、二维数组三、字符数
组四、程序举例五、本章小结可以看出当输入的字符串中含有空格时,输出仍为全部字符串。说明gets函数并不以空格作
为字符串输入结束的标志,而只以回车作为输入结束。这是与scanf函数不同的。(3)字符串连接函数strcat(string
catenate链接)格式: strcat(字符数组名1,字符数组名2)功能:把字符数组2中的字符串连接到字符数组1
中字符串的后面,并删去字符串1后的串标志“\0”。本函数返回值是字符数组1的首地址。例EX7_12连接两个串#inclu
de#includevoidmain(){ staticcharstr1[30]
="Mynameis"; charstr2[10]; printf("Inputyourname:\n"); g
ets(st2); strcat(st1,st2); puts(st1);}(4)字符串拷贝函数strcpy(strin
gcopy)格式:strcpy(字符数组名1,字符数组名2)功能:把字符数组2中的字符串拷贝到字符数组1中。串结束标
志“\0”也一同拷贝。字符数组名2,也可以是一个字符串常量。这时相当于把一个字符串赋予一个字符数组。例EX7_13字符串复
制#include#includevoidmain(){ charstr1[15
]; charstr2[]="CLanguage"; strcpy(str1,str2); printf(“String
1:”);puts(str1); printf(“String2:”);puts(str2);}(
5)字符串比较函数strcmp(compare)格式:strcmp(字符数组名1,字符数组名2)功能:按照ASCII码值顺序比
较两个数组中的字符串,并由函数返回值返回比较结果。字符串1=字符串2,返回值=0;字符串2>字符串2,返
回值>0;字符串1<字符串2,返回值<0。本函数也可用于比较两个字符串常量,或比较数组和字符串常量
。例EX7_14字符串比较#include#includevoidmain()
{ intk; charstr1[15],str2[]="CLanguage"; printf("Inputas
tring:\n"); gets(str1); k=strcmp(st1,st2); if(k==0) printf("s
t1=st2\n"); if(k>0) printf("st1>st2\n"); if(k<0) printf("st1<
st2\n");}(6)测字符串长度函数strlen(stringlength)格式:strlen(字符数组名)功能:测
字符串的实际长度(不含字符串结束标志‘\0’)并作为函数返回值。例EX7_15测字符串长度#includeh>#includevoidmain(){ intk; charstr[]="Clangua
ge"; k=strlen(str); printf("Thelengthofthestringis%d
characters.\n",k);}(7)大写字母转换为小写字母函数strlwr(stringlowercase)函数
的作用是将字符串中大写字母转换成小写字母。(8)小写字母转换为大写字母函数strupr(stringuppercase)函数
的作用是将字符串中小写字母转换成大写字母。以上介绍了常用的八种字符串处理函数,应当再次强调:库函数并非C语言本身的组成
部分,而是人们为使用方便而编写、提供大家使用的公共函数。各系统提供的函数数量、函数名和函数功能不尽相同,使用时要小心,必要时查阅一
下库函数手册。7、字符数组应用举例例EX7_16输入一行字符,统计其中有多少个单词,单词之间用空格隔开。
这个问题的算法是:单词的数目可以由空格出现的次数决定(连续的若干空格作为出现一次;一行开头的空格不统计在内)。如果测出某一个字
符为非空格,而它前面的字符是空格,则表示新的单词开始,此时使num(单词数)累加1。如果当前字符为非空格而其前面的字符也是非空格,
则意味着仍然是原来的单词,num不累加。前面一个字符是否为空格可以从word的值确定,若word=1,则表示前一个字符是空格;如果
word=0,意味着前一个字符为非空格。N-S框图为:输出:numi+1=>i0=>wordnum+1=>n
umTword=1F1=>wordTc=空格
F当((c=string[i])≠‘\0’)0=>i
输入一个字符串给string#includevoidmain(){ charstring[80];
inti,num=0,word=1; charc; gets(string); for(i=0;(c=string[i]
)!=‘\0’;i++) if(c==‘’)word=1; elseif(word==1) { word=0;
num++;} printf(“Thereare%dwordsintheline.\n”, num
);}例EX7_17把一个整数插入一个已排好序的数组中,插入后数组仍有序。算法:1、把原来给定
的数按从大到小(也可以从小到大)进行排序;2、从键盘输入一个整数,下一步工作就是要确定该数插入的位置;3、
把输入的数据与数组的每个元素进行比较(方向从大到小,也就是从左到右),若该数大于数组中的第一个数,则应将此数插入到数组的第一个位置
(记住下标);若该数比数组中最后一个元素小,则该数应插入数组的末尾;若该数比数组中的第i个数小,而比第i+1个数大,则该数应插入第
i+1个位置。由此确定这个整数应插入到数组中的位置。4、把数组中从最后一个元素到第i+1个元素,每个元素向后移动一个位
置,然后用该数去覆盖第i+1个元素。至此插入操作完成。从大到小的排序插入与此正好相反。下面给出程序:#include
intNum,S=0; /全局变量/voidmain(){ inti,j,t,a[11]={
127,3,6,28,54,68,87,105,162,18}; for(i=0;i<9;i++) { for(j=i+1;j
<10;j++) if(a[i] /顺序排序/ printf(“Outputaarraybeforeinsert:\n”); for(i=0;i
<10;i++) printf("%5d",a[i]); printf(“\n”); /输出数组/ printf(
"\nInputanumberforinsert:\n"); scanf(“%d”,&Num); /输入Nu
m/ for(i=0;i<10;i++) if(Num>a[i])S=i; /查找插入位置/ if(S
==0) { for(i=9;i>=0;i--) a[i+1]=a[i] a[0]=Num; } els
e { for(i=9;i>S;i--) a[i+1]=a[i] a[S+1]=Num; } /
插入操作/(4)如果对全部元素都赋初值(即提供全部初始数据),则在定义数组时对第一维的长度可以不指定,但第二维的长度不能省
略。如:inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};与下面的定义等价:
inta[][4]={1,2,3,4,5,6,7,8,9,10,11,12};但应注意,下面的两种赋值方式是不
等价的:inta[2][3]={{1},{3},{5,7}}; /不成立,超过定义的行数/inta
[][3]={{1},{3},{5,7}}; /成立,可将5,7赋予第三行/这两种赋初值的结果是不相同的。
数组是一种构造类型的数据。二维数组可以看作是由一维数组的嵌套而构成的。设一维数组的每个元素都又是一个数组,就组成了二维数组。当然,
前提是各元素类型必须相同。根据这样的分析,一个二维数组也可以分解为多个一维数组。C语言允许用这种分解二维数组a[3][4],可分
解为三个一维数组,其数组名分别为a[0],a[1],a[2]。对这三个一维数组不需另作说明即可使用。这三个一维数组都有4个元素
,例如:一维数组a[0]的元素为:a[0][0],a[0][1],a[0][2],a[0][3]。必须强调的是,a[0]
,a[1],a[2]不能当作下标变量使用,它们是数组名,不是一个单纯的下标变量。4、二维数组程序举例例EX7_5矩
阵的转置。例如:b矩阵为a矩阵的转置,即a矩阵的行换为b矩阵的列。程序如下:#includevoidma
in(){ inta[2][3]={{1,2,3},{4,5,6}},b[3][2],i,j; printf(“Array
a:\n”); for(i=0;i<2;i++) { for(j=0;j<3;j++) { printf(“%4d”,a
[i][j]); b[j][i]=a[i][j]; /转置/ } printf(“\n”); } print
f(“\nArrayb:\n”); for(i=0;i<3;i++) { for(j=0;j<2;j++) prin
tf(“%4d”,b[i][j]); printf(“\n”); }}例EX7_6编写程序求出3×4矩阵中值最大的
元素,以及其所在的行、列号。程序N-S图为:输出:max和row,columa[i][j]=>maxi=>row
j=>columTa[i][j]>maxFforj=0t
o3fori=0to2a[0][0]=>max程序如下:#includevoidmain
(){ inti,j,row=0,colum=0,max; inta[3][4]={{1,2,3,4},{9,8,7,6}
,{-10,10,-5,2}}; max=a[0][0]; for(i=0;i<3;i++) for(j=0;j<4;j+
+) if(a[i][j]>max) {max=a[i][j];row=i;colum=j;} p
rintf(“Max=%d,row=%d,colum=%d\n”, max,row,colum);}例
EX7_7一个学习小组有5个人,每个人有三门课的考试成绩。求全组分科的平均成绩和各科总平均成绩。 姓名常微近代
C 张 8075 92 王 6165 71 李5963
70 赵858790 周767785可设一个二维数组a[5]
[3]存放五个人三门课的成绩。再设一个一维数组ave[3]存放所求得各分科平均成绩,设变量aver为全组各科总平均成绩。编程如下:
#includevoidmain(){ inti,j; floats,aver,ave[3];
inta[5][3]={{80,75,92},{61,65,71},{59,63,70}, {85,87,90}
,{76,77,85}}; for(i=0;i<3;i++) { s=0; for(j=0;j<5;j++) s
=s+a[j][i]; ave[i]=s/5; } aver=(ave[0]+ave[1]+ave[2])/3; pri
ntf("常微:%5.2f\n近代:%5.2f\nC:%5.2f\n", ave[0],ave[1],av
e[2]); printf("Totalaver:%5.2f\n",aver);}用来存放字符数据的数组称为
字符数组。字符数组中的每一个元素只存放一个字符。1、字符数组的定义字符数组类型说明的形式与前面介绍的数值数组相同。
例如:charc[10];由于字符型和整型通用,也可以定义为intc[10];但这时每个数组元素占2个字节的内存单元。字符
数组也可以是二维或多维数组,例如:charc[5][10];即为二维字符数组。例如:charc[10];/定义
了一个有10个元素的字符数组/c[0]=‘I’;c[1]=‘’;c[2]=‘a’;c[3]=‘m’;c[4]=‘’
;c[5]=‘h’;c[6]=‘a’;c[7]=‘p’;c[8]=‘p’;c[9]=‘y’; /为数组的各元素赋值/
定义c为字符数组,包含10个元素。在赋值后数组的状态如下所示:c[0]c[1]c[2]c[3]
c[4]c[5]c[6]c[7]c[8]c[9]yppah_ma_
I2、字符数组的初始化(1)对字符数组的初始化,最简单的方法是逐个把字符赋给数组中的各元素。如:charc[10]={
‘I’,‘’,‘a’,‘m’,‘’,‘h’,‘a’,‘p’,‘p’,‘y’};如果花括号中提供
的初值个数(即字符个数)大于数组的长度,则按语法错误处理;如果初值个数小于数组长度,则只将这些字符赋给数组中前面的那些元素,其余的
元素自动定为空字符(即‘\0’)。例如:staticcharc[10]={‘C’,‘’,‘p’,‘r’,‘o’
,‘g’,‘r’,‘a’,‘m’};赋值后各元素的值为:c[0]c[1]c[2]c[3]c[4]c
[5]c[6]c[7]c[8]c[9]\0margorp_C其中c[9]未赋值,由
系统自动赋予‘\0’值。当对全体元素赋初值时也可以省去长度说明。这时c数组的长度自动定为9。(2)也可以在定义时初始化一个二维
字符数组,如:chardiamond[5][5]={{‘’,‘’,‘’}, {‘’,‘’,‘
’,‘’},{‘’,‘’,‘’,‘’,‘’}, {‘’,‘’,‘’,‘’},{‘’,‘’,‘
’}};用它代表一个钻石形的平面图形,见P131图7.9和程序例7.7。(3)还可以在赋值时不指定第一维的长度,但
第二维的长度不能省略。如:chara[][5]={{''B'',''A'',''S'',''I'',''C'',},{''d'',''B'',''A'',''
S'',''E''}};它等价于chara[2][5]={{''B'',''A'',''S'',''I'',''C'',},{''d'',''B'',''A
'',''S'',''E''}};3、字符数组的引用可以引用字符数组中的一个元素,得到一个字符。例EX7_8打印一个字符
串#includevoidmain(){ inti;charc[10]= {‘C’
,‘’,‘p’,‘r’,‘o’,‘g’,‘r’,‘a’,‘m’}; for(i=0;i<10;i++) printf(“%
c”,c[i]); printf(“\n”);}例EX7_8_2打印二维字符数组中的字符#includeh>voidmain(){ inti,j; chara[][5]={{''B'',''A'',''S'',''I'',''C'',},
{''d'',''B'',''A'',''S'',''E''}}; for(i=0;i<2;i++) { for(j=0;j<
5;j++) printf("%c",a[i][j]); printf("\n"); }}4、字符串和字符串结束标
志在C语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串,并且总是以''\0''作为串的结束符。因此当把一个字
符串存入一个数组时,也把结束符''\0''存入数组,并以此作为该字符串是否结束的标志。有了''\0''标志后,就不必再用字符数组的长度来判
断字符串的长度了。C语言允许用字符串的方式对数组作初始化赋值。例如:charc[]={‘C’,‘’,‘p’,
‘r’,‘o’,‘g’,‘r’,‘a’,‘m’};可写为:charc[]={"Cprogram"};或去掉{}写为:
charc[]="Cprogram";用字符串方式赋值比用字符逐个赋值要多占一个字节,用于存放字符串结束标志''\0
''。上面的数组c在内存中的实际存放情况为:Cprogram\0。‘\0’是由C编译系统自动加上的。由于采用了‘\0’标志,所以在
用字符串赋初值时一般无须指定数组的长度,而由系统自行处理。在采用字符串方式后,字符数组的输入输出将变得简单方便。5、字符数组的
输入输出除了上述用字符串赋初值的办法外,还可用printf函数和scanf函数一次性输出输入一个字符数组中的字符串,而
不必使用循环语句逐个地输入输出每个字符。字符数组的输入输出可以有两种方法:(1)逐个字符输入输出。用格式符“%c
”输入或输出一个字符(例7_8)。(2)将整个字符串一次输入或输出。用格式符“%s”。例EX7_9字符串的输入和输出
#includevoidmain(){ charc[]="BASIC\ndBASE"; printf
("%s\n",c);}注意在本例的printf函数中,使用的格式字符串为“%s”,表示输出的是一个字符串。而在输出表
列中给出数组名则可。不能写为:printf("%s",c[]);EX7_9_2字符串的输入和输出二#includeio.h>voidmain(){ charstr[15]; printf("Inputstring:\n"); sc
anf("%s",str); printf("%s\n",str);}本例中由于定义数组长度为15,因此输入的字符
串长度必须小于15,以留出一个字节用于存放字符串结束标志‘\0’。应该说明的是:(1)对一个字符数组,如果不作初始化赋值,则
必须说明数组长度。(2)字符数组并不要求它的最后一个字符为‘\0’,甚至可以不包含‘\0’;但将字符串赋予字符数组后,系统会自动
加上‘\0’,这是字符数组和字符串的一个重要区别,应予以特别注意。(3)还应该特别注意的是,当用scanf函数输入字符串时,字
符串中不能含有空格,否则将以空格作为串的结束符。例如当输入的字符串中含有空格时,运行情况为:Inputstring:This
isabook.从输出结果可以看出空格以后的字符都未能输出。例EX7_10用scanf函数输入字符串#include
voidmain(){ charstr[30]; printf("Inputstring:\n");
scanf("%s",str); printf("%s\n",str);}为了避免这种情况,可多设几个字符数组分段存放含
空格的串。程序可改写如下:EX7_10_2用scanf函数输入字符串二#includevoidmain
(){charstr1[6],str2[6],str3[6],str4[6];printf("Inputstri
ng:\n");scanf("%s%s%s%s",str1,str2,str3,str4);printf("%s
%s%s%s\n", str1,str2,str3,str4);}(4)在前面介绍过,scanf的各输入项必须以地
址方式出现,如&a,&b等。但在例EX7_10_2中却是以数组名方式出现的,这是为什么呢?这是由于在C语言中规定,数组名就代表了
该数组的首地址。整个数组是以首地址开头的一块连续的内存单元。如有字符数组charc[10],在内存可表示为P135图7.14。设
数组c的首地址为2000,也就是说c[0]单元地址为2000。则数组名c就代表这个首地址。因此在c前面不能再加地址运算符&。如写作
scanf("%s",&c);则是错误的。在执行函数printf("%s",c)时,按数组名c找到首地址,然后逐个输出数组中各个字
符直到遇到字符串终止标志''\0''为止。6、字符串常用函数C语言提供了丰富的字符串处理函数,大致可分为字符串的输入
、输出、合并、修改、比较、转换、复制、搜索几类。使用这些函数可大大减轻编程的负担。用于输入输出的字符串函数,在使用前应包含头文件“
stdio.h”;使用其它字符串函数则应包含头文件“string.h”。下面介绍几个最常用的字符串函数。(1)字符串输
出函数puts格式:puts(字符数组名)功能:把字符数组中的字符串(以‘\0’结束的字符序列)输出到显示器。即在屏幕上
显示该字符串。例EX7_9_3用puts改写EX7_9#include"stdio.h"voidmain(){ c
harc[]="BASIC\ndBASE"; puts(c);}从程序中可以看出puts函数中可以使用转义字符,因
此输出结果成为两行。puts函数输出一行后会自动换行,而不必加‘\n’。puts函数完全可以由printf函数取代。当需要按一定格
式输出时,通常使用printf函数。(2)字符串输入函数gets格式:gets(字符数组名)功能:从标准输入设备键盘上输
入一个字符串。本函数得到一个函数值,即为该字符数组的首地址。例EX7_11输入并输出一个串#include"stdio.h
"voidmain(){ charstr[15]; printf("Inputastring:\n"); gets
(str);puts(str);}本章要点数组在程序设计中,为了处理方便,把具有相同类型的若干变量按有
序的形式组织起来。这些按序排列的同类数据元素的集合称为数组。在C语言中,数组属于构造数据类型。一个数组可以分解为多个数组元素,这
些数组元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别。
本章介绍数值数组和字符数组,其余的在以后各章陆续介绍。1、一维数组的定义数组类型说明在C语言中使用数组
必须先进行类型说明,而后才可以使用。数组说明的一般形式为:类型说明符数组名[常量表达式],……;
其中,类型说明符是任一种基本数据类型或构造数据类型。数组名是用户定义的数组标识符。方括号中的常量表达式表示数据元素的个数,也称
为数组的长度。例如:inta[10]; 说明整型数组a,有10个元素。floatb[10],c[20];
说明实型数组b,有10个元素, 说明实型数组c,有20个元素。charch[20]; 说明字符数组ch,有20
个元素。对于数组类型说明应注意以下几点:(1)数组的类型实际上是指数组元素的取值类型。对于同一个数组,其所有元素的
数据类型都是相同的。(2)数组名的书写规则应符合标识符的书写规定。(3)数组名不能与其它变量名相同,例如: void
main() { inta; floata[10];/变量与数组同名/ …… }是错误的。(4)方括号
中常量表达式表示数组元素的个数,如a[5]表示数组a有5个元素。但是其下标从0开始计算。因此5个元素分别为: a[0],a[1
],a[2],a[3],a[4]。(5)不能在方括号中用变量来表示元素的个数,但是可以是符号常数或常量表达式。例如:
#defineFD5 voidmain() { inta[3+2],b[7+FD]; …… }是合法的。
但是下述说明方式是错误的。voidmain(){ intn=5; inta[n];/用变量定义数组/ …
…}(6)允许在同一个类型说明中,说明多个数组和多个变量。例如:inta,b,c,d,k1[10],k2[20
];在上述声明中,定义了四个整形变量a,b,c,d和两个数组变量k1,k2。2、一维数组元素的表示(引用)
数组元素是组成数组的基本单元。数组元素也是一种变量,其标识方法为数组名后跟一个下标。下标表示了元素在数组中的顺序号。
数组元素的一般形式为:数组名[下标]其中下标只能为整型常量或整型表达式。如为小数时,C编译将自动取整。例如,a[5
],a[i+j],a[i++]都是合法的数组元素。数组元素通常也称为下标变量。必须先定义数组,才能使用下标变量
。在C语言中只能逐个地使用下标变量,而不能一次引用整个数组。例如,输出有10个元素的数组必须使用循环语句逐个输出各
下标变量的值:for(i=0;i<10;i++)printf("%d",a[i]);而不能用一个语句输出
整个数组,下面的写法是错误的:printf("%d",a);例EX7_1数组元素的输入(赋值)和输出(打印)#incl
udevoidmain(){ inti,a[10]; for(i=0;i<10;) a[i++]=2
i+1; for(i=9;i>=0;i--) printf("%d,",a[i]); printf("\n%d%d\n
",a[5.2],a[5.8]);}3、一维数组的初始化数组的赋值给数组赋值的方法除了用赋值语句对数组元素逐个赋
值外,还可采用初始化赋值和动态赋值的方法。数组初始化赋值是指在数组说明时给数组元素赋予初值。数组初始化是在编译阶段进行的
。这样将减少运行时间,提高效率。初始化赋值的一般形式为:static类型说明符数组名[常量表达式]={值,
值,……,值};其中static表示是静态存储类型(可以省略不写),C语言规定只有静态存储数组和外部存储数组才可作初始
化赋值。在{}中的各数据值即为各元素的初值,各值之间用逗号间隔。例如:staticinta[10]={0,1,2,3,4
,5,6,7,8,9};相当于a[0]=0,a[1]=1,...,a[9]=9.C语言对数组的初始赋值还有以
下几点规定:(1)可以只给部分元素赋初值。当{}中值的个数少于元素个数时,只给前面部分元素赋值。例如: inta[10
]={0,1,2,3,4};表示只给a[0]-a[4]5个元素赋值,而后面5个元素自动赋0值。(2)只能给元素逐个赋
值,不能给数组整体赋值。例如给十个元素全部赋1值,只能写为:inta[10]={1,1,1,1,1,1,1,1,1,1};,
而不能写为:inta[10]={1};或inta[10]=1;(3)如不给可初始化的数组赋初值,则全部元素均为0值。(
5)动态赋值可以在程序执行过程中,对数组作动态赋值。这时可用循环语句配合scanf函数逐个对数组元素赋值。以下例子说明这种操作。
(4)如给全部元素赋值,则在数组说明中,可以不给出数组元素的个数。 例如: inta[5]={1,2,3,4,5};,
可写为: inta[]={1,2,3,4,5};。例EX7_2从键盘输入10个数据,并把其中最大的数输出。#incl
udevoidmain(){ inti,max,a[10]; printf("Input10num
bers:\n"); for(i=0;i<10;i++) scanf("%d,",&a[i]); max=a[0]; f
or(i=1;i<10;i++) if(a[i]>max)max=a[i]; printf("maxmum=%d\n",m
ax);}4、一维数组程序举例例EX7_3输入10个整数,并按从小到大的顺序输出(选择排序法)。voidmain
(){ inti,j,k,t,a[10]; printf("Input10numbers:\n"); for(i=0;
i<10;i++) scanf(“%d,",&a[i]); for(i=0;i<9;i++) { k=i; for(j
=i+1;j<10;j++) if(a[k]>a[j]) k=j; if(k!=i) { t=a[i];a[i]
=a[k];a[k]=t;} } for(i=0;i<10;i++)printf("%4d",a[i]); pr
intf(“\n”);}例EX7_4用冒泡排序法对10个数进行排序。#includevoidma
in(){ inti,j,t,a[10]; printf(“Input10numbers:\n”); for(i=1
;i<11;i++) scanf(“%d,”,&a[i]); printf(“\n”); for(i=1;i<=9;i++
) for(j=1;j<=10-i;j++) if(a[j]>a[j+1]) {t=a[j];a[j]=a
[j+1];a[j+1]=t;} printf(“Thesortednumbersis:\n”); for(i=
1;i<11;i++) printf(“%5d”,a[i]); printf(“\n”);}前面介绍的数组只有一个
下标,称为一维数组,其数组元素也称为单下标变量。在实际问题中有很多量是二维的或多维的,因此C语言允许构造多维数组。多维数组元素有
多个下标,以标识它在数组中的位置,所以也称为多下标变量。本小节只介绍二维数组,多维数组可由二维数组类推而得到。1、二
维数组的定义二维数组类型说明二维数组类型说明的一般形式是:类型说明符数组名[常量表达式1] [
常量表达式2]…;其中常量表达式1表示第一维下标的长度,常量表达式2表示第二维下标的长度。例如:inta[3][
4];说明了一个三行四列的数组,数组名为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]。二维数组在概念上是二维的,即是说其下
标在两个方向上变化,下标变量在数组中的位置也处于一个平面之中,而不是象一维数组只是一个向量。但是,实际的硬件存储器却是连续编址的,
也就是说存储器单元是按一维线性排列的。如何在一维存储器中存放二维数组,可有两种方式:一种是按行排列,即放完一行之后顺次放入第二行。
另一种是按列排列,即放完一列之后再顺次放入第二列。在C语言中,二维数组是按行排列的。在P126图7.4中,按行顺次存放,先存放
a[0]行,再存放a[1]行,最后存放a[2]行。每行中有四个元素也是依次存放。由于数组a说明为int类型,该类型占两个字节的内存空间,所以每个元素均占有两个字节。2、二维数组元素的表示(引用)二维数组的元素也称为双下标变量,其表示的形式为: 数组名[下标][下标]其中下标应为整型常量或整型表达式。例如a[2][3]。下标可以是整型表达式,如a[2-1][22-1]。不要写成a[2,3],a[2-1,22-1]形式。数组元素可以出现在表达式中,也可以被赋值,例如:b[1][2]=a[2][3]/2。在使用数组元素时,应该注意下标值应在已定义的数组大小的范围内,以防止下标越界(超出定义的范围)。如定义a为3×4的数组,即inta[3][4],那么它的行下标最大值为2,列下标最大值为3。如果用a[3][4]表示数组的一个元素,则超过了数组的定义范围。请严格区分在定义数组时用的a[3][4]和引用元素时的a[3][4]是有区别的。前者a[3][4]用来定义数组的维数和各维的大小,后者a[3][4]中的3和4是下标值,a[3][4]代表某一个元素,不在定义的范围内。一般情况下,只有在定义数组时才被认定为数组,即在inta[3][4]时,a[3][4]被视为数组,除此以外,都被视为数组的元素。(也就是说除声明部分所说明的以外,其余任何情形都被视为数组元素。3、二维数组的初始化二维数组初始化也是在类型说明时给各下标变量赋以初值。二维数组可按行分段赋值,也可按行连续赋值。例如对数组a[5][3]:(1)按行分段赋值可写为: inta[5][3]={{80,75,92},{61,65,71}, {59,63,70},{85,87,90},{76,77,85}};(2)按行连续赋值可写为: inta[5][3]={80,75,92,61,65,71,59, 63,70,85,87,90,76,77,85};(3)也可以对部分元素赋值:inta[3][4]={{1},{5},{9}};它的作用是只对各行的第1列的元素赋初值,其余元素的值自动为0。赋值后数组各元素的值为:
献花(0)
+1
(本文系紫霄书屋首藏)