C语言程序设计第9章_第1页
C语言程序设计第9章_第2页
C语言程序设计第9章_第3页
C语言程序设计第9章_第4页
C语言程序设计第9章_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C语言程序设计第9章数组数组是指一组相同类型数据的有序集合。每个数组包含一组具有同一类型的变量,这些变量在内存中占有连续的存储单元。在程序中这些变量具有相同的名字,但具有不同的下标。inta[5];数组名数组元素个数类型名9.1一维数组的定义和一维数组元素的引用9.1.1一维数组的定义类型名数组名[整型常量表达式],……;shorta[5];a[0]a[1]a[2]a[3]a[4]低地址高地址2000H2001H2002H2003H2004H2005H2006H2007H2008H2009H1567326989.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、C语言规定可以通过赋初值来定义数组的大小,这时数组说明符的一对方括号中可以不指定数组的大小。如:inta[]={0,1,2,3,4};以上语句隐含地定义了a数组含有5个元素。5、数组不初始化,其元素值为随机数。#include<stdio.h>main(){intary[10];inti,high;for(i=0;i<10;i++){scanf("%d",&ary[i]);}high=ary[0];for(i=1;i<10;i++){if(ary[i]>high) high=ary[i];}printf(“%d”,high);}定义赋值比较9.2一维数组和指针9.2.1一维数组和数组元素的地址数组是一组相同类型数据的集合,数组中各个元素在内存占据连续的存储单元,每个内存单元都有相应的地址。数组所占内存单元的首地址称为数组的指针,数组元素所占内存单元的首地址称为数组元素的指针。因此,可以用指针变量来指向数组元素。如shorta[5];a[0]a[1]a[2]a[3]a[4]2000H2001H2002H2003H2004H2005H2006H2007H2008H2009H数组的指针C语言规定,数组名代表数组的首地址,因此,数组名实际上也是指针,但它是一个固定不变的地址常量。如:inta[5];a是数组名,也是指针,它永远指向数组的首地址,即不能将新地址赋给该指针。但可以通过形如a+k的形式(k是整数)来表达该数组其它元素的地址。如:for(k=0;k<5;k++)scanf(“%d”,a+k);若有语句:inta[10];int*p;p=a;则:for(k=0;k<10;k++)scanf(“%d”,a+k);for(k=0;k<10;k++){scanf(“%d”,p);p++;}for(k=0;k<10;k++)scanf(“%d”,p++);for(;p-a<10;p++)scanf(“%d”,p);

数组和指针的关系9.2.2通过数组的首地址引用数组元素采用间接运算符“*”。如:数组元素a[0]*&a[0]*(a+0)*a数组元素a[1]*&a[1]*(a+1)for(k=0;k<10;k++)printf(“%4d”,a[k]);for(k=0;k<10;k++)printf(“%4d”,*(a+k));9.2.3通过指针引用一维数组元素若有语句:inta[10],*p,k;p=a;for(k=0;k<10;k++)printf(“%4d”,a[k]);for(k=0;k<10;k++)printf(“%4d”,*(p+k));for(k=0;k<10;k++){printf(“%4d”,*p);p++;}for(k=0;k<10;k++)printf(“%4d”,*p++);for(;p-a<10;p++)printf(“%4d”,*p);9.2.4用带下标的指针变量引用一维数组元素若有语句:ints[10],*p,i;p=s;数组元素s[i]p[i]练习:有如下说明:inta[10]={1,2,3,4,5,6,7,8,9,10},*p=a;则数值为9的表达式是_____。*p+9*(p+8)*p+=9p+8√

练习:下面程序执行后的输出结果是____。#include<stdio.h>inta[]={2,4,6,8};main(){inti;int*p=a;for(i=0;i<4;i++)a[i]=*p;printf(“%d\n”,a[2]);}6B)8C)4D)2√

练习:设有定义语句:intx[6]={2,4,6,8,5,7},*p=x,i;要求依次输出x数组6个元素中的值,不能完成此操作的语句是_____。for(i=0;i<6;i++)printf(“%2d”,*(p++));for(i=0;i<6;i++)printf(“%2d”,*(p+i));for(i=0;i<6;i++)printf(“%2d”,*p++);for(i=0;i<6;i++)printf(“%2d”,(*p)++);√

练习:下面程序执行后的输出结果是____。#include<stdio.h>inta[]={2,4,6,8};main(){inti;int*p=a;for(i=0;i<4;i++)a[i]=*p++;printf(“%d\n”,a[2]);}6B)8C)4D)2√

练习:下面程序执行后的输出结果是____。main(){inta[10]={1,2,3,4,5,6,7,8,9,10},*p=a;printf(“%d\n”,*(p+2));}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的值是_____。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);}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);}运行后报错6661255√

9.3函数之间对一维数组和数组元素的引用9.3.1数组元素作实参数组元素作实参时,对应的形参必须是类型相同的变量,所以用法与普通变量一致,传递实参后并不能改变数组元素的值。9.3.2数组名作实参数组名本身就是一个地址值,因此对应的形参应当是一个指针变量,可以通过传递改变数组元素的值。例题见书上例9.2。注意:被调用函数定义部分可以有三种写法:如:arrin(int*a)arrin(inta[])arrin(inta[M])M是一个符号常量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函数时,系统为它开辟了一串连续存储单元,b是一个地址常量。虽然a和b有相同的说明形式,但它们一个是作为形参的指针,一个是函数体内定义的数组,具有完全不同的含义。3、在fun函数执行完毕,返回主函数时,系统释放a,b所占存储单元,指针变量a和数组b将不再存在。因此,函数fun不应把b的值作为函数值返回,这样做,主函数中的指针变量p将不指向任何对象而成为“无向指针”。练习:若有以下调用语句,则不正确的fun函数的首部是____。main(){inta[50],n;fun(n,&a[9]);..}voidfun(intm,intx[])voidfun(ints,inth[41])voidfun(intp,int*s)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]);}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);}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]低地址高地址2000H2001H2002H2003H2004H2005H2006H2007H2008H2009H200aH200bH9.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}};如:inta[3][4]={{1,2},{3,4,5},{6,7,8,9}}2、按数组的存储顺序赋初值。如:intb[2][2]={1,2,3,4};表示将1初始化给b[0][0],2初始化给b[0][1],3初始化给b[1][0],4初始化给b[1][1]。若数据不够,后面的元素自动赋0。9.5.4通过赋初值定义二维数组的大小如果对数组元素全部赋初值,定义数组时行长度可以省略,列长度不能省略。如:inta[][3]={{1,2,3},{4,5},{6},{8}};若用以下形式:intb[][3]={1,2,3,4};确定第一维的规则:若初值个数能被第二维常量除尽,则商数即为第一维大小。如:intb[][3]={1,2,3,4,5,6};/*第一维为2*/若初值个数不能被第二维除尽,则第一维大小=商数+1。如:intb[][3]={1,2,3,4};/*第一维为2*/练习:定义如下变量和数组:intk;inta[3][3]={9,8,7,6,5,4,3,2,1};则下面语句的输出结果是_____。for(k=0;k<3;k++)printf(“%d”,a[k][k]);753B)951C)963D)741√

二维数组元素的地址的表示:设有inta[3][4];a[i][j]的地址可有5种表示:1、&a[i][j]2、a[i]+j3、*(a+i)+j4、&a[0][0]+4*i+j5、a[0]+4*i+j9.6.2通过地址引用二维数组元素若有inta[3][4],i,j;则a数组元素可有5种表达方式引用:1、a[i][j]2、*(a[i]+j)3、*(*(a+i)+j)4、*(&a[0][0]+4*i+j)5、(*(a+i))[j]1、&a[i][j]2、a[i]+j3、*(a+i)+j4、&a[0][0]+4*i+j5、a[0]+4*i+j地址通过建立一个指针数组引用二维数组元素

p128

9.6.4通过建立一个行指针引用二维数组元素指向一维数组指针变量的定义形式:类型标识符(*指针变量名)[数组元素个数]“*”表示其后的变量为指针类型,[数组元素个数]表示目标变量是一维数组,并说明一维数组元素的个数。由于“*”比“[]”的运算级别低,“*指针变量名”作为一个说明部分,两边必须加括号。“类型标识符”是定义一维数组元素的类型。如:inta[3][4];int

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论