第8章数组8.1一维数组8.2多维数组8.3字符串8.1.1一维数组的定义8.1.3一维数组的初始化8.1.2一维数组的引用8.1.4一维数组应用举例•8.3.1字符型数组•8.3.2字符串•8.3.3字符串处理函数只包含一个下标的数组称为“一维数组”,定义格式如下:类型说明符数组名[常量表达式];例如:intarray[5];8.1.1一维数组的定义随机值随机值随机值随机值随机值array[0]array[1]array[2]array[3]array[4]一次定义,产生一组变量,可用于存储值说明:(1)“数组名”是标识符,应该遵循标识符构成规则和作用域规则,即在同一个作用域内,两个数组不能同名,数组和简单变量也不能同名。(2)“类型说明符”是数组中各元素的类型。(3)“数组名”后的方括号个数表示数组的维数,一个方括号表示定义的是一维数组。(4)方括号中的“常量表达式”表示数组的元素个数,即数组长度。表达式只可包含常量,不能包含变量。C语言不允许动态定义数组大小。(5)数组也是变量,在一个语句中可以同时定义多个数组,数组也可以和简单变量一同定义。例如:inta,array[5];8.1.1一维数组的定义类型说明符数组名[常量表达式];8.1.3一维数组的初始化在定义数组时,给数组元素的赋初值,称为数组的初始化。初始化数组时,数组元素的初始值用花括号括起来,各常量之间用逗号分隔,形成常量表。常量列表的每一项和数组中各元素依次对应。例如:floatgrade[3]={90.0,75.0,85.0};90.075.085.0grade[0]grade[1]grade[2]注意:(1)如果数组没有初始化,外部变量或静态变量默认赋初值为0(数组各元素均为0),自动变量赋初值随机。1234500000a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9](2)初始化数组时,初始值的个数可以比数组元素的个数少,未提供初值的元素被置为0。(自动变量也是如此)例如:inta[10]={1,2,3,4,5};-858993460-858993460-858993460a[0]a[1]a[2]inta[3];000a[0]a[1]a[2]Staticinta[3];(3)当对全部数组元素赋初值时,可以不指定数组长度,但数组名后面的方括号不能省略。例如:inta[5]={1,2,3,4,5};可以写成:inta[]={1,2,3,4,5};但不能写成:inta={1,2,3,4,5};╳(5)初始化是在编译时完成的,而赋值运算是在程序运行时进行的,要注意二者的区别。例如不能把:inta[5]={1,2,3,4,5};写成inta[5];a={1,2,3,4,5};╳inta[5];a[5]={1,2,3,4,5};╳8.1.3初始化数组应注意数组必须先定义后引用。数组定义之后,系统为该数组在内存分配一块连续的存储空间,数组中各元素在内存中依次存放。数组中每个元素有一个序号(下标)与存储空间的起始位置相关联,序号从零开始,序号最大值为数组长度减1。若要引用数组中的某个元素应使用表达式:数组名[下标]其中“下标”是一个整型表达式,其值表示某个元素在数组中的序号。8.1.2一维数组的引用例8.1.1用于计算某学生三门课程的平均成绩。程序中用数组grade存放学生各课程成绩,用简单变量avg存储平均成绩。#includestdio.hvoidmain(){floatgrade[3],avg;grade[0]=90;grade[1]=75;grade[2]=85;avg=(grade[0]+grade[1]+grade[2])/3;printf(“avg=”%f\n”,avg);}8.1.2一维数组的引用_赋值#includestdio.hvoidmain(){inti,a[3];printf(请输入3个整数:\n);for(i=0;i3;i++)scanf(%d,&a[i]);8.1.2一维数组的引用_赋值与输出例8.1.2:从键盘输入三个整数,然后按相反的顺序输出。程序清单如下。for(i=2;i=0;i--)printf(%d\t,a[i]);printf(\n);}C编译系统没有对数组下标进行越界检查。当引用数组元素时,下标值不在数组定义的下标范围内,系统并没有产生编译错误,但运行时会引用到不属于本数组的其他存储空间,这就可能会破坏其他变量的数据,或破坏目标代码甚至破坏系统程序,从而引起运行错误。8.1.2引用数组时注意事项例:inta[10]={1,2,3,4,5};printf(%d\t,a[10]);╳例8.1.3:用数组求Fibonacci数列的前20项(1,1,2,3,5,8……),程序清单如下。#includestdio.hvoidmain(){inti,f[20]={1,1};//定义并初始化数组f,使f[0]=1,f[1]=1,其余元素为0for(i=2;i20;i++)f[i]=f[i-1]+f[i-2];//数列的第i项等于第i-1项和第i-2项之和for(i=0;i20;i++){printf(%d\t,f[i]);if((i+1)%5==0)//每输出5个数据后换行printf(\n);}}8.1.4一维数组应用举例#includestdio.hvoidmain(){inti,score,n=0;intnum[11]={0};printf(输入各学生的考试成绩,);scanf(%d,&score);while(score!=-1){n++;//统计班级人数num[score/10]++;//统计各分数段人数scanf(%d,&score);}8.1.4一维数组应用举例例8.1.4:由键盘输入一个班级的学生考试成绩,当输入-1时,表示全部数据输入完毕。统计出本班的人数和各分数段的人数。以10分为一个分数段,即0~9,10~19,…,90~99,100共11个分数段,程序清单如下。printf(人数为:%d\n,n);printf(分数段:\t人数\n);for(i=0;i10;i++)printf(%d~%d:\t%d\n,i*10,i*10+9,num[i]);printf(100:\t%d\n,num[10]);}#includestdio.h#defineN10voidmain(){intmax,min,a[N],i;printf(Inputnumbers:\n);for(i=0;iN;i++)scanf(%d,&a[i]);max=min=a[0];for(i=1;iN;i++){if(a[i]max)max=a[i];if(a[i]min)min=a[i];}printf(max=%d\n,max);printf(min=%d\n,min);}8.1.4一维数组应用举例例8.1.6:输入10个整数,输出其中的最大者和最小者,程序清单如下。例8.1.7:用冒泡法对10个整数排序,程序清单如下。#includestdio.hvoidmain(){inti,j,t,n,a[100];printf(n=);scanf(%d,&n);printf(Inputnumbers:\n);for(i=0;in;i++)scanf(%d,&a[i]);8.1.4一维数组应用举例for(i=1;in;i++)for(j=0;jn-i;j++)if(a[j]a[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=t;}printf(Thesortednumbers:\n);for(i=0;in;i++)printf(%d\t,a[i]);printf(\n);}8.2.1二维数组:定义与引用二维数组的定义类型数组名[常量表达式1][常量表达式2];例如:floata[3][4];说明了一个3行4列的数组。C的二维数组事实上是一种特殊的一维数组:每个元素都是一个一维数组的一维数组。C的二维数组在内存中是按行存放。引用:数组名[下标1][下标2]C还允许使用多维数组类型数组名[常量表达式1]…[常量表达式n];其元素在内存中的排列顺序是:第一维的下标变化最慢,最后一维的下标变化最快。例如,已知inta[2][2][2];则数组a的元素在内存中的排列为:a[0][0][0]a[0][0][1]a[0][1][0]a[0][1][1]a[1][0][0]a[1][0][1]a[1][1][0]a[1][1][1]8.2.2.二维数组初始化初始化可以按分行赋初值的方式,也可以按不分行赋初值的方式,分行赋初值程序更清晰。例如:inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};等价于inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};也可只对部分元素赋初值。例子:inta[3][4]={{1},{5},{9}};inta[3][4]={{1},{0,6},{0,0,11}};inta[3][4]={{1},{5,6}};inta[3][4]={{1},{},{9}};inta[3][4]={{1},{0},{9}};如果初始化提供了足够的信息(如,全部初始化或分行初始化),则定义数组时可以省略第一维的长度。例8.2.1(距阵的转置)例8.2.3(打印杨辉三角)也可以用一维数组实现。返回8.2.3二维数组应用举例求一个3×4的矩阵中最大的元素。voidmain(){inta[3][4]={{1,2,3,4},{9,8,7,6},{-10,10,-5,2}};inti,j;introw=0,colum=0,max=a[0][0];for(i=0;i=2;i++)for(j=0;j=3;j++)if(a[i][j]max){max=a[i][j];row=i;colum=j;}printf(max=%d,row=%d,colum=%d\n,max,row,colum);}返回请注意体会在若干个数中寻找最大(小)值的一般做法:(1)假设第一个元素为所求,将其值记录为当前最大(小)值(2)从第二个(或第一个)元素起,逐个判断,如果发现它比当前最大(小)值大(小),则将其值记录为新的当前最大(小)值示例:使用二维字符数组输出一个钻石图形voidmain(){chardiamond[][5]={{'','','*'},{'','*','','*'},{'*','','','','*'},{'','*','','*'},{'','','*'}};inti,j;for(i=0;i5;i++){for(j=0;j5;j++)printf(%c,diamond[i][j]);printf(\n);}}返回8.3.1字符型数组8.3.2字符串8.3.3字符串处理函数(*)8.3字符串数组元素类型为整型的数组,称为“整型数组”。数组元素类型为字符型的数组称为“字符型数组”,简称“字符数组”。定义字符数组并对字符数组初始化,用户提供的初始值列表必须是字符常量表。例如:#includestdio.hvoidmain(){chari,c[5]={‘H’,’e’,’l’,’l’,’o’};for(i=0;i5;i++)printf(“%c”,c[i]);printf(“\n”);}8.3.1字符型数组8.3.1字符型数组定义字符数组c也可用省略数组长度的方式:charc[]={‘H’,’e’,’l’,’l’,’o’};定义字符数组并初始化,当提供的字符常量个数少于数组元素个数时,其余元素定为空字符’\0’,空字符即ASCII码为0的字符。例如:charc[10]={‘H’,’e’,’l’,’l’,’o’};则数组c的值如下:Hello\0\0\0\0\0c[0]c[1]c[2]c[3]c[4]c[5]c[6]c[7