C语言课件第9章

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

南昌大学计算中心C语言程序设计南昌大学计算中心第9章数组数组是指一组相同类型数据的有序集合,由一个统一的数组名标识这一组数据。数组的每一个成员称作数组元素,用下标来标识数组元素在该数组中的位置。inta[5];数组名数组元素个数只能存放整数南昌大学计算中心9.1一维数组的定义和一维数组元素的引用9.1.1一维数组的定义类型名数组名[整型常量表达式],……;shorta[5];a[0]a[1]a[2]a[3]a[4]低地址高地址2000H2001H2002H2003H2004H2005H2006H2007H2008H2009H156732698南昌大学计算中心9.1.2一维数组元素的引用数组名[下标表达式]如:doublex[8];则x[0]、x[j]、x[i+k]均合法。注意:i+k是下标表达式而不是两个下标。说明:1、“下标表达式”可以是任何非负整型数据,取值范围是0~(元素个数-1)。特别强调:在运行C语言程序过程中,系统并不自动检验数组元素的下标是否越界。因此在编写程序时,保证数组下标不越界是十分重要的。南昌大学计算中心2、1个数组元素,实质上就是1个变量,它具有和相同类型单个变量一样的属性,可以对它进行赋值和参与各种运算。3、一个数组不能整体引用,数组名中存放的是一个地址常量,它代表整个数组的首地址。例如:doublex[8],*p,q;p=x;q=x;不能将数组名赋给一个普通变量南昌大学计算中心9.1.3一维数组的初始化1、在定义语句中给所定义数组赋初值数据类型数组名[常量表达式]={初值表}说明:1、初值放在赋值号后的花括号中,数值类型与说明类型一致,初值间用逗号隔开,系统将自动按顺序从第一个元素开始依次给数组中元素赋值。如:inta[8]={0,1,2,3,4,5,6,7};2、“初值表”中的初值个数,可以少于元素个数,即允许只给前面的部分元素赋初值,其后的元素自动赋0。字符补‘\0’。如:inta[10]={0};/*10个元素都赋初值0*/charc[5]={‘@’};/*后4个元素均赋‘\0’*/南昌大学计算中心3、当初值多于元素个数,编译时会出错。4、如果对数组的全部元素赋以初值,定义时可以不指定数组长度(长度由初值个数自动确定)。如果被定义数组的长度,与初值个数不同,则数组长度不能省略。如:inta[]={0,1,2,3,4};南昌大学计算中心#includestdio.hmain(){intary[10];inti,total,high;for(i=0;i10;i++){scanf(%d,&ary[i]);}high=ary[0];for(i=1;i10;i++){if(ary[i]high)high=ary[i];}for(i=0,total=0;i10;i++)total=total+ary[i];}定义赋值比较南昌大学计算中心9.2一维数组和指针9.2.1一维数组和数组元素的地址数组是一组相同类型数据的集合,数组中各个元素在内存占据连续的存储单元,每个内存单元都有相应的地址。数组所占内存单元的首地址称为数组的指针,数组元素所占内存单元的首地址称为数组元素的指针。因此,可以用指针变量来指向数组或数组元素。a[0]a[1]a[2]a[3]a[4]2000H2001H2002H2003H2004H2005H2006H2007H2008H2009H数组的指针南昌大学计算中心C语言规定,数组名代表数组的首地址,因此,数组名实际上也是指针,但它是一个固定不变的指针常量。如:inta[5];a是数组名,也是指针,它永远指向数组的首地址,即不能将新地址赋给该指针。但可以通过形如a+k的形式(k是整数)来表达该数组其它元素的地址。如:for(k=0;k5;k++)scanf(“%d”,a+k);南昌大学计算中心若有语句:inta[10];int*p;p=a;则:for(k=0;k10;k++)scanf(“%d”,a+k);for(k=0;k10;k++){scanf(“%d”,p);p++;}for(k=0;k10;k++)scanf(“%d”,p++);for(;p-a10;p++)scanf(“%d”,p);南昌大学计算中心p,aa[0]p+1a[a[1]┇p+ia[i]p+9a[9]数组和指针的关系南昌大学计算中心9.2.2通过数组的首地址引用数组元素采用间接运算符“*”。如:数组元素a[0]*&a[0]*(a+0)*a数组元素a[1]*&a[1]*(a+1)南昌大学计算中心for(k=0;k10;k++)printf(“%4d”,a[k]);for(k=0;k10;k++)printf(“%4d”,*(a+k));南昌大学计算中心9.2.3通过指针引用一维数组元素若有语句:inta[10],*p,k;p=a;for(k=0;k10;k++)printf(“%4d”,a[k]);for(k=0;k10;k++)printf(“%4d”,*(p+k));for(k=0;k10;k++){printf(“%4d”,*p);p++;}for(k=0;k10;k++)printf(“%4d”,*p++);for(;p-a10;p++)printf(“%4d”,*p);南昌大学计算中心9.2.4用带下标的指针变量引用一维数组元素若有语句:ints[10],*p,i;p=s;数组元素s[i]*&s[i]*(s+i)*(p+i)p[i]s[i]南昌大学计算中心练习:有如下说明:inta[10]={1,2,3,4,5,6,7,8,9,10},*p=a;则数值为9的表达式是_____。A)*p+9B)*(p+8)C)*p+=9D)p+8√南昌大学计算中心练习:下面程序执行后的输出结果是____。#includestdio.hinta[]={2,4,6,8};main(){inti;int*p=a;for(i=0;i4;i++)a[i]=*p;printf(“%d\n”,a[2]);}A)6B)8C)4D)2√南昌大学计算中心练习:设有定义语句:intx[6]={2,4,6,8,5,7},*p=x,i;要求依次输出x数组6个元素中的值,不能完成此操作的语句是_____。A)for(i=0;i6;i++)printf(“%2d”,*(p++));B)for(i=0;i6;i++)printf(“%2d”,*(p+i));C)for(i=0;i6;i++)printf(“%2d”,*p++);D)for(i=0;i6;i++)printf(“%2d”,(*p)++);√南昌大学计算中心练习:下面程序执行后的输出结果是____。#includestdio.hinta[]={2,4,6,8};main(){inti;int*p=a;for(i=0;i4;i++)a[i]=*p++;printf(“%d\n”,a[2]);}A)6B)8C)4D)2√南昌大学计算中心练习:下面程序执行后的输出结果是____。main(){inta[10]={1,2,3,4,5,6,7,8,9,10},*p=a;printf(“%d\n”,*(p+2));}A)3B)4C)1D)2√南昌大学计算中心练习:有如下程序段:inta[10]={1,2,3,4,5,6,7,8,9,10};int*p=&a[3],b;b=p[5];则b的值是_____。A)5B)6C)9D)8√南昌大学计算中心练习:下面程序执行后的输出结果是____。main(){inta[5]={2,4,6,8,10},*p,**k;p=a;k=&p;printf(“%d”,*(p++));printf(“%d\n”,**k);}A)4B)22C)24D)46√南昌大学计算中心练习:下面程序执行后的输出结果是____。main(){inta[]={1,2,3,4,5,6,7,8,9,10,11,12};int*p=a+5;*q=NULL;*q=*(p+5);printf(“%d%d\n”,*p,*q);}A)运行后报错B)66C)612D)55√南昌大学计算中心9.3函数之间对一维数组和数组元素的引用9.3.1数组元素作实参数组元素作实参时,对应的形参必须是类型相同的变量,所以用法与普通变量一致,传递实参后并不能改变数组元素的值。9.3.2数组名作实参数组名本身就是一个地址值,因此对应的形参应当是一个指针变量,可以通过传递改变数组元素的值。例题见书上例9.2。注意:被调用函数定义部分可以有三种写法:如:arrin(int*a)arrin(inta[])arrin(inta[M])M是一个符号常量南昌大学计算中心9.3.3数组元素地址作为实参数组元素地址作实参也要求对应的形参应当是一个指针变量,可以通过传递改变数组元素的值。见书上例9.3南昌大学计算中心9.3.4函数的指针形参和函数体中数组的区别若有以下程序,程序中定义了fun函数,形参a指向主函数中的w数组,函数体内定义了一个b数组,函数把b数组的起始地址作为函数值返回,企图使主函数中的指针p指向函数体内b数组的开头。#defineN10int*fun(inta[N],intn){intb[N];……returnb;}main(){intw[N],*p;……p=fun(w,N);……}南昌大学计算中心以上程序涉及几个概念:1、函数fun中,形参a可以写成a[N],a[],*a,它是一个指针变量,在调用fun函数时,系统只为形参a开辟一个存储单元,并把main函数中w数组首地址存进去,使它指向w数组地址。2、函数fun的函数体定义了一个b数组,在调用fun函数时,系统为它开辟了一串连续存储单元,它是一个地址常量。3、在fun函数执行完毕后,系统释放a,b所占存储单元,而b的值作为fun函数返回值,指针变量p将不指向任何对象而成为“无向指针”。南昌大学计算中心练习:若有以下调用语句,则不正确的fun函数的首部是____。main(){inta[50],n;fun(n,&a[9]);..}A)voidfun(intm,intx[])B)voidfun(ints,inth[41])C)voidfun(intp,int*s)D)voidfun(intn,inta)√南昌大学计算中心练习:下面程序执行后的输出结果是____。voidfunc(int*a,intb[]){b[0]=*a+6;}main(){inta,b[5];a=0;b[0]=3;func(&a,b);printf(“%d\n”,b[0]);}A)6B)7C)8D)9√南昌大学计算中心练习:下面程序执行后的输出结果是____。f(intb[],intn){inti,r=1;for(i=0;i=n;i++)r=r*b[i];returnr;}main(){intx,a[]={2,3,4,5,6,7,8,9};x=f(a,3);printf(“%d\n”,x);}A)720B)120C)24D)6√南昌大学计算中心9.5二维数组的定义和二维数组元素的引用9.5.1二维数组的定义类型名数组名[常量表达式1][常量表达式2],……;shorta[2][3];a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]低地址高地址2000H2001H2002H2003H2004H2005H2006H2007H2008H2009H200aH200bH南昌大学计算中心9.5.2二维数组元素的引用数组名[下标表达式1][下标表达式2]规则与一维数组元素的一样。1、行列下标下限为0,上限为n-12、一定要把两个下标分别放在两个方括号内3、第m行n列:a[m-1][n-1]南昌大学计算中心9.5.3二维数组的初始化1、按行对二维数组初始化。如:inta[2][3]={{1,1,1},{4,4,4}};若大括号或其中的数据不够,后面的元素自动赋0。如:inta[3][4]={{1,2,3,4},{5,6,7,8}

1 / 47
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功