就是一组具有固定数目的、有序的、类型相同的数据的集合。根据数组下标的多少,数组可以分为一维数组和多维数组。例如:一个班级有30个学生,可以用g1,g2,…,g30代表学生的成绩,其中g是数组名,下标代表学生的序号。由于在C语言中无法表示下标,所以就引入了[]表示下标。g[1]:第1个学生的成绩g[i]:第i个学生的成绩等等类型说明符数组名[常量表达式]inta[10]任一种基本数据类型或构造数据类型。用户自定义的数组名字,其定名规则与变量名定名规则一样,都需遵循标识符定名规则表示元素的个数,即数组长度。[]——下标运算符单目运算符优先级(1)左结合不能用()注意:1.数组名不能与其它变量名相同voidmain(){inta;floata[10];……}2.不能在方括号中用变量来表示元素的个数,但可以是符号常数或常量表达式。……intn;scanf(%d,&n);/*表示维数的只能是常量*/inta[n];#defineFD5voidmain(){inta[3+2],b[7+FD];……}3.方括号中常量表达式表示数组元素的个数。如inta[5]:数组a有5个元素,其下标从0开始,分别为a[0],a[1],a[2],a[3],a[4]。4.允许在同一个类型说明中说明多个数组和多个变量。例如:inta,b,c,d,k1[10],k2[20];如果出现数组越界,编译系统没有提示的。数组必须先定义,然后使用。数组元素的表示形式为:数组名[下标]C语言规定只能逐个引用数组元素而不能一次引用整个数组。可以是整型常量或整型表达式全部初始化部分初始化使用输入函数scanf初始化使用表达式赋值inta[10]={0,1,2,3,4,5,6,7,8,9};a[0]=0;a[1]=1;a[2]=2;a[3]=3;a[4]=4;a[5]=5;a[6]=6;a[7]=7;a[8]=8;a[9]=9;inta[10]={0,1,2,3};a[0]=0;a[1]=1;a[2]=2;a[3]=3;a[4]=0;a[5]=0;a[6]=0;a[7]=0;a[8]=0;a[9]=0;inta[10];for(inti=0;i10;i++)scanf(%d,&a[i]);inta[10]={0,1,2,3};a[4]=a[3]+2;对全部数组元素赋初值时,数组长度可以省略inta[5]={1,2,3,4,5};54321a[4]a[3]a[2]a[1]a[0]20202016201220082004a#includestdio.hvoidmain(){inta[5]={0,1,2,3,4};for(inti=0;i5;i++)printf(a[%d]=%d,其地址是%d\n,i,a[i],&a[i]);printf(数组的首地址为:%d\n,a);printf(数组a在内存中占字节数:%d\n,sizeof(a));}数组名表示数组的起始地址,是一个地址常量程序举例1:用选择排序法进行排序。选择排序法是编程中经常用的一种排序算法。具体如下:先将5个数中最小的数与a[0]对换,再将a[1]到a[4]中最小的数与a[1]对换,这样每比较一轮,找出一个未经排序的数中最小的一个。共比较4轮。inta[5]={3,6,1,9,4};§1.4一维数组程序举例a[0]a[1]a[2]a[3]a[4]36194未排序的情况16394将5个数中最小的数1与a[0]对换13694将余下的4个数中最小的数3与a[1]对换13496将余下的3个数中最小的数4与a[2]对换13469将余下的2个数中最小的数6与a[3]对换main(){inti,j,k,t;inta[5]={3,6,1,9,4};for(i=0;isizeof(a)/sizeof(int)–1;i++){k=i;for(j=i+1;jsizeof(a);j++){if(a[j]a[k])k=j;}if(k!=i){t=a[i];a[i]=a[k];a[k]=t;}}}数组的起始下标、最后一个元素的下标定义数组时不指定长度(动态数组)对数值型数组进行整体操作用scanf语句时,数组元素前应加&语句错误,不了解数组定义时与数组元素使用时的区别:scanf(“%d”,a[10]);一维数组的定义、初始化、引用、输入、输出概念、操作必须掌握数组中的所有元素,数据类型都一致数组名字代表数组的首地址,是一个常量数组元素具有和相同单个变量一样的属性,凡允许使用单个变量的地方均可以使用数组元素这儿只讨论二维数组,多维数组可由二维数组推导得出二维数组定义的一般形式为:类型说明符数组名[常量表达式][常量表达式]第一常量表达式为行数,第二个为列数inta[3][4];floata[3,4],b[5,10];/*错误*/]3][2[]2][2[]1][2[]0][2[]3][1[]2][1[]1][1[]0][1[]3][0[]2][0[]1][0[]0][0[aaaaaaaaaaaa二维数组中的元素在内存中的排列顺序是:按行存放,即先顺序存放第一行的元素,再存放第二行的元素…二维数组在内存中的存放下图表示对a[3][4]数组存放的顺序inta[2][3]={1,2,3,4,5,6};a[0]654321a[1][2]a[1][1]a[1][0]a[0][2]a[0][1]20222018201420102006a[0][0]2002a[1]#includestdio.hvoidmain(){inta[2][3]={1,2,3,4,5,6},i,j;for(i=0;i2;i++)for(j=0;j3;j++)printf(第a[%d][%d]元素=%d,其地址为:%d\n,i,j,a[i][j],&a[i][j]);printf(a=%d\ta[0]=%d\ta[1]=%d\n,a,a[0],a[1]);}二维数组的表示形式:数组名[下标][下标]注意:下标可以是整型表达式,如a[2-1][2*2-1]数组元素可以出现在表达式中,也可以被赋值b[1][2]=a[2][3]/2;在使用数组元素时,应该注意下标值应在已定义的数组大小范围内inta[3][4];…a[3][4]=5;严格区分在定义数组时用的a[3][4]和引用元素时的a[3][4]全部初始化部分初始化使用输入函数scanf初始化inta[2][3]={0,1,2,3,4,5};inta[2][3]={{0,1,2},{3,4,5}};a[0][0]=0;a[0][1]=1;a[0][2]=2;a[1][0]=3;a[1][1]=4;a[1][2]=5;inta[2][3]={0,1,2};inta[2][3]={{0},{1}};a[0][0]=0;a[0][1]=1;a[0][2]=2;a[1][0]=0;a[1][1]=0;a[1][2]=0;inta[2][3];for(inti=0;i2;i++)for(intj=0;j3;j++)scanf(%d,&a[i][j]);对全部数组元素赋初值时,第一维的长度可以省略例3:一个学习小组有5个人,每个人有三门课的考试成绩。求全组分科的平均成绩和各科总平均成绩。EnglishMathC张807592王616571李596370赵858790周767785例3:一个学习小组有5个人,每个人有三门课的考试成绩。求全组分科的平均成绩和各科总平均成绩。fori=0to2forj=0to4sum[i]+=score[i][j]avg[i]=sum[i]/5fori=0to2outputavg[i]avg+=avg[i]outputavg/3#includestdio.h#defineN3#defineM5voidmain(){floatscore[N][M],avg1=0,avg[N],sum[N]={0};inti,j;for(i=0;iN;i++)for(j=0;jM;j++){printf(第%d门课,第%d个学生的成绩:,i,j);scanf(%f,&score[i][j]);}for(i=0;iN;i++){for(j=0;jM;j++)sum[i]+=score[i][j];avg[i]=sum[i]/M;}for(i=0;iN;i++){printf(第%d门课的平均成绩为%.2f\n,i,avg[i]);avg1+=avg[i];}printf(各科总平均成绩为%.2f\n,avg1/N);}二维数组在内存中是按行存放数组元素的下标每一维都是从0开始的数值型数组不能够整体引用可以把二维数组看成是一个特殊的一维数组,即其元素是一个一维数组二维数组初始化有两种方法:按行赋值或者一行赋值字符数组:用来存放字符数据的数组就是字符数组。定义方式:char数组名[长度]一维数组:chara[10];二维数组:chara[4][5];对字符数组初始化,最容易理解的方式是逐个字符赋给数组中各元素。如:Charc[10]={’I’,’’,’a’,’m′,’’,’h’,’a’,’p’,’p’,’y’};如果在定义字符数组时不进行初始化,则数组中各元素的值是不可预料的。如果花括弧中提供的初值个数(即字符个数)大于数组长度,则按语法错误处理。注意:如果初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余的元素自动定为空字符(即′\0′)。例如:charc[10]={′c′,′′,′p′,′r′,′o′,′g′,′r′,′a′,′m′};在定义字符数组时可以省略数组长度,系统会自动根据初值个数确定数组长度。例如:charc[]={′I′,′′,′a′,′m′,′′,′h′,′a′,′p′,′p′,′y′};数组c的长度自动定为10。#includestdio.hvoidmain(){charc[10]={‘I’,’’,’a’,’m’,’’,’a’,’’,’b’,’o’,’y’};inti;for(i=0;i10;i++)printf(“%c”,c[i]);printf(“\n”);}可以引用字符数组中的一个元素,得到一个字符在实际编程中,最常用的是字符串。在C中是用字符数组存放字符串。字符串以‘\0’作为串结束符,因此当把字符串存入数组时,也把‘\0’存入数组,并以此作为该字符串是否结束的标志。程序中通过循环扫描字符数组元素,读到‘\0’时候便认为字符串结束。用字符串方式赋值比用字符逐个赋值要多占一个字节,用于存放字符串结束标志‘\0’。例如:数组charc[]=“cprogram”在内存中的实际存放情况为:Cprogram\0`\0‘是由C编译系统自动加上的。由于采用了`\0’标志,所以在用字符串赋初值时一般无须指定数组的长度,而由系统自行处理。charc[]={″China″};printf(″%s″,c);例如在内存中数组c的状态字符数组的输入输出可以有两种方式:逐个字符输入输出。用”%c”输入或输出一个字符将整个字符串一次输出。用“%s”格式符,charc[]={“China”};printf(“%s”,c);China\0China注意:输出字符不包括结束符’\0’;用“%s”格式符输出字符串时,printf函数中的输出项时字符数组名,而不是数组元素名。printf(“%s”,c);如果数组长度大于字符串实际长度,也只输出遇’\0’结束如果一个字符数组中包含一个以上’\0’,则遇到第一个’\0’时结束。#includestdio.hvoidmain(){charst[15];printf(inputstring:\n);scanf(%s,st);printf(%s\n,st);}本例中由于定义数组长度为15,因此输入的字符串长度必须小于15,以留出一个字节用于存放字符串结束标志`\0`。对于字符数组,如果不作初始化赋值,则须说明数组长度。应该特别注意的是,当用sca