指针的应用实例

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

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

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

资源描述

指针函数与函数指针分析•主讲:龙志1.指针作为函数的参数函数的参数传递可以采用地址传递。所以指针可作为函数参数。当指针作为函数的形参时,实参传递的是地址,在函数中通过地址访问实参,所以,在函数中通过地址对实参的修改影响到实参的值。【例9.11】输入的两个整数按大小顺序输出。#includestdio.hvoidswap(intx,inty){inttemp;temp=x;x=y;y=temp;}voidmain(){inta,b;scanf(%d,%d,&a,&b);if(ab)swap(a,b);printf(\n%d,%d\n,a,b);}运行结果:1,2↙1,2可见:此程序没能够达到题目要求。虽然ab,并且进入swap()函数进行数据交换,实现了x和y的交换,返回到主函数后,x和y都被释放掉了。***输入的两个整数按大小顺序输出。(运用指针)#includestdio.hswap(int*p1,int*p2){inttemp;temp=*p1;*p1=*p2;*p2=temp;}voidmain(){inta,b;int*p1,*p2;scanf(%d,%d,&a,&b);p1=&a;p2=&b;if(ab)swap(p1,p2);printf(\n%d,%d\n,a,b);}•运行结果:•1,2↙•2,12.字符指针1.字符串的表示形式在C语言中,可以用两种方法实现对字符串的操作。(1)用字符数组处理字符串。【例9.15】voidmain(){charstr[]=“Ilovechina!”;printf(“%s”,str);}或:voidmain(){charstr[]=”Ilovechina!”;inti;for(i=0;*(str+i)!=’\0’;i++)printf(“%c”,*(str+i));}运行结果:Ilovechina!3.用字符指针实现将字符串的首地址赋给指针,用字符指针变量来处理字符串。【例9.16】用指针变量逐个输出数组中的每个字符。voidmain(){charstr[]=”Ilovechina!”;char*p;inti;p=str;for(i=0;*(p+i)!=’\0’;i++)printf(“%c”,*(p+i));}•或用指针变量整体输出字符数组的值。•voidmain()•{charstr[]=”Ilovechina!”;•char*p;•inti;•p=str;•printf(“%s”,p);•}•也可以在定义字符指针的同时初始化。•voidmain()•{char*str=“Ilovechina!”;•printf(“%s\n”,str);•}4.字符指针作函数参数字符数组名可作函数参数,字符指针变量也可作函数参数。【例9.18】用函数调用实现字符串的连接。strcat12(char*p1,char*p2){while(*p1!=’\0’)/*使p1指向第一个字符串末尾*/p1++;while(*p2!=’\0’)/*将p2连接到第一个字符串的当前位置*/{*p1=*p2;p1++;p2++;}*p1=’\0’;}voidmain(){charstr1[40]={“People’sRepublicof”};charstr2[]={“China”};strcat12(str1,str2);printf(“%s\n”,str1);•}•运行结果:•People’sRepublicofChina5.字符指针变量与字符数组字符数组和字符指针变量都能实现字符串的存储与运算,但两者之间还是有区别的,主要包括以下几点:(1)字符数组由若干元素组成,每个元素存放一个字符;字符指针变量存放的是字符串的首地址。(2)赋值方式不同:不能用赋值语句给字符数组赋值。charstr[14];str=“Ilovechina!”这是错误的。字符指针变量可以采用下面的形式赋值:char*p;p=“china!”这是正确的。但要注意赋给指针变量p的不是字符串,而是字符串的首地址。(3)定义一个数组,在编译时分配存放n个元素的存储空间;定义指针变量只分配存放一个地址的空间。(4)指针变量的值是可以改变的,字符数组名则不行。【例9.19】字符指针变化输出。voidmain(){char*a=“IloveChina!”;a=a+7;/*a已指向了字符C*/printf(“%s”,a);}运行结果如下:China!/*当前地址直到字符串结束为止*/字符数组不能采用如下形式:charstr[]={“IloveChina!”};str=str+7;/*该语句是错误的*/printf(“%s”,str);数组名是一个常量其值是不能改变的。(5)可以用指针变量指向一个格式字符串,用它代替printf中的格式串。char*format=“a=%d,b=%f\n”;printf(format,a,b)6.函数指针函数名就代表函数的入口地址。函数指针:函数的入口地址称为函数指针。即指向函数的指针变量为函数指针。函数指针定义格式:存储类型数据类型(*指针变量名)();其中:“存储类型”是函数指针本身的存储类型;“数据类型”是指函数返回值的数据类型;例如:int(*p)();定义一个指向整形函数的指针变量p。【例6.1】求a和b中的最大者。程序如下:voidmain(){intmax();int(*p)();inta,b,c;p=max;/*函数max入口地址赋给p*/scanf(“%d,%d”,&a,&b);c=(*p)(a,b);printf(“a=%d,b=%d,max=%d”,a,b,c);}intmax(intx,inty){intz;if(xy)z=x;elsez=y;return(z);}•6.1.1函数指针作函数参数•函数的参数不仅可以是整型量、字符型量,同样指向函数的指针也可以作为函数的参数。•例10.26函数sin、cos、tan分别用于计算浮点数的正弦、余弦、正切值,函数execute则是可完成这些计算的通用函数。•源程序•#includemath.h•main()•{doubleexecute();•double(*function[3])();•doublex,y;•inti,n;•function[0]=sin;•function[1]=cos;•function[2]=tan;•printf(输入x:);•scanf(%lf,&x);•printf(“0-计算x的正弦,1-计算x的余弦、2-计算x的正切值:请选择输入(0-2):”);••scanf(%d,&n);if(n=0&&n3)•{y=execute(x,function[n]);•printf(计算结果为:%.5lf\n,y);•}•elseprintf(输入错!);•}•doubleexecute(doublex,double(*func)())•{doubley;•y=(*func)(x);•returny;•}•程序运行结果:•输入x:0.5•0-计算x的正弦,1-计算x的余弦、2-计算x的正切值:请选择输入(0-2):2•计算结果为:0.546306.2指针函数指针函数:返回指针值的函数称为指针函数。指针函数定义形式:类型标识符*函数名(参数表);例如:int*f1(x,y);其中f1为函数名,调用f1后得到一个指向整型数据的指针(地址)。【例6.2】有若干个学生成绩(每个学生有4门课),要求在用户输入学号后,能输出学生的全部成绩,用指针函数实现。6.2程序如下:voidmain(){floatscore[][4]={{66,76,86,96},{66,77,88,99},{48,78,89,90}};float*serach(float(*pointer)[4],intn);float*p;inti,m;printf(“Enterthenumberofstudent:”);scanf(“%d”,&m);/*输入要查找的学生序号*/printf(“ThescoresofNo.%dare:\n”,m);p=search(score,m);for(i=0,i4;i++)/*输出第n个学生的全部成绩*/printf(“%6.2f”,*(p+i));}float*search(float(*pointer)[4],intn)/*函数的返回值为指向实型数据的指针*/{float*pt;pt=*(pointer+n);/*把指针定位在第n个学生的第一个数据上*/return(pt);/*函数的放回值为第n个学生成绩的首地址*/}运行结果如下:Enterthenumberofstudent:1ThescoresofNo.%dare:66.00,77.00,88.00,99.006.3指向指针的指针指针变量:专门用来存放另一个变量的地址的变量就称为指针变量;指向指针的指针:用来存放指针变量的地址的变量就称为指向指针变量的指针变量。有的教材又称为二级指针变量。定义格式:类型标识符**变量名;例如:int**p;6.3】voidmain(){inta=12;int*p1,**p2;p1=&a;p2=&p1;printf(“%d,%d\n”,*p1,**p2);}运行结果:12,12

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

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

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

×
保存成功