版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年赣州客运从业资格证考试模拟试题
- 2024年邯郸客运从业资格证模拟考试
- 2024年道路客运资格证试题
- 师范生研习工作报告
- 有关班主任年级工作总结范文(34篇)
- 新小区物业年终工作总结(33篇)
- 小班保育员个人总结(31篇)
- 装修公司会议纪要(3篇)
- 志愿者就职演讲稿(3篇)
- 新时代青年的使命与担当7
- 足疗店工作人员合同
- 旅馆业设施布局与室内设计考核试卷
- 2024中国船舶报社公开招聘采编人员1人高频难、易错点500题模拟试题附带答案详解
- 室内装修投标方案(技术方案)
- 法务专员发言稿范文
- 服务营销《(第6版)》 课件全套 郭国庆 第1-14章 服务与服务营销 - 服务文化与顾客关系管理
- 高考地理一轮复习:火炉城市的“热岛效应”探究课件
- 2024-2030年天津市轨道交通行业市场发展分析及发展前景与投资研究报告
- 幼儿园工程建设施工竣工验收与交付方案
- 2024八年级物理下册 第八章 神奇的压强8.1 认识压强教案(新版)粤教沪版
- 2024年四川省南充市经济和信息化局下属事业单位南充无线电监测站考调1人高频考题难、易错点模拟试题(共500题)附带答案详解
评论
0/150
提交评论