《模块8应用指针程序设计电子课件 C语言程序设计案例教程.pptx》由会员分享,可在线阅读,更多相关《模块8应用指针程序设计电子课件 C语言程序设计案例教程.pptx(88页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、C语言程序设计案例教程作者:模块8 应用指针程序设计假设学生成绩表如表4-1所示。(1)编写函数fn1,建立n个学生的期末考核成绩和姓名。(2)编写函数fn2,对于n个学生的期末考核成绩,分别统计平均分、最高分、及格人数和不及格的人数,并返回其值。(3)编写函数search,对于所给学生姓名,输入待查找的学生姓名,在所有学生中查找给定的学生,有则返回下标值,无则返回-1。(4)编写主函数main,调用fn1录入学生姓名和期末考试成绩;调用fn2统计平均分、最高分和及格人数,并输出;调用search在学生中查找某个学生。如果希望将学生的学号、姓名、成绩等不同数据类型的数据存放在一起,有没有这样一
2、种数据类型(预习模块9)?任务描述模块8 应用指针程序设计(1)能够掌握指针的基本概念和基本应用方法,为数据结构中动态链接的物理存储结构打好基础。(2)能够根据程序需要进行指针变量的定义和引用。(3)能够运用指针变量的形参接受一维数组和二维数组实参的传递。(4)能够运用指针变量的形参接受地址实参的传递,从而实现函数返回多个值。(5)逐步培养程序调试的能力。任务目标模块8 应用指针程序设计#include#include#define N 5void fn1(float*a,char name8)int i;printf(n);for(i=0;iN;i+)printf(请输入第%d位学生的姓名:
3、,i+1);源代码展示模块8 应用指针程序设计scanf(%s,namei);printf(请输入第%d位学生期终考核成绩(score):,i+1);scanf(%f,a+i);float fn2(float*a,float*max,int*l)int i;float sum=0;*l=0;源代码展示模块8 应用指针程序设计*max=-1;for(i=0;i=60)+(*l);if(*(a+i)*max)*max=*(a+i);return sum/N;int search(char(*name)8,char*c)源代码展示模块8 应用指针程序设计int i;for(i=0;iN;i+)if(
4、strcmp(namei,c)=0)return i;return-1;main()float scoresN,max,avg;char namesN8,ch8;源代码展示模块8 应用指针程序设计int i,n,k;while(1)system(cls);printf(tt*n);printf(tt1.录入学生姓名及成绩n);printf(tt2.成绩统计n);printf(tt3.查询n);printf(tt0.退出n);printf(tt*nn);源代码展示模块8 应用指针程序设计printf(tt请输入您的选择(0,1,2,3);scanf(%d,&i);if(i=1)fn1(score
5、s,names);else if(i=2)avg=fn2(scores,&max,&n);printf(n平均分为%6.1f,最高分为%6.1f,及格人数为%d,不及格源代码展示模块8 应用指针程序设计人数为%dn,avg,max,n,N-n);else if(i=3)printf(n请输入您查找的姓名:n);scanf(%s,ch);k=search(names,ch);if(k=-1)printf(n查无此人n);else printf(n%d%sn,k,namesk);源代码展示模块8 应用指针程序设计else if(i=0)break;getch();程序运行结果如图8-1、图8-2所
6、示。源代码展示运行结果模块8 应用指针程序设计本程序由4个函数组成。fn1函数用来录入学生姓名及成绩,数据分别用指针和数组作为函数参数传递数据;fn2函数用来统计n个成绩的平均分、最高分、及格人数,平均分借助return返回,最高分和及格人数借助指针参数传递数据;search函数用来在一组名字中查找某个名字,注意函数中两个参数的定义,在主函数中使用调用语句“k=search(names,ch);”,然后根据k的值选择输出。main函数中定义一个while语句,条件总是1,但在循环体中一旦选择0就跳出循环,否则执行某种操作后系统继续显示提示菜单,供用户选择操作。指针是C语言中最具特点且广泛使用的
7、数据类型,通过指针不仅可以间接访问变量,还可以方便地使用数组、字符串,可有效地描述各种数据结构,能够动态地分配内存空间,还可在函数之间传递各种类型的数据。灵活地掌握指针的运用,可以编写出简洁、高效的C程序。程序分析8.1 指针变量的定义与引用在C语言中,允许用一个变量来存放指针,这种变量称为指针变量。一个指针变量的值就是某个内存单元的地址或称为某内存单元的指针。由于指针变量存放的可能是不同类型变量的地址,所以指针变量也可以分为不同的类型。8.1.1定义一个指针变量定义指针变量的格式如下。类型名*指针变量名1,*指针变量名2,例如:int*pt1,*pt2;/*定义了两个指针变量pt1、pt2,
8、基类型为整型,即指向的数据类型为整型*/float*f;/*定义指针变量f,基类型为浮点型,即指向的数据类型为浮点型*/char*pc;/*定义指针变量pc,基类型为字符型,即指向的数据类型为字符型*/需要说明如下两点。(1)C语言变量先定义后使用,指针变量也不例外,为了表示指针变量是存放地址的特殊变量,定义变量时在变量名前加“*”号。(2)指针变量存放地址值,计算机用2字节表示一个地址,所以指针变量无论什么类型,其本身在内存中占用的空间都是2字节。8.1.2指针变量的引用指针变量一定要有确定的值以后才可以使用。禁止使用未初始化或未赋值的指针,因为此时的指针变量指向的内存空间是无法确定的,使用
9、它可能导致系统崩溃。1.取址运算符(&)可以用取址运算符&获得变量的地址,格式如下。&变量名例如:int a,*p;p=&a;以上两条语句也可以写成:int a,*p=&a;8.1.2指针变量的引用2.间接访问运算符(*)可以通过间接访问运算符“*”获得指针变量所指单元中的值,格式如下。*指针变量例如:int a,*p;p=&a;scanf(%d,p);(*p)+;printf(%d,%d,*p,a);若输入12,则输出为:13,138.2 指针变量作为函数参数函数的参数不仅可以是整型、实型、字符型等数据,还可以是指针类型。它的作用是将一个变量的地址传递到另一个函数中。到目前为止,我们知道函数
10、传值形参的改变不能改变对应实参的值,把数据从被调函数返回到调用函数一般是通过return语句返回函数值,这就限定了只能返回一个数据,那么如何传递多个数值?解决办法是设置指针类型的形参,得到相应实参的地址,变传值为传址。形参是指针类型,实参是基类型相同的地址值或指针变量。【例8-1】借助指针变量返回多个值。程序代码如下。#include 8.2 指针变量作为函数参数void change2(int*a,int*b)int c;c=*a;*a=*b;*b=c;main()int x=1,y=2;8.2 指针变量作为函数参数printf(调用前:x=%d,y=%dn,x,y);change2(&x,
11、&y);printf(调用后:x=%d,y=%dn,x,y);程序运行结果如下。调用前:x=1,y=2调用后:x=2,y=1如果函数change2写成如下形式:void change2(int a,int b)8.2 指针变量作为函数参数int temp;temp=a;a=b;b=temp;在函数change2中实现了交换局部变量(形参)a,b的值,但调用结束后它们的空间释放,主函数中执行change2(x,y)后,x和y的值并未交换。因此,为了使在函数中改变了的变量值能被main()函数所用,应该用指针变量作为函数参数,在函数执行过程中使指针变量所指向的变量值发生变化,函数调用结束后,这些变
12、量值的变化依然保留下来,这样就实现了“通过调用函数使变量的值发生变化,在主调函数中使用这些改变了的值”的目的。8.3 指针与一维数组在C语言中,一维数组名代表一维数组首元素在内存单元的地址。由于数组元素在内存中占用连续的单元,所以,可以用一个指针变量存放首元素的地址,并通过该指针变量的移动访问数组中的各个元素。8.3.1 通过指针访问一维数组1.指向一维数组的指针我们知道,数组名就是数组的首地址。例如,有“int a10;”,则a等价于&a0。若有以下定义和赋值:int a10,*p;p=a;则将指针变量p指向数组的首元素。数组元素ai的地址可以用a+i来表示,也可以用p+i表示。指针与数组的
13、关系如图83所示。图8-3指针与数组的关系可见,p值与&a0相等,p+1的值与&a1相等,p+i的值与&ai相等。8.3.1 通过指针访问一维数组需要注意以下几点。(1)p+是正确的,而a+是错误的,因为a是数组名,是常量。(2)由于+与*同优先级,结合方向自右向左,故*p+等价于*(p+)。(3)*(p+)与*(+p)的值不同,*(p+)等价于a0,*(+p)等价于a1,但p的值均变成了&a1,即p指向a1。(4)(*p)+表示p所指向的元素值增1。2.通过首地址引用数组元素对数组元素的访问我们之前采用的是下标方式。既然数组名a就是数组的首地址,因此我们可以使用“a+i”,通过i的变化依次访
14、问数组元素。例如:int a5,i;一般访问形式如下。8.3.1 通过指针访问一维数组for(i=0;i5;i+)/*一维数组的输入*/scanf(%d,a+i);for(i=0;i5;i+)/*一维数组的输出*/printf(%d,*(a+i);3.通过指针变量引用数组元素要通过指针变量访问数组就必须先将指针变量指向该数组。利用指针变量引用数组元素可以采用“不移动指针”或“移动指针”两种方法。例如:int a5,*p,i;p=a;或p=&a0;1)不移动指针for(i=0;i5;i+)/*一维数组的输入*/8.3.1 通过指针访问一维数组scanf(%d,p+i);for(i=0;i5;i+
15、)/*一维数组的输出*/printf(%d,*(p+i);2)移动指针for(;pa+5;p+)/*一维数组的输入*/scanf(%d,p);for(p=a;pa+5;p+)/*一维数组的输出*/printf(%d,*p);移动指针时,当执行完第一个for语句时,指针指向最后一个元素的下一个位置。所以在输出操作的for循环中,又初始化p=a,让指针指向首地址。4.用带下标的指针变量引用数组元素8.3.1 通过指针访问一维数组若一个指针变量已经指向要访问的数组,则可以同普通数组下标访问一样,使用带下标的指针变量引用数组元素。例如:int a5,*p,i;p=a;或p=&a0;for(i=0;i5
16、;i+)/*一维数组的输入*/scanf(%d,p+i);for(i=0;i5;i+)/*一维数组的输出*/printf(%d,pi);8.3.2 函数中一维数组作为实参数组名作为实参传送,但数组名本身是一个地址,因此,对应的形参应当是一个指针变量,指针变量的基类型必须与数组的类型一致。在函数中,通过指针变量来引用调用函数中对应的数组元素,从而对调用函数中对应的数组元素进行操作来改变其中的值。【例8-2】选择法排序(一维数组作为实参)。程序代码如下。#include#define N 10void mysort(int*p,int n)int i,j,k,t;8.3.2 函数中一维数组作为实参
17、for(i=0;in-1;i+)k=i;for(j=i+1;jpj)k=j;t=pi;pi=pk;pk=t;void myout(int*p,int n)int i;8.3.2 函数中一维数组作为实参for(i=0;in;i+)printf(%4d,*(p+i);printf(n);main()int aN,i,*q;printf(Input Data:);q=a;for(i=0;iN;i+)scanf(%d,q+);8.3.2 函数中一维数组作为实参printf(Before sorted:);myout(a,N);/*输出一维数组的数据,也可以为q=a;myout(q,N);*/mysor
18、t(a,N);/*一维数组的数据排序*/printf(After sorted:);myout(a,N);/*输出排序后一维数组的数据*/程序执行情况如下:Input Data:22 33 4 55 77 54 18 89 5 38Before sorted:2233 45577541889 538After sorted:4 51822333854557789本程序定义了两个函数mysort和myout,两个函数的参数都是指针变量p。用一维数组名作为实参时,数组a 的首地址传给形参p,用指针变量p间接访问数组中的各个元素。但C语言允许写成传统数组表示形式如mysort(int p,int n
19、),便于理解。8.4 指针与二维数组用指针变量可以指向一维数组中的元素,也可以指向二维数组中的元素。但在概念和使用上,二维数组的指针比一维数组的指针要复杂一些。8.4.1 二维数组和数组元素的地址1.二维数组行地址在C语言中,一维数组名代表了该数组的起始地址。由于一个数组被定义了以后,其起始地址是不会改变的,因此数组名实际上是一个指针常量。当一个指针变量指向一个一维数组之后,对数组元素的访问既可以通过下标也可以通过指针来完成。实际上,以上结论可以推广到二维数组乃至多维数组。C语言用一维数组来表示二维数组,即二维数组是以一维数组为元素的一维数组。例如,二维数组a34可以看作有图8-4所示的关系。
20、8.4.1 二维数组和数组元素的地址a由a0、a1、a2三个一维数组组成。数组名a:第一个数组元素的地址,基类型为数组类型(一维数组)。a0:第一个数组元素的地址,基类型为数组元素类型(int)。a0、a1、a2分别为每行第一个元素的地址,基类型为数组元素类型(int)。所以,若有i从0到2行,ai为i行的首地址。又因为ai等价于*(a+i),所以*(a+i)是i行第一个元素的地址。p即&a00,也是二维数组的首地址,但在使用上与a有一定的区别。p+1指向下一个元素a01,而a+1指向下一行。所以我们通常将p称为列指针(同指向变量的指针),a称为行指针。“p=a0;”合法,但“p=a;”不合法
21、(基类型不同)。8.4.1 二维数组和数组元素的地址2.二维数组元素的地址aij元素的地址可以表示为以下几种形式。(1)&aij。(2)ai+j。(3)*(a+i)+j,因为ai等价于*(a+i)。3.通过行指针引用二维数组元素定义一个二维数组对应的行指针变量的格式如下。类型名(*指针变量名)所指二维数组的第二维长度值;例如:int a32,(*prt)2;/*注意:prt的基类型是2个元素的一维数组类型)*/8.4.1 二维数组和数组元素的地址若有“prt=a;”,则可以通过prt指针访问数组中的aij元素,有以下几种访问形式。(1)prtij。(2)*(prti+j)。(3)*(*(prt
22、+i)+j)。(4)(*(prt+i)j。a是常量,prt是变量。【例8-3】通过指针访问二维数组。程序代码如下。#include#define M 38.4.1 二维数组和数组元素的地址#define N 2main()int aMN=1,2,3,4,5,6,i,j,*p1,(*p2)N;p1=a0;for(i=0;i6;i+)printf(%4d,*p1);p1+;/*输出1 2 3 4 5 6*/printf(n);8.4.1 二维数组和数组元素的地址p2=a;for(i=0;iM;i+)for(j=0;jN;j+)printf(%4d,*(p2i+j);printf(n);程序运行结果
23、如下。1 2 3 4 5 61 23 45 68.4.2 函数中二维数组作为实参当用二维数组名作为实参时,对应的形参类型应该是行指针变量。在函数首部可以用数组的形式定义行指针,在被调用函数中也可以使用下标的形式访问行指针所指向的存储单元。若主函数中有以下定义和函数调用:main()int a34;fun(a);8.4.2 函数中二维数组作为实参则fun函数的首部可以是以下3种形式之一。(1)void fun(int(*p)4)。(2)void fun(int p34)。(3)void fun(int p4)。【例8-4】二维数组名作为实参。程序代码如下。#include#define M 3#
24、define N 2void myout(int(*p)N)/*void myout(int pMN)*/8.4.2 函数中二维数组作为实参int i,j;for(i=0;iM;i+)for(j=0;jN;j+)printf(%4d,pij);/*printf(%4d,*(*(p+i)+j);*/printf(n);main()int aMN=1,2,3,4,5,6;8.4.2 函数中二维数组作为实参myout(a);程序运行结果如下。1 23 45 68.5 指针与字符串在C语言中,除了可以通过字符数组对字符串进行引用外,还可以通过字符型指针变量对字符串进行引用。8.5.1 通过指针访问字符
25、串常量可以在定义字符指针变量的同时,将存放字符串的存储单元起始地址赋给指针变量。如果定义了一个字符型指针变量,也可以通过赋值运算将某个字符串的首地址赋给它,从而使其指向一个字符串。例如:char*p=Hello;或char*p;p=Hello;【例8-5】通过指针访问字符串。程序代码如下。#include main()8.5.1 通过指针访问字符串常量char*p=Beijing;puts(p);p=Shanghai;for(;*p!=0;p+)putchar(*p);程序运行结果如下。BeijingShanghai8.5.2 通过指针访问字符串数组如果字符串已经存放在某个字符数组中,可以用赋
26、值方式将指针变量指向该字符数组,从而访问字符串数组。例如:char str10=Hello,*p;p=str;【例8-6】通过地址访问字符串来实现两个字符串的复制。程序代码如下。#include main()char s150,s220,*p,*q;printf(Input a string:);8.5.2 通过指针访问字符串数组p=s1;q=s2;gets(s2);while(*q!=0)*p=*q;p+;q+;*p=0;puts(s1);8.5.2 通过指针访问字符串数组程序运行结果如下。Input a string:How are youHow are you程序中设置了两个字符指针变量
27、p和q,分别指向字符串s1和s2。在循环中,将q指向的字符赋给p指向的单元,然后两个指针都向后移动一个位置,直到q指向0为止。注意,循环结束后,需要在数组s1有效字符后追加一个0,以使s1形成字符串。8.5.3 字符串指针作为函数参数字符串指针作为函数参数与一维数组一样,对应形参类型必须为指针类型,首地址传递。【例8-7】输入一个字符串,调用函数实现字符串的逆序存放。程序代码如下。#include#include void inverse(char*p);main()char s81;printf(Input String:);8.5.3 字符串指针作为函数参数gets(s);printf(I
28、nversed:);inverse(s);puts(s);void inverse(char*p)char*q,t;int n;n=strlen(p);for(q=p+n-1;pq;p+,q-)8.5.3 字符串指针作为函数参数t=*p;*p=*q;*q=t;程序运行结果如下。Input String:abc123Inversed:321cba8.6指针数组和指向指针的指针若一个数组的元素均为指针类型的数据,则这个数组称为指针数组。指针数组的所有元素都必须是具有相同存储类型和指向相同数据类型的指针变量。定义指针数组的语法格式如下。类型说明符*数组名常量表达式;例如:int*p4;不要写成“in
29、t(*p)4;”,这是指向一维数组的指针变量。指针数组常用来表示一组字符串,这时指针数组的每个元素被赋予一个字符串的首地址,使字符串处理更加灵活和方便。8.6.1指针数组【例8-8】将若干字符串按字母顺序(由小到大)排序输出。程序代码如下。#include#include main()void sort(char*name,int n);void print(char*name,int n);char*name=FORTRAN,BASIC,LISP,Pascal,C,PROLOG,Java;int n=7;8.6.1指针数组sort(name,7);print(name,7);void sor
30、t(char*name,int n)char*temp;int i,j,k;for(i=0;in-1;i+)k=i;for(j=i+1;j0)k=j;if(k!=i)temp=namei;namei=namek;namek=temp;void print(char*name,int n)int i;for(i=0;in;i+)8.6.1指针数组printf(%sn,namei);程序执行结果如下。BASICC FORTRAN JavaLISPPROLOG Pascal 8.6.1指针数组如果一个指针变量存放的又是另一个指针变量的地址,则称这个指针变量为指向指针的指针变量,又称二级指针。定义二级
31、指针的语法格式如下。类型说明符*指针变量名;二级指针变量的值必须是某个一级指针变量的地址,二级指针变量可以通过赋值方式指向某个一级指针变量。赋值格式如下。二级指针变量=&一级指针变量例如,有如下定义和赋值。int a,*p,*q;p=&a;q=&p;8.6.2 二级指针则有*p等价于a,*q等价于p,*q即*(*q)等价于a。【例8-9】使用指向指针的指针。程序代码如下。#include main()char*name=FORTRAN,BASIC,LISP,Pascal,C,PROLOG,Java;char*p;int i;for(i=0;i7;i+)8.6.2 二级指针p=name+i;pr
32、intf(%sn,*p);程序运行结果如下。FORTRANBASICLISPPascalCPROLOGJava8.6.2 二级指针8.7 技 能 训 练指针使用灵活、方便,可以使程序简洁、高效、紧凑。可以说,指针是C语言的精髓。熟练的程序人员可以利用指针编写出颇有特色、质量优良的程序,实现许多用其他高级语言难以实现的功能。但同时也看到,指针涉及数据的物理存储,概念复杂,虽然使用灵活但容易出错,而且这种错误往往难以发现,所以较难掌握。因此,学习指针要抓住基本的概念,多用图示分析和解决问题。要多上机调试程序,弄清一些细节并积累经验。【例8-10】假设一个班有3个学生,本学期开了4门课程。查找期末考
33、试有一门以上课程不及格的学生,并输出他们的全部课程成绩。程序代码如下。#include void search(float(*p)4,int n);8.7 技 能 训 练main()float score34=85,90,93,88,80,76,54,78,70,87,45,82;search(score,3);void search(float(*p)4,int n)int i,j,flag;for(i=0;in;i+)flag=0;8.7 技 能 训 练for(j=0;j4;j+)if(*(*(p+i)+j)60)flag=1;if(flag)printf(第%d号学生不及格,他(她)的各
34、科成绩为:n,i+1);for(j=0;j4;j+)printf(%6.1f,*(*(p+i)+j);printf(n);8.7 技 能 训 练程序运行结果如下。第2号学生不及格,他(她)的各科成绩为:80.076.054.078.0第3号学生不及格,他(她)的各科成绩为:70.087.045.082.0【例8-11】编写程序,使用指针实现两个字符串的连接功能。程序代码如下。#include void link(char*from,char*to)for(;*from!=0;from+);8.7 技 能 训 练for(;*to!=0;to+)*from=*to;from+;*from=0;ma
35、in()char a20=Hello;char b10=Beijing;printf(nstring a=%snstring b=%sn,a,b);8.7 技 能 训 练link(a,b);printf(string a=%snstring b=%sn,a,b);程序运行结果如下。string a=Hellostring b=Beijingstring a=Hello Beijingstring b=Beijing等级考试重点及真题解析本模块主要考查指针的基础知识与应用,包括指针的基本应用、指针和数组的关系、指针与数组在函数参数传递中的应用、指针与字符串的应用等。掌握指针型数据的使用,是深入理
36、解C语言特性和掌握C语言编程技巧的重要环节。一、重点、难点解析1.一维数组及指针1)指向一维数组的指针数组的指针就是数组名,是指数组的首地址。例如,有“int a5;”,则a等价于&a0。当有如下定义和赋值:int a5,*p;等级考试重点及真题解析p=a;p就是指向一维数组的指针。C语言规定:如果指针变量p已指向数组中的一个元素,则p+1指向同一数组中的下一个元素,所以可以通过p指针的移动或(p+i)访问数组元素。2)一维数组元素的引用一维数组元素的引用有如下几种方法。(1)下标法。数组a的5个元素可以表示为:a0、a1、a2、a3、a4。(2)指针法。通过首地址引用数组a的5个元素可以表示
37、为:*a、*(a+1)、*(a+2)、等级考试重点及真题解析*(a+3)、*(a+4);通过指针变量引用数组a的5个元素可以表示为:*p、*(p+1)、*(p+2)、*(p+3)、*(p+4)。(3)通过带下标的指针变量引用数组a的元素表示为:p0、p1、p2、p3、p4。2.字符串与指针在C语言中除了可以用字符数组表示字符串外,还可以用字符指针来表示。(1)如果字符串已经存放在某个字符数组中,可以用赋值方式将指针变量指向该字符数组。以后可以用指针变量来处理字符数组中存放的字符串,也可以使用指针变量来处理其中的单个字符,处理方法类似于一维数组。例如:等级考试重点及真题解析char str10=
38、Hello,*p;p=str;(2)C语言允许使用指针直接使用字符串常量。例如:char*p=Hello;或char*p;p=Hello;上述两种方法都是先让字符串常量占据连续空间,再将该空间的首地址赋值给指针变量。以后就可以使用该指针变量来处理字符串或字符串中的单个字符了。等级考试重点及真题解析二、真题解析1.设有如下程序段。char str=Hello;char*ptr;ptr=str;执行上面的程序段后,*(ptr+5)的值为()。2017年9月A.oB.0C.不确定的值D.o的地址 执行语句ptr=str,使ptr指向str的首地址,ptr+5指字符o后元素0的位置,*(ptr+5)是
39、指ptr+5位置的值,所以答案为B。2.下面函数的功能是()。2017年9月sss(char*s,char*t)等级考试重点及真题解析while(*s)&(*t)&(*t+=*s+);return(*s-*t);A.求字符串的长度B.比较两个字符串的大小C.将字符串s复制到字符串t中D.将字符串s接续到字符串t中 while循环的三个条件是(*s)&(*t)&(*t+=*s+),比较两个字符串对应字符是否相等,直到不等,或者其中某个字符串结束为止,函数返回最后比较字符之差。答案为B。3.设以下程序段给数组所有的元素输入数据,正确答案为()。2017年9月等级考试重点及真题解析#include
40、main()int a10,i=0;while(i10)scanf(%d,);A.a+(i+)B.&ai+1 C.a+iD.&a+i 要求给数组所有的元素输入数据,&ai+1反复给a1读数据,所以B错误,a+i反复给a0读数据,C也错误,&a+i依次给a1、a2、a3a10读数据,少了给a0读数据,而a10下标越界。所以答案为A。等级考试重点及真题解析4.以下程序的输出结果是()。2017年9月#include sub(x,y,z)int x,y,*z;*z=y-x;main()int a,b,c;sub(10,5,&a);sub(7,a,&b);sub(a,b,&c);等级考试重点及真题解析
41、printf(%d,%d,%dn,a,b,c);A.5,2,3B.-5,-12,-7C.-5,-12,-17D.5,-2,-7 第1次调用sub(10,5,&a),使a=5-10=-5;第2次调用sub(7,a,&b),使b=-5-7=-12;第3次调用sub(a,b,&c),使c=-12+5=-7,所以答案为B。5.以下程序的输出结果是()。2017年9月#include fun(s,n1,n2)int*s,n1,n2;等级考试重点及真题解析int i,j,t;i=n1;j=n2;while(ij)t=*(s+i);*(s+i)=*(s+j);*(s+j)=t;j-;main()int a1
42、0=1,2,3,4,5,6,7,8,9,0,i,*p=a;等级考试重点及真题解析fun(p,0,3);fun(p,4,9);fun(p,0,9);for(i=0;i10;i+)printf(%d,*(a+i);printf(n);A.0 9 8 7 6 5 4 3 2 1 B.4 3 2 1 0 9 8 7 6 5C.5 6 7 8 9 0 1 2 3 4 D.0 9 8 7 6 5 1 2 3 4 函数fun的功能是将从下界n1到上界n2的数据对调。第1次调用fun(p,0,3)后,数组a前4个数据变为4,3,2,1;第2次调用fun(p,4,9)后,数组a中下标4到9的数据变为0,9,8,
43、7,6,5;最后一次调用fun(p,0,9)后,使a数组数据反序存储,循环输出a数组结果为5 6 7 8 9 0 1 2 3 4,答案为C。6.设有说明“int(*ptr)m;”,其中标识符ptr是()。2017年4月等级考试重点及真题解析A.m个指向整型变量的指针B.指向m个整型变量的函数指针C.一个指向具有m个整型元素的一维数组的指针D.具有m个指针元素的一维指针数组,每个元素都只能指向整型量 ptr是指向具有m个整型元素的一维数组的指针,答案为C。7.以下程序的输出结果为()。2017年4月main()char*alpha6=ABCD,IJKL,MNOP,QRST,UVWX;char*p
44、;int i;p=alpha;等级考试重点及真题解析for(i=0;i4;i+)printf(%s,pi);printf(n);A.ABCDEFGHIJKLB.ABCDC.ABCDIJKLMNOPQRSTD.AEIM 程序中定义了二级指针p,并且p=alpha,循环输出前4个字符串,所以答案为C。8.设有以下语句:char str412=aaa,bbbb,ccccc,dddddd,*strp4;int i;等级考试重点及真题解析for(i=0;i4;i+)strpi=stri;()不是对字符串的正确引用,其中0k4。2017年4月A.strp B.strkC.strpk D.*strp 定义一
45、个指针数组strp,循环使指针数组每个单元指向数组str对应的字符串,要借助指针数组strp引用字符串的话,用下标访问,如strpk正确;*strp相当于strp0,C正确;直接用数组访问当然可以,所以B正确;strp是指针数组的首地址,所以答案为A。9.下面程序的输出是()。2016年9月A.23B.26C.33D.36int aa33=2,4,6;main()等级考试重点及真题解析int i,*p=&aa00;for(i=0;i2;i+)if(i=0)aaii+1=*p+1;else+p;printf(%d,*p);等级考试重点及真题解析p指针指向aa数组第一个元素,第一次循环i=0,使a
46、a01=3,并输出*p的值2;第二次循环i!=0,执行+p,使p指向下一列数据3并输出。所以答案为A。10.下面各语句行中,能正确进行赋字符串操作的语句行是()。2016年4月A.char st45=ABCDE;B.char s5=A,B,C,D,E;C.char*s;s=ABCDE;D.char*s;scanf(%s,s);一个字符串对应一个一维数组,选项A中st是一个二维数组,应该对应4个字符串,A错误;B中的s数组最后元素不是0,所以它只是一个字符数组而非字符串;要执行scanf(%s,s),必须保证s有指向才行,D错误;定义一个字符指针,可以通过赋值运算将某个字符串的首地址赋给它,所以
47、答案为C。思考与练习一、选择题1.若有定义“char s10;”,则以下表达式中不表示s1地址的是()。A.s+1B.s+C.&s1D.&s0+12.以下程序的输出结果是()。main()printf(%dn,NULL);A.因变量无定义输出不定值B.0C.-1D.13.程序段“char*p=abcdefgh;p+=3;printf(%s,p);”的运行结果是()。思考与练习A.abcB.abcdefghC.defghD.efgh4.若已定义“int a=0,1,2,3,4,5,6,7,8,9,*p=a,i;”,其中0=i=9,则对a数组元素的引用不正确的是()。A.ap-aB.*(&ai)C
48、.piD.*(*(a+i)5.下列定义不正确的是()。A.char a10=hello;B.char a10,*p=a;p=hello;C.char*a;a=hello;D.char a10,*p;p=a=hello;6.指针s所指字符串的长度为()。char*s=NameAddressn;A.19 B.15C.18D.说明不合法7.若有以下定义和语句:“char str1=string,str2思考与练习8,*str3=string;”,则对库函数strcpy不正确的调用是()。A.strcpy(str1,HELLO1);B.strcpy(str2,HELLO2);C.strcpy(str2
49、,str1);D.strcpy(str3,HELLO4);8.以下程序的输出结果是()。#include main()int a=1,2,3,4,i;int x=0;for(i=0;i4;i+)思考与练习sub(a,x);printf(%d,x);sub(s,y)int*s,y;static int t=3;y=st;t-;A.1 2 3 4B.4 3 2 1 C.0 0 0 0D.4 4 4 4思考与练习9.以下程序的输出结果是()。main()int a10=1,2,3,4,5,6,7,8,9,10,*p=a;printf(%dn,*(p+2);A.3B.4C.1D.210.有以下程序:v
50、oid prtv(int*x)printf(%dn,+*x);思考与练习main()int a=25;prtv(&a);程序的输出结果是()。A.23B.24C.25D.26二、编程题1.请编写函数,对传送过来的两个浮点数求出和与差,并通过形参传送回调用函数。思考与练习2.用指针编写函数,建立n个整型元素的一维数组,求所有元素的平均值。3.用指针编写程序,在一个字符串的各个字符之间插入“*”成为一个新的字符串,如“abc”,执行程序后则输出“a*b*c”。4.一个班有n名学生m门课程,用指针编写函数实现以下要求。(1)找出两门课以上不及格的学生,输出他们的学号和全部课程成绩。(2)找出平均成绩