1.7.2数组名作函数参数可以用数组名作函数参数,此时形参应当用数组名或用指针变量。&^7G4x:s;zd2q,i&h例1.11有一个一维数组score,内放10个学生成绩,求平均成绩。1.#includestdio.h2.voidmain()3.{4.floataverage(floatarray[10]);/*函数声明*/5.floatscore[10],aver;6.inti;7.printf('input10scores:\n);8.for(i=0;i10;i++)9.scanf(%f,&score[i]);10.printf(\n);11.aver=average(score);12.printf(averagescoreis%5.2f\n″,aver);13.}14.floataverage(floatarray[10])15.{16.inti;17.floataver,sum=array[0];18.for(i=1;110;i++)19.sum=sum+array[i];s20.aver=sum/10;21.return(aver);22.}复制代码运行情况如下:1.input10scores:2.100567898.576879967.57597↙3.averagescoreis83.40复制代码例1.12形参数组不定义长度1.#includestdio.h2.voidmain()3.{4.floataverage(floatarray[],intn)5.floatscore_1[5]={98.5,97,91.5,60,55};6.floatscore_2[10]={67.5,89.5,99,69.5,77,89.5,76.5,54,60,99.5};7.printf(theaverageofclassAis%6.2f\n,average(score_1,5));8.printf(theaverageofclassBis%6.2f\n,average(score_2,10));9.}10.floataverage(floatarray[],intn)11.{12.inti;13.floataver,sum=array[0];14.for(i=1;in;i++)15.sum=sum+array[i];16.aver=sum/n;17.return(aver);18.}复制代码运行结果如下:1.theaverageofclassAis80.402.TheaverageofclassBis78.20复制代码例8.13用选择法对数组中10个整数按由小到大排序。所谓选择法就是先将10个数中最小的数与a[0]对换;再将a[1]到a[9]中最小的数与a[1]对换……每比较一轮,找出一个未经排序的数中最小的一个。共比较9轮。1~$F/s*x9G$wa[0]a[1]a[2]a[3]a[4]r+v+wf6z%b8_#d3H*t9C36194未排序时的情况16394!h`9r.V7CR:`0hR!o将5个数中最小的数1与a[0]对换7hy+B3b&@z1?:F:[7P13694+s0D.h:a6U/X9E6F将余下的4个数中最小的数3与a[1]对换13496j8A$y.uZ将余下的3个数中最小的数4与a[2]对换:`&@-b3^9@/P#{.[13469n2s.L6J#l#C-C4E5S将余下的2个数中最小的数6与a[3]对换,至此完成排序-a:m6h'o%E-r+A/d9[程序实例1.#includestdio.h2.voidmain()3.{4.voidsort(intarray[],intn);5.inta[10],i;6.printf(enterthearray\n);7.for(i=0;i10;i++)8.scanf(%d,&a[i]);9.sort9a,10);10.printf(thesortedarray:\n);11.for(i=0;i10;i++)12.printf(%d,a[i]);13.printf(\n);14.}15.voidsort9intarray[],intn)16.{17.inti,j,k,t;18.for(i=0;in-1;i++)19.{20.k=i;21.for(j=i+1;jn;j++)22.if(array[j]array[k]=k=j)23.t=array[k];24.array[k]=array[i];25.array[i]=t;26.}27.}复制代码程序如下:1.#includestdio.h2.voidmain()3.{4.max_value(intarray[][4]);5.int[3][4]={{1,3,5,7},{2,4,6,8},{15,17,34,12}};6.printf(maxvalueis%d\n,max_value(a));7.}8.max_value(intarray[][4])9.{10.inti,j,k,max;11.max=array[0][0];12.for(i=0;i3;i++)13.for(j=0;j4;j++)14.if(array[i][j]max)15.max=array[i][j];16.return(max);17.}复制代码运行结果如下:1.Maxvalueis34复制代码1.8局部变量和全局变量6q,W)p;Y4N%]1.8.1局部变量在一个函数内部定义的变量是内部变量,它只在本函数范围内有效,也就是说只有在本函数内才能使用它们,在此函数以外是不能使用这些变量的。这称为“局部变量”。1.floatf1(inta)函数2.{intb,c;3.…a、b、c有效4.}5.charf2(intx,inty)函数f2*/6.{inti,j;x、y、i、j有效7.}8.voidmain()主函数9.{intm,n;10.…m、n有效11.}复制代码说明:Qk9L,I)c$[$[(1)主函数中定义的变量(m,n)也只在主函数中有效,而不因为在主函数中定义而在整个文件或程序中有效。主函数也不能使用其他函数中定义的变量。(2)不同函数中可以使用相同名字的变量,它们代表不同的对象,互不干扰。例如,上面在f1函数中定义了变量b和c,倘若在f2函数中也定义变量b和c,它们在内存中占不同的单元,互不混淆。+`B.L$m#w7[(3)形式参数也是局部变量。例如上面f1函数中的形参a,也只在f1函数中有效。其他函数可以调用f1函数,但不能引用f1函数的形参a。9|+un)[+l.l(4)在一个函数内部,可以在复合语句中定义变量,这些变量只在本复合语句中有效,这种复合语句也称为“分程序”或“程序块”。1.voidmain()2.{3.inta,b;4.…5.{6.intc;7.c=a+b;c在此范围内有效a,b在此范围内有效8.…9.}10.…11.}复制代码1.8.2全局变量5MX#O%^0o$b4u&P在函数内定义的变量是局部变量,而在函数之外定义的变量称为外部变量,外部变量是全局变量(也称全程变量)。全局变量可以为本文件中其他函数所共用。它的有效范围为从定义变量的位置开始到本源文件结束。1.intp=1,q=5;/*外部变量*/2.floatf1(inta)/*定义函数f1*/3.{4.intb,c;5.…6.}7.charc1,c2;/*外部变量8.charf2(intx,inty)/*定义函数f2*/9.{10.inti,j;全局变量p,q的作用范围11.…全局变量c1,c2的作用范围12.}13.voidmain()主函数14.{15.intm,n;16.…17.}复制代码例1.15有一个一维数组,内放10个学生成绩,写一个函数,求出平均分、最高分和最低分。1.#includestdio.h2.floatMax=0,Min=0;全局变量3.voidmain()4.{5.floataverage(floatarray[],intn);6.floatave,score[10];7.inti;8.for(i=0;i10;i++)9.scanf(%f,&score[i]);10.ave=average(score,10);11.printf(max=%6.2f\nmin=%6.2f\naverage=%6.2f\n,Max,Min,ave);12.}13.floataverage(floatarray[],intn)/*定义函数,形参为数组*/14.{15.inti;16.floataver,sum=array[0];17.Max=Min=array[0];18.for(i=1;in;i++)19.{20.if(array[i]Max)21.Max=array[i];22.else23.if(array[i]Min)24.Min=array[i];25.sum=sum+array[i];26.}27.aver=sum/n;28.return(aver);29.}复制代码运行情况如下:1.9945789710067.589926643↙2.max=100.003.min=43.004.average=77.65复制代码2l.od8L3O0C建议不在必要时不要使用全局变量,原因如下:8m:j&aK4q0I4V①全局变量在程序的全部执行过程中都占用存储单元,而不是仅在需要时才开辟单元。9n)t}-p~1?7?9D0H②使用全局变量过多,会降低程序的清晰性,人们往往难以清楚地判断出每个瞬时各个外部变量的值。在各个函数执行时都可能改变外部变量的值,程序容易出错。因此,要限制使用全局变量。S-Z&S+X-g!_&_,k③它使函数的通用性降低了,因为函数在执行时要依赖于其所在的外部变量。如果将一个函数移到另一个文件中,还要将有关的外部变量及其值一起移过去。但若该外部变量与其他文件的变量同名时,就会出现问题,降低了程序的可靠性和通用性。一般要求把C程序中的函数做成一个封闭体,除了可以通过“实参——形参”的渠道与外界发生联系外,没有其他渠道。例1.16外部变量与局部变量同名1.#includestdio.h2.inta=3,b=5;/*a,b为外部变量*/a,b作用范围3.voidmain()4.{5.inta=8;/*a为局部变量*/局部变量a作用范围6.printf(″%d″,max(a,b));全局变量b的作用范围7.}8.max(inta,intb)/*a,b为局部变量*/9.{intc;10.c=ab?a∶b;形参a、b作用范围11.return(c);12.}复制代码运行结果为1.8复制代码1.9变量的存储类别1.9.1动态存储方式与静态存储方式前面已介绍了从变量的作用域(即从空间)角度来分,可以分为全局变量和局部变量。那么从变量值存在的时间(即生存期)角度来分,又可以分为静态存储方式和动态存储方式。所谓静态存储方式是指在程序运行期间由系统分配固定的存储空间的方式。而动态存储方式则是在程序运行期间根据需要进行动态的分配存储空间的方式。这个存储空间可以分为三部分:#|/I2z7X#mK3\yc•程序区2R(Z6xq2w!U*F•静态存储区$B4~4I.[;F%R•动态存储区-g$@0S+S5x'`%u*D7?在C语言中每一个变量和函数有两个属性:数据类型和数据的存储类别。对数据类型,读者已熟悉(如整型、字符型等)。存储类别指的是数据在内存中存储的方式。存储方式分为两大类:静态存储类和动态存储类。具体包含四种:自动的(auto),静态的(static),寄存器的(register),外部的(extern)。根据变量的存储类别,可以知道变量的作用域和生存期。1.9.2auto变量/G-G'E)i(G函数中的局部变量,如不专门声明为static存储类别,都是动态地分配存储空间的,数据存储在动态存储区中。函数中的形参和在函数中定义的变量(包括在复合语句中定义的变量),都属此类,在调用该函数时系统会给它们