第七章数组7.1一维数组的定义和引用7.2二维和多维数组的定义和引用7.3字符串和字符数组7.4程序举例(排序)把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称为数组。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。数组有数值数组、字符数组、指针数组、结构数组等各种类别。7.1一维数组的定义和使用7.1.1一维数组的定义方式类型说明符数组名[常量表达式];任一种基本数据类型或构造数据类型用户定义的数组标识符表示数据元素的个数,也称为数组的长度例如:inta[10];floatb[10],c[20];charch[20];说明整型数组a,有10个元素。说明实型数组b,有10个元素,实型数组c,有20个元素。说明字符数组ch,有20个元素。注意:数组元素与变量一样地使用(数组不能与变量一样地使用)。数组元素与变量主要区别:1.它们的名字形式不同2.同一数组中各元素必须同类型3.数组名不能与其它变量名相同。例如:main(){inta;floata[10];……}×变量重名4.方括号中常量表达式表示数组元素的个数,但是其下标从0开始计算。因此5个元素分别为:a[0],a[1],a[2],a[3],a[4]5.定义时不能在方括号中用变量来表示元素的个数,但是可以是符号常数或常量表达式。6.允许在同一个类型说明中,说明多个数组和多个变量。例如:inta,b,c,d,k1[10],k2[20];例如:#defineFD5main(){inta[3+2],b[7+FD];……}main(){intn=5;inta[n];……}×√定义时不能用,但引用时可以7.1.2一维数组元素的引用数组元素是组成数组的基本单元,也是一种变量,其标识方法为数组名后跟一个下标,表示元素在数组中的顺序号。数组元素的一般形式为:数组名[下标]其中下标只能为整型常量或整型表达式。如为小数时,C编译将自动取整。例如:a[5]a[i+j]a[i++]都是合法的数组元素。定义时不能用,引用时可以数组元素通常也称为下标变量。必须先定义数组,才能使用下标变量。在C语言中只能逐个地使用下标变量,而不能一次引用整个数组。例如:输出有10个元素的数组必须使用循环语句逐个输出各下标变量:for(i=0;i10;i++)printf(%d,a[i]);而不能用一个语句输出整个数组。下面的写法是错误的:printf(%d,a);×√例7.1voidmain(){inti,a[10];for(i=0;i=9;i++)a[i]=i;for(i=9;i=0;i--)printf(%d,a[i]);}a[0]0a[1]1a[2]2a[3]3a[4]4a[5]5a[6]6a[7]7a[8]8a[9]9运行结果:9876543210空格逐一赋值逐一输出例7.2voidmain(){inti,a[10];for(i=0;i10;)a[i++]=i;for(i=9;i=0;i--)printf(%d,a[i]);}a[0]0a[1]1……a[9]9a[9]9a[8]8……a[0]0运行结果:9876543210例7.3voidmain(){inti,a[10];for(i=0;i10;)a[i++]=2*i+1;for(i=0;i=9;i++)printf(%d,a[i]);printf(\n%d%d\n,a[5.2],a[5.8]);}运行结果:1357911131517191111a[0]2*0+1=1a[1]2*1+1=3a[2]2*2+1=5……a[5]2*5+1=11……a[9]2*9+1=197.1.3一维数组的初始化给数组赋值的方法除了用赋值语句对数组元素逐个赋值外,还可采用初始化赋值和动态赋值的方法。初始化赋值的一般形式为:类型说明符数组名[常量表达式]={值,值……值};其中在{}中的各数据值即为各元素的初值,各值之间用逗号间隔。例如:inta[10]={0,1,2,3,4,5,6,7,8,9};相当于a[0]=0;a[1]=1...a[9]=9;对数组的初始化赋值还有以下几点规定: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;3)如给全部元素赋值,则在数组说明中,可以不给出数组元素的个数。例如:inta[5]={1,2,3,4,5};可写为:inta[]={1,2,3,4,5};例7.4voidmain(){inti,max,a[10];printf(input10numbers:\n);for(i=0;i10;i++)scanf(%d,&a[i]);max=a[0];for(i=1;i10;i++)if(a[i]max)max=a[i];printf(maxmum=%d\n,max);}定义一个10个元素的整型数组逐一输入十个数组元素的值逐一比较,得出最大值输入:14523146730输出:maxmum=31例7.5voidmain(){inti,j,p,q,s,a[10];printf(\ninput10numbers:\n);for(i=0;i10;i++)scanf(%d,&a[i]);for(i=0;i10;i++){p=i;q=a[i];for(j=i+1;j10;j++)if(qa[j]){p=j;q=a[j];}if(i!=p){s=a[i];a[i]=a[p];a[p]=s;}printf(%d,a[i]);}}逐一输入十个数组元素的值做十次循环a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]输入:1452986730输出:9876543210从一维数组可以延伸到二维甚至多位数组数组a:a[0]a[1]a[2]a[3]······a[29]a[30]数组c:c[0][0]c[0][1]c[0][2]c[0][3]c[0][4]c[1][0]c[1][1]c[1][2]c[1][3]c[1][4]c[2][0]c[2][1]c[2][2]c[2][3]c[2][4]数组x:x[0][0][0]x[0][0][1]x[0][0][2]x[0][1][0]x[0][1][1]x[0][1][2]x[1][0][0]x[1][0][1]x[1][0][2]x[1][1][0]x[1][1][1]x[1][1][2]x[2][0][0]x[2][0][1]x[2][0][2]x[2][1][0]x[2][1][1]x[2][1][2]7.2二维和多维数组的定义和使用7.2.1数组元素名一般形式数组名[表达式1][表达式2][表达式3]···[表达式n]例1:a[3]b[i][j]c[2][u*4+1.5][k]例2:若i=2、j=3.7则b[i][j]、b[j-i+1][3.256]与b[2][3]表示同一个数组元素若此某一表达式为实型,则只把该表达式值的整数部分作为相应下标;所有数组名部分相同、维数相同、相应下标相同的数组元素名表示同一个数组元素。7.2.2数组的定义把下面形式的数组说明符写在定义部分数组名[整型常量表达式1][整型常量表达式2]·····[整型常量表达式n]例3:#defineN10voidmain(){inta,b=2,f[30],k;charc1,c2,a[2][2*N+1],w[k];……}7.2.3引用时注意:只引用数组元素、不引用数组(字符型数组例外)×变量下标不行7.2.4数组的初始化(在定义部分使数组中部分或全部元素得到值)例4intk,a[3]={5,7,2},l;floatv[5]={7.1,2.5},f,q=36.8;charc[]={’a’,’’,’p’,’e’,’n’};----字符数组charc[]={’a’,’’,’p’,’e’,’n’,’\0’};charc[]=”apen”;inta[3][2]={1,2,3,4,5};inta[3][2]={{1,2},{3},{4,5}};charc[][2]={’a’,’b’,’c’,’d’}V[0]V[1]V[2]V[3]V[4]7.12.5000c[0]c[1]c[2]c[3]c[4]c[5]apen\0a[0][0]1a[0][1]2a[1][0]3a[1][1]4a[2][0]5a[2][1]0a[0][0]1a[0][1]2a[1][0]3a[1][1]0a[2][0]4a[2][1]5系统自动补上?多维数组可按行分段赋值;也可按行连续赋值。例如对数组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};7.2.5数组中各元素在内存中的排列顺序——按行排列数组c:c[0][0]c[0][1]c[0][2]c[0][3]c[0][4]c[1][0]c[1][1]c[1][2]c[1][3]c[1][4]c[2][0]c[2][1]c[2][2]c[2][3]c[2][4]数组x:x[0][0][0]x[0][0][1]x[0][0][2]x[0][1][0]x[0][1][1]x[0][1][2]x[1][0][0]x[1][0][1]x[1][0][2]x[1][1][0]x[1][1][1]x[1][1][2]x[2][0][0]x[2][0][1]x[2][0][2]x[2][1][0]x[2][1][1]x[2][1][2]1)可以只对部分元素赋初值,未赋初值的元素自动取0值。例如:inta[3][3]={{1},{2},{3}};赋值后各元素的值为:inta[3][3]={{0,1},{0,0,2},{3}};赋值后的元素值为:a[0][0]a[0][1]a[0][2]100a[1][0]a[1][1]a[1][2]200a[2][0]a[2][1]a[2][2]300a[0][0]a[0][1]a[0][2]010a[1][0]a[1][1]a[1][2]002a[2][0]a[2][1]a[2][2]3002)如对全部元素赋初值,则第一维的长度可以不给出。例如:inta[3][3]={1,2,3,4,5,6,7,8,9};可以写为:inta[][3]={1,2,3,4,5,6,7,8,9};例7.6voidmain(){intk=2,a0=10,a1=11,a2=12,ak=8;inta[3]={20,21,22};a[k]=18;for(k=0;k=2;k++)printf(”%d,%d\n”,ak,a[k]);}a[0]=20,a[1]=21,a[2]=22a[2]=18运行结果:8,208,218,18变量,非数组元素例7.7voidmain(){inta[6],k;floatt;for(k=0;k=5;k++)a[k]=5*k+1;for(k=0;k=5;k++){t=0.7*k;printf(”%d,”,a[t]);}}a[0]5*0+1=1a[1]5*1+1=6a[2]5*2+1=11a[3]5*3+1=16a[4]5*4+1=21a[5]5*5+1=26kta[t]00a[0]10.7a[0]21.4a[1]32.1a[2]42.8a[2]53.5a[3]输出:1,1,6,11,11,16例7.8写出下面程序的运行结果并比较它们的区别voidmain(){inta[4][4]={1,2,3,4,5,6,7,