C语言基础 九、指针.doc_第1页
C语言基础 九、指针.doc_第2页
C语言基础 九、指针.doc_第3页
C语言基础 九、指针.doc_第4页
C语言基础 九、指针.doc_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

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

文档简介

九、指针本章概述:本章主要考查指针和地址的概念,指针的定义及使用,指针和一维数组的关系,指针和二维数组的关系,指针和字符串的关系,指向函数的指针及返回值为指针的函数,指针变量作函数的参数,指针数组及指向指针的指针等。据对最近几年试卷分析得知,本章考核内容所占比例为15%左右,属重点考核内容,需重点理解。大纲要求:1地址与指针变量的概念,地址运算符与间址运算符。2一维、二维数组和字符串的地址以及指向变量、数组、字符串、函数、结构体的指针变量的定义。通过指针引用以上各类型数据。3用指针作函数参数。4返回地址值的函数。5指针数组,指向指针的指针。重点难点:1一维、二维数组和字符串的地址以及指向变量、数组、字符串、函数、结构体的指针变量的定义。通过指针引用以上各类型数据。2用指针作函数参数。考点1考点分析: 地址、指针和指针变量计算机内存是一个连续编码的单元,每个存储单元都有一个固定的编号,这个编号就是地址。在C程序中定义变量,编译系统都会给这个变量分配相应的存储单元,变量的值放置在相应的内存单元中。C语言中的变量就代表了内存中的一些存储单元,该单元的固定编号就是变量的地址,也称为指针,因此变量的地址又称为变量的“指针”。专门用来存放另一个变量的地址的变量,称为指针变量,又称为指向某个变量的指针。在C语言中存在直接存取和间接存取两种访问内存数据的方法。直接存取利用变量名隐式地访问内存:首先定义变量,然后由编译系统完成从变量名到内存地址的映射工作,用户通过变量名访问内存空间,变量地址对用户完全透明。间接存取则通过指针显式地访问内存:用户直接使用变量的地址,或者将变量的地址值存储于指针变量中,然后通过指针变量获取地址值访问内存。指针变量的定义:类型名*指针变量名1,*指针变量名2,;如:int *p,*q;,则定义了两个指针变量p和q,p和q分别指向整型变量。但此时p和q并没有指向,若要使其有指向,则需要给它们赋值。如:int x,y; p=&x; q=&y; 则p和q分别指向整型变量x和y,即指针变量p和q中分别存放整型变量x和y的地址。注意:指针变量的类型与它所指向的变量的类型应一致。指针变量中只能存放地址值,不可以将任何非地址类型的数据赋给指针变量。如: p=1000;这种赋值方式是非法的。地址值可以通过运算符“&”获取,地址中所存储的值可以通过运算符“*”间接获取。(1)取地址运算符“&”使用格式为:&变量名,如&a表示变量a在内存中的地址。本运算符实现从变量到地址的转化。(2)指针运算符“*”使用格式为:*指针变量名,如*p表示指针变量p所指向的变量的值。本运算符实现从地址到变量的转化。【特别提醒】:语句int *p;中,指针变量p表示的是地址,而*p表示的是地址中所存放的数据。l 试题解析1有以下程序#include#includeint fun(int n) int *p; p=(int *)malloc(sizeofi(int); *p=n; return *p;main() int a; a=fun(10); printf(“%dn”,a+fun(10);程序的运行结果是() 2008年9月选择题第31题A)0B)10C)20D)出错解析:答案为C。函数调用时,传值10给形参n,而在fun()函数中,指针变量p接收形参的值,并返回所接收的值。所以第一次调用fun函数后,变量a的值为10,加上第二次调用得到的值10,最后的输出结果为20。2以下定义语句中正确的是()2008年4月选择题第15题A)int a=b=0;B)char A=65+1,b=b;C)float a=1,*b=&a,*c=&b;D)double a=0.0;b=1.1;解析:答案为B,选项C错在给指针变量c赋值应该直接赋变量地址或指针变量。3若在定义语句:int a,b,c,*p=&c;之后,接着执行以下选项中的语句,则能正确执行的语句是()2007年9月选择题第15题A)scanf(“%d”,a,b,c);B)scanf(“%d%d%d”,a,b,c);C)scanf(“%d”,p);D)scanf(“%d”,&p);解析:答案为C,p为指针变量,其中存放是变量c的地址。4设已有定义:float x;则以下对指针变量p进行定义且赋初值的语句中正确的是() 2007年4月选择题第29题A)float *p=1024; B)int *p=(float x);C)float p=&x; D)float *p=&x;解析:答案为D。给指针变量赋值不能赋非地址类型的数据,则选项A错误,选项B格式错误,选项C中p是普通变量,不是指针变量。5有以下程序:#include main()int n,*p=NULL;*p=&n;printf(“Input n:”); scanf(“%d”,&p); printf(“output n:”); printf(“%dn”,p);该程序试图通过指针p为变量n读入数据并输出,但程序有多处错误,以下语句正确的是() 2007年4月选择题第30题A)int n,*p=NULL; B)*p=&n; C)scanf(“%d”,&p);D)printf(“%dn”,p);解析:答案为A。根据程序定义,*p表示指针变量所指向的变量,选项B应改为p=&n;,p表示指针变量,选项C应改为scanf(“%d”,p);,选项D应改为printf(“%dn”,*p);。6有以下程序main()int a=1,b=3,c=5;int *p1=&a,*p2=&b,*p=&c;*p=*p1*(*p2);printf(%dn,c);执行后的输出结果是()2006年9月选择题第30题A)1B)2 C)3D)4解析:答案为C。指针变量p1、p2、p分别指向整型变量a、b、c,则*p、*p1、*p2分别表示变量c、a、b,语句*p=*p1*(*p2);等价于c=a*b;,最终c的值为3。7若有说明语句:double *p,a;则能通过scanf语句正确给输入项读入数据的程序段是()2006年4月选择题第24题A)*p=&a; scanf(1f,p);B)*p=&a; scanf(f,p);C)p=&a; scanf(1f,*p);D)p=&a; scanf(1f,p);解析:答案为D。指针变量p要指向变量a,正确的赋值语句是p=&a;,而p本身表示的就是变量的地址值。8以下程序的功能是:利用指针指向三个整型变量,并通过指针运算找出三个数中的最大值,输出到屏幕上,请填空:2007年4月填空题第15题main()int x,y,z,max,*px,*py,*pz,*pmax;scanf(“%d%d%d”,&x,&y,&z);px=&x;py=&y;pz=&z;pmax=&max;_;if(*pmax*py)*pmax=*py;if(*pmax*pz)*pmax=*pz;printf(“max=%dn”,max);解析:答案为:*pmax=*px或*pmax=x。分析程序段可知求三个数的最大值,所采用的算法是假设其中一个是最大值,放置到max中,取其它的数据与max比较,若比max大,则替换掉,否则保留原值。根据后面取x和y与max值做比较知,最初假设x值是最大值。 考点2 指针与数组指针与一维数组:一个数组包含若干个元素,定义数组时会为数组分配一段连续的存储空间,每个数组元素都在内存中占用存储单元,都有相应的地址。可以用指针变量指向数组的首地址或数组中的某一个元素,因为数组的存储空间为连续空间,则使用指针变量的加减运算可以取到数组的任意一个元素。一般所说的数组的指针是指数组的首地址。定义指向数组元素的指针变量的格式与指向变量的指针变量类似,如:int a5=1,2,3,4,5; int *p; p=a; 说明:数组名a表示了数组的首地址,指针变量p指向数组的首地址,数组的首地址也可以用&a0表示,则p=a;等价于p=&a0;,若要将p指向其中的某一个元素,如a2,则可以表示为:p=&a2;。若p指向数组a的首地址,则*p表示数组的第一个元素值a0,*p=1;表示给p所指向的数组元素赋值,即等价于a0=1;。p+1不是简单的将p值加1,而表示将p指向数组a的下一个元素,即表示a1的地址&a1。p+1实际上可表示为p+1*n,n表示一个数组元素所占用的字节数(整型为4,字符型为1,单精度浮点型为4)。结合指向数组的指针变量,数组元素的引用形式有很多。如:int a5=1,2,3,4,5,*p;p=a; 若要表示数组的第i个元素,可以表示为:*(p+i),*(a+i),ai,pi。若要遍历数组的所有元素,结合循环还可以使用*(p+)或*(+p)表示,但注意不能使用*(a+)或*(+a)表示,因为a表示数组的首地址,是常量值,不能改变。指针与多维数组:指针变量不仅可以指向一维数组,还可以指向多维数组。如:int a34,*p; p=a0;则*p表示数组元素a00,p+1表示指向下一个元素,*(p+1)则表示元素a01。还可定义指向m个元素组成的一维数组的指针变量,如:int a34,(*p)4; p=a;p表示指向4个元素的一维数组,表示的是二维数组的行地址,*p表示的不是数组元素a00,而是二维数组的列地址a0,*p表示数组元素a00,*(p+1)表示的是二维数组第二行的首地址。二维数组第i行第j列的元素可以表示为:aij、pij、*(*(a+i)+j)、*(*(p+i)+j)。【特别提醒】:指针变量可以做自增运算,而数组名不可以自增或被赋值,难点是指向二维数组的指针变量。l 试题解析1若有定义语句:double x5=1.0,2.0,3.0,4.0,5.0,*p=x;,则错误引用x数组元素的是()2008年9月选择题第23题A)*pB)x5C)*(p+1)D)*x解析:答案为B。数组元素的表示可以有:*(x+i)、*(p+i)、xi、pi,i值从0到元素个数减1,x5为下标越界错误。2有以下程序#includemain() int a=1,2,3,4,y,*p=&a3; -p; y=*p; printf(“y=%dn”,y);程序的运行结果是()2008年4月选择题第23题A)y=0B)y=1C)y=2D)y=3解析:答案为D。指针变量p指向数组最后一个元素,-p后p 指向a2,*p取出a2的值3赋给变量y,则y的值为3。3在16位编译系统上,若有定义int a =10,20,30,*p=&a;,当执行p+;后,下列说法错误的是()2006年9月选择题第29题A)p向高地址移了一个字节B)p向高地址移了一个存储单元C)p向高地址移了两个字节D)p与a+1等价解析:答案为A。指针变量p指向一维数组a,执行p+后指针变量p指向第二个元素,指针变量加减运算移动的字节数与数据类型有关,整型为2个字节,故p+表示向高地址移了两个字节。4以下程序的输出结果是_2008年9月填空题第9题#includemain() int j,a=1,3,5,7,9,11,13,15,*p=a+5; for(j=3; j ;j-) swithc(j) case 1: case 2: printf(“%d”,*p+); break; case 3: printf(“%d”,*(-p); 解析:答案为9911。指针变量初始指向数组的第6个元素a5,*p的值为11,在for循环中,j=3时,执行case 3后的分支语句,*(-p)表示指针变量向后移动一个存储单元,并取变量的值,则表示元素a4,所以输出为9;j=2时,执行case 2后的分支语句,*p+表示指针变量向前移动一个存储单元,根据p+取的是自增之前的值,p指向元素a5,而*p+表示的是元素a4的值,输出为9;j=1时,执行case 2后的分支语句,p指向元素a6,则*p+表示的是元素a5的值,输出为11,j=0时,循环条件为假,结束循环的执行。5以下程序的输出结果是_2008年4月填空题第12题#includemain() int a5=2,4,6,8,10,*p; p=a; p+; printf(“%d”,*p);解析:答案为4。指针变量p指向数组a的首地址,p+表示指针变量向后移动一个存储单元,则指向第二个元素a1,*p表示元素a1的值4。 考点3 指针与字符串字符串可以用字符数组表示,也可以用字符型指针描述,如:用数组描述字符串:char s1=”Beijing”;用指针变量描述字符串:char *s2=”Beijing”;,定义了字符类型的指针变量,指向字符串的首地址。C语言中字符串常量是按字符数组进行处理的,在内存中开辟一个字符数组来存放字符串常量。指针变量s2是指向字符串的首地址,并不表示把字符串”Beijing”存放在s2中。上面的语句等价于:char *s2; s2=”Beijing”;,表示将字符串的首地址赋给了s2。字符串的输出可以用字符数组名或字符指针名加格式控制符%s来控制,如printf(“%s,%s”,s1,s2);,则输出为Beijing,Beijing,系统会从第一个字符开始输出,直到遇到字符串结束标志0为止。在使用字符数组和字符指针描述字符串时要注意两者的区别:n 字符数组由若干元素组成,每个元素中存放一个字符,字符指针中存放的是字符串的首地址,并非一个个的字符。n 对字符数组不能这样使用:char s110; s1=”Beijing”;,因为数组名表示数组的首地址,是常量,只能对各个元素赋值。n 字义字符数组后,会为数组分配确定的存储空间,在程序运行期间不会改变,而定义字符指针后,指针的指向可以改变。如:char s110,s210,*p; p=s1; p=s2;,p的指向可以改变。【特别提醒】:特别注意字符数组和字符指针的区别。l 试题解析:1 设有如下程序段char s20=”Beijing”,*p;p=s;则执行p=s;语句后,以下叙述正确的是()2008年4月选择题第25题A)可以用*p表示s0B)s数组中元素的个数和p所指字符串长度相等C)s和p都是指针变量D)数组s中的内容和指针变量p中的内容相同解析:答案为A。s为数组名,s数组中元素的个数为数组的长度20,而p所指字符串长度为字符串”Beijing”的长度7,数组s中的内容是字符串中的一个个字符,指针变量p中的内容是字符串的首地址,是地址值。2设有定义:char p=1,2,3,*q=p; ,以下不能计算出一个char型数据所占字节数的表达式是()2007年9月选择题第29题A)sizeof(p) B)sizeof(char) C) sizeof(*q) D)sizeof(p0)解析:答案为A。sizeof()是计算数据类型所占字节数的运算符,计算一个char型数据所占字节数可以用sizeof(char)或sizeof(字符型变量)得到,选项A计算的是指针变量p所占的字节数。3 有以下程序main()char ch =“uvwxyz”,*pc;pc=ch; printf(“%cn”,*(pc+5);程序运行后的输出结果是( )2007年4月选择题第44题A)z B)0 C)元素ch5的地址 D)字符y的地址解析:答案为A。字符指针变量pc指向字符数组ch的首地址,pc+5表示数组ch的第6个元素的地址,*(pc+5)表示第6个元素ch5的值,即为z。4有以下程序main()char s = aeiou,*ps; ps=s; printf(%cn,*ps+4);程序运行后的输出结果是()2006年9月选择题第37题A)aB)e C)uD)元素s4的地址解析:答案为B。指针变量ps指向数组s的首地址,则*ps表示数组的第一个元素值为a,*ps+4表示为a+4,故最后的输出结果为字母e。5若有定义:char *x= “abcdefghi”;,以下选项中正确运用了strcpy函数的是()2006年9月选择题第39题A)char y10; strcpy(y,x4);B)char y10; strcpy(+y,&x1);C)char y10,*s; strcpy(s=y+5,x);D)char y10,*s; strcpy(s=y+1,x+1);解析:答案为D。strcpy函数的调用格式为strcpy(char *s1,char *s2),表示将s2表示的字符串复制到s1中去,s1必须足够大能够放置s2的内容,复制时连同字符串的结束标志0一起复制到s1中。6设有以下定义和语句 char str20=”Program”,*p; p=str; 则以下叙述中正确的是()2006年4月选择题第47题A)*p与str0中的值相等 B)str与p的类型完全相同 C)str数组长度和p所指向的字符串长度相等 D)数组str中存放的内容和指针变量p中存放的内容相同 解析:答案为A。与2008年4月选择题第25题类似,指针变量p指向数组的第一个元素,则*p表示的就是str0,str是字符数组,而p是指针变量。7 以下程序的输出结果是_2007年4月填空题第17题# includemain()char *s1,*s2,m;s1=s2=(char*)malloc(sizeof(char);*s1=15; *s2=20; m=*s1+*s2;printf(“%dn”,m);解析:答案为40。malloc()函数为变量分配存储空间,则s1和s2指向同一个存储空间,给s1和s2所指向的存储空间赋值,即是对同一个存储空间赋值,最后*s1和*s2中存储的都是20,所以最后m的值为40。 考点4 指针与函数指针变量做参数:函数的参数不仅可以是整型、浮点型、字符型变量,还可以是指针变量,指针变量作函数参数时,传递的是地址值。数组名或指向数组的指针变量作函数的参数时,如果形参数组中各元素的值发生变化,则实参数组元素的值也随之变化。若是字符数组名或指向字符串的指针变量作参数,在被调用的函数中改变字符串的内容,在主调用函数中可以得到改变了的字符串。指向函数的指针:指针变量可以指向整型、浮点型变量、字符串、数组,也可以指向一个函数,函数在编译时被分配一个入口地址,入口地址就是函数的地址,也叫做函数的指针。可以用一个指针变量指向函数,然后通过该指针变量调用此函数。指向函数的指针变量的定义格式为:数据类型(*指针变量名)();,数据类型指函数返回值的类型。如若有函数定义:int f(int x),则定义指针变量int (*p)();p=f;,函数f的调用可以用类似 (*p)(2);的语句实现。指针变量p可以指向任意一个返回值为整数的函数,直接用函数名给其赋值即可,在用指针变量调用函数时,只需用(*p)代替函数名即可。返回值尉指针的函数:一个函数可以带回一个整型值、浮点数值、字符值等,也可以带回指针型的数据,即地址值,概念与返回其他类型相似,只是带回的值是指针类型而已。返回值为指针值的函数定义格式为:数据类型*函数名(参数列表),如:int *f(int a,int b) int *p=a+b; return p;f是函数名,调用f函数可以得到一个指向整型变量的指针。【特别提醒】:返回值为指针值的函数的定义格式要和指向函数的指针变量区别开来。l 试题解析1 有以下程序#includeint fun(int (*s)4,int n,int k) int m,i; m=s0k; for(i=1; im ) m=sik; retrun m;main() int a44=1,2,3,4,11,12,13,14,21,22,23,24,31,32,33,34; printf(“%dn”,fun(a,4,0);程序的运行结果是()2008年9月选择题第36题A)4B)34C)31D)32解析:答案为C。fun函数的第一个参数是指向包含4个元素的一维数组的指针变量,实参传递二维数组名a给形参,则形参s就指向二维数组a的首地址,s和a描述的同一个二维数组,m初始值为s00的值1,在for循环中依次取第一列的其他元素进行比较,将最大者放在变量m 中保存,所以m的值为二维数组第一列的中最大值31。2有以下程序#includevoid fun(int *s,int n1,int n2) int i,j,t;i=n1; j=n2;while(ij) t=si; si=sj; sj=t; i+; j-;main() int a10=1,2,3,4,5,6,7,8,9,0,k;fun(a,0,3); fun(a,4,9); fun(a,0,9);for(k=0;k10;k+) printf(“%d”,ak); printf(“n”);程序的运行结果是()2008年4月选择题第32题A)0987654321B)4321098765C)5678901234D)0987651234解析:答案为C。函数fun的参数为指针变量,调用fun时实参传递的是数组名a,则形参s指向实参数组a的存储空间,若s所指向的存储空间元素值发生改变,则数组a的也随之改变。第一次调用:fun(a,0,3),s指向a数组的首地址,i和j的值分别为0和3,while循环的条件为真,执行循环体,交换a0和a3的值,i和j的值分别为1和2,判断循环条件成立,交换a1和a2的值,i和j的值分别为2和1,判断循环条件不成立,第一次调用结束,数组的内容变为:4,3,2,1,5,6,7,8,9,0。后面的两次调用类似,第二次调用结束数组的内容为:4,3,2,1,0,9,8,7,6,5,第三次调用结束数组的内容为:5,6,7,8,9,0,1,2,3,4。3有以下程序#includevoid fun(char *a,char *b) while(*a=*) a+;while(*b=*a) b+;a+;main() char *s=”*a*b*”,t80;fun(s,t); puts(t);程序的运行结果是()2008年4月选择题第35题A)*a*bB)a*bC)a*b*D)ab解析:答案为C。调用fun函数时,传递字符指针s和字符数组t给形参a和b,则a和b分别指向字符串s和字符数组t。第一个while循环从字符串s的第一个字符开始判断是否为*,若为真,则移动指针指向下一个字符,直到碰到第一个不是*的字符为止,循环结束时,指针变量a指向字符串”*a*b*”中的字符a位置,第二个while循环从字符a开始依次取出每一个字符赋给指针变量b所指向的存储单元中,直到取到字符串的结束标志0。4设有定义语句:int (*f)(int );,则以下叙述正确的是()2008年4月选择题第40题A)f是基类型为int的指针变量B)f是指向函数的指针变量,该函数具有一个int类型的形参C)f是指向int类型一维数组的指针变量D)f是函数名,该函数的返回值是基类型为int类型的地址解析:答案为B。从定义语句可以看出f是一个指针变量,这个指针变量指向的是带一个整型参数的函数。5有以下函数int aaa(char *s)char *t=s;while(*t+);t-;return(t-s);以下关于aaa函数的功能叙述正确的是()2007年9月选择题第30题A)求字符串s的长度 B)比较两个串的大小C)将串s复制到串t D)求字符串s所占字节数解析:答案为A。字符指针变量t与形参s指向的是同一个字符串,通过while循环将指针变量t指向字符串的结束标志0,t-表示将字符串结束标志减去,则t-s表示的是字符串的长度。6有以下程序#includevoid fun(int *a,int n)/*fun函数的功能是将a所指数组元素从大到小排序*/int t,i,j;for(i=0;in-1;i+)for(j=i+1;jn;j+)if (aiaj) t=ai;ai=aj;aj=t;main()int c10=1,2,3,4,5,6,7,8,9,0,i;fun(c+4,6);for (i=0;i10;i+) printf(%d,ci);printf(n);程序运行的结果是()2007年9月选择题第34题A)1,2,3,4,5,6,7,8,9,0, B)0,9,8,7,6,5,1,2,3,4,C) 0,9,8,7,6,5,4,3,2,1, D)1,2,3,4,9,8,7,6,5,0,解析:答案为D。根据题意,函数的功能是对数组元素从大到小排序,在调用函数时,第一个实参传递数组的第5个元素地址,第二个实参传递的是排序的元素个数,实现的是从数组的第5个元素开始实现从大到小的排序。因为传递的是数组的地址,形参数组元素改变会影响实参数组元素,所以最后的输出为前4个元素原样输出,从第5个元素开始从大到小输出。7有以下程序#includeint fun(char s)int n=0;while(*s=0) n=10*n+*s-0;s+;return(n);main()char s10=6,1,*,4,*,9,*,0,*;printf(%dn,fun(s);程序运行的结果是()2007年9月选择题第34题A)9 B)61490 C)61 D)5解析:答案为C。实参s传递数组的首地址给形参数组s,先取字符串的第一个元素6,判断是0至9之间的数字字符,计算表达式n=10*0+6-0,得到n的值为6,s+取下一个字符1,判断仍为数字字符,计算表达式n=10*6+1-0,得到n的值为61,s+取下一个字符*,判断不是数字字符,则循环结束,返回n值61。8有以下程序#include void fun(int n,int *p) int f1,f2;if(n=1|n=2) *p=1;else fun(n-1,&f1); fun(n-2,&f2);*p=f1+f2;main() ints;fun(3,&s); printf(%dn,s);程序的运行结果是()2007年9月选择题第42题A)2 B)3 C)4 D)5解析:答案为A。函数fun是递归函数,主函数中调用时传递3给形参n,传递s的地址给形参指针变量p,判断n值不为1或2,则执行else分支,递归调用fun函数,传递2给形参n,传递f1的地址给形参指针变量p,判断n的值为2,则赋值1给f1,函数调用结束,再递归调用fun函数,传递1给形参n,传递f2的地址给形参指针变量p,判断n的值为1,则赋值1给f2,函数调用结束,返回执行*p=f1+f2;得到*p的值为2,因为形参指向实参,则s 的值为2。9有以下程序void f(int *q)int i=0;for( ; i5;i+)(*q)+;main()int a5=1,2,3,4,5,i;f(a);for(i=0;i5;i+)printf(“%d,”,ai);程序运行后的输出结果是( )2007年4月选择题第36题A)2,2,3,4,5, B)6,2,3,4,5, C)1,2,3,4,5, D) 2,3,4,5,6,解析:答案为B。调用函数f时,传递数组a给指针变量q,则q和a描述的是同一片存储空间。for循环中*q表示的是数组的第一个元素a0,(*q)+表示将a0的值递增1,循环5次取出的均是同一个元素a0,即将a0的值递增了5次。10若有以下函数首部int fun(double x10,int *n)则下面针对此函数声明语句中正确的是( ) 2006年9月选择题第32题A)int fun(double x,int *n);B)int fun(double ,int);C)int fun(double*x,int n); D)int fun(double *,int*);解析:答案为D。根据函数首部定义可知函数fun的第一个参数应为浮点型指针或浮点型数组,第二个参数为整型指针,故答案为D。11有以下程序 void fun1(char *p) char *q; q=p; while(*q!=0) (*q)+; q+; main() char a=“Program”,*p; p=&a3; fun1(p); printf(“%sn”,a); 程序执行后的输出结果是 ( ) 2006年4月选择题第37题A)Prohsbn B)Prphsbn C)Progsbn D)Program 解析:答案为A。main函数中,指针变量p指向字符数组a的第4个字符g,p指向字符串”gram”,调用fun1函数,实参p、形参p、局部变量q均指向字符数组a后面的字符串”gram”,while循环*q表示取出字符g,并进行递增运算,则*q的内容变为字符h,循环依次取出后面的字符,并执行类似操作,直到字符串结尾,循环结束,q所指向的字符串为”hsbn”,字符数组a的内容改变为Prohsbn。12有以下程序 void swap(char *x,char *y) char t; t=*x; *x=*y; *y=t; main() char *s1=”abc”,*s2=”123”; swap(s1,s2); printf(“%s,%sn”,s1,s2); 程序执行后的输出结果是 ( ) 2006年4月选择题第38题A)123,abc B)abc,123 C)1bc,a23 D)321,cba 解析:答案为C。调用swap函数,形参字符指针x和y分别指向实参指针s1和s2所指向的字符串,在swap函数中,*x和*y分别表示字符串”abc”和”123”的第一个字符,交换两个字符后,x和y所指向的字符串的值分别为”1bc”和”a23”,则s1和s2的所指向的字符串分别为”1bc”和”a23”。13以下程序的输出结果是_2008年9月填空题第10题#include#define N 5int fun(int *s,int a,int n) int j; *s=n; j=n; while(a!=sj) j-; return j;main() int sN+1; int k; for(k=1;k=N;k+) sk=k+1; printf(“%dn”,fun(s,4,N);解析:答案为3。main函数中数组s中的值从s1到s5依次为2,3,4,5,6。调用fun函数,实参数组s传首地址给形参指针s,形参a得到数值4,形参n得到数值5,通过赋值语句,s0的值为5,变量j的值为5,循环中从最后一个元素开始往前取值,判断元素值是否等于4,若等于,则返回该数组元素的下标值。a3的元素值为4,所以函数的返回值为3。14以下程序的输出结果是_2008年4月填空题第10题#includevoid swap(int *a,int *b) int *t;t=a; a=b; b=t;main() int i=3,j=5,*p=&i,*q=&j;swap(p,q); printf(“%d %dn”,*p,*q);解析:答案为3 5。在main函数中,指针变量p和q分别指向变量i和j,调用swap函数,指针变量p和q分别传递给a和b,则指针变量a和b也分别指向变量i和j,通过中间指针变量t交换a和b的指向,则a和b分别指向j和i,但形参指针的指向改变不会影响实参指针的指向,所以p和q的指向不变,*p和*q的值仍为i和j值,分别是3和5。15以下程序的输出结果是_2007年9月填空题第11题#include#includechar *fun(char *t) char*p=t;return(p+strlen(t)/2);main() char *str=abcdefgh;str=fun(str);puts(str);解析:答案为efgh。调用fun函数后,实参str、形参t、局部指针变量p均指向同一个字符串”abcdefgh”,函数strlen(t)求出字符串的长度为8,则返回值为p+4,返回的是字符串”efgh”的首地址,则str即指向字符串”efgh”,最后的输出为efgh。16以下函数fun的功能是返回str所指字符串中以形参c中字符开头的后续字符串的首地址,例如:str所指字符串为Hello!, c中的字符为e,则函数返回字符串:ello!的首地址。若str所指字符串为空串或不包含c中的字符,则函数返回NULL。请填空。2006年4月填空题第12题 char *fun(char *str,char c) int n=0;char *p=str; if(p!=NULL) while(pn!=c&pn!=0) n+; if(pn=0 )return NULL; return (_); 解析:答案为&pn或p+n或str+n。字符指针变量p指向若不为空,则反复取出字符串中的字符判断是否与字符变量c的内容相等,若找到相等或到字符串结束未找到相等,则结束循环。若找到相等,n记录相等字符的位置,返回地址可描述为&pn、p+n或str+n。【特别提醒】:指针变量或数组名作函数参数时,传递的是地址,形参和实参所使用的是同一片存储空间。 考点5 指针数组指针数组:指针数组指的一个数组的所有元素均为指针类型数据,即数组中的每一个元素都是一个指针变量,存放的都是地址值。一维指针数组的定义格式为:类型名 *数组名数组长度;如:int *a5;,表示数组a中有5个数组元素,每个数组元素指向一个整型变量,即每个元素都是一个整型数据地址。注意指针数组和指向数组的指针变量的定义格式区别,运算符的优先级比运算符*的优先级高,a先和结合形成数组,再与*结合表示数组中存放的是指针变量,若是int (*a)5;,则用括号改变运算符的优先级,a先和*结合表示是指针变量,再与结合表示指针变量指向的是一个包含5个元素的数组。指针数组作为参数:指针数组的另一个重要应用是作为主函数main的形参。main函数可以有两个形式参数,如:main(int argc,char *argv),argc表示命令行中的参数个数,argv表示一个指向字符串的指针数组。main函数是由系统调用的,实参是在命令行中和命令名一起给出的,命令行的格式为:命令名参数1参数2参数n,命令名和参数之间用空格分隔,参数1是main所在的文件名,假设为f1,若想把字符串”aa”、”bb”传递给main函数作参数,则可以写成:f1 aa bb。则argc得到参数个数为3(包括文件名),指针数组argv中元素分别指向参数字符串,即argv0中存放字符串”f1”的首地址,argv1指向字符串”aa”,argv2指向字符串”bb”。【特别提醒】:要注意区分指针数组和指向数组的指针变量的不同。l 试题解析1有以下程序#include#includevoid fun(char *s,int n) char *t; int i,j;for(i=0;in-1;i+) for(j=i+1;jstrlen(sj) t=si; si=sj; sj=t;main() char *ss=“bcc”,”bbcc”,”xy”,”aaaacc”,”aabcc”;fun(ss,5); printf(“%s,%sn”,ss0,ss4);程序的运行结果是()2008年4月选择题 第33题A)xy,aaaaccB)aaaacc,xyC)bcc,aabccD)aabcc,bcc解析:答案为A。调用函数fun时传递实参ss给形参s,ss和s均是指针数组,则s指向实参指针数组,根据分析,函数fun采用选择排序算法,根据字符串的长度由小到大排序,即最后ss数组中字符串的顺序为:”xy”,”bcc”,bbcc”,aabcc”,aaaacc”。2有以下程序#includevoid fun(char *p)+p; printf(%sn,*p);main() char *a=Morning,Afternoon,Evening,Night;fun(a); 程序的运行结果是()2007年9月选择题 第32题A)Afternoon B)fternoon C)Morning D)orning解析:答案为A。调用函数fun时传递指针数组名a给形参p,形参p是指向指针的指针,p中不是存放普通变量的地址,而是存放指针变量的地址,形参p指向指针数组a的首地址,+p表示向后移动一个

温馨提示

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

最新文档

评论

0/150

提交评论