C语言程序设计-谭浩强-第10章指针.ppt

上传人:wuy****n92 文档编号:80442312 上传时间:2023-03-23 格式:PPT 页数:31 大小:654.50KB
返回 下载 相关 举报
C语言程序设计-谭浩强-第10章指针.ppt_第1页
第1页 / 共31页
C语言程序设计-谭浩强-第10章指针.ppt_第2页
第2页 / 共31页
点击查看更多>>
资源描述

《C语言程序设计-谭浩强-第10章指针.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计-谭浩强-第10章指针.ppt(31页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、8.5函数的指针和指向函数的指针变量函数指针:函数在编译时被分配的入口地址,用函数名表示max.指令1指令2v函数指针变量赋值:如p=max;函数返回值的数据类型专门存放函数入口地址可指向返回值类型相同的不同函数指向函数的指针变量v定义形式:数据类型 (*指针变量名)();如 int (*p)();函数指针变量指向的函数必须有函数说明v函数调用形式:c=max(a,b);c=(*p)(a,b);c=p(a,b);v对函数指针变量pn,p+,p-无意义()不能省int(*p)()与 int *p()不同1例 用函数指针变量调用函数,比较两个数大小main()int max(int,int);in

2、t a,b,c;scanf(%d,%d,&a,&b);c=max(a,b);printf(a=%d,b=%d,max=%dn,a,b,c);int max(int x,int y)int z;if(xy)z=x;else z=y;return(z);main()int max(int,int),(*p)();int a,b,c;p=max;scanf(%d,%d,&a,&b);c=(*p)(a,b);printf(a=%d,b=%d,max=%dn,a,b,c);int max(int x,int y)int z;if(xy)z=x;else z=y;return(z);2用函数指针变量作函数

3、参数例 用函数指针变量作参数,求最大值、最小值和两数之和void main()int a,b,max(int,int),min(int,int),add(int,int);void process(int,int,int(*fun)();scanf(%d,%d,&a,&b);process(a,b,max);process(a,b,min);process(a,b,add);void process(int x,int y,int(*fun)()int result;result=(*fun)(x,y);printf(%dn,result);max(int x,int y)printf(“ma

4、x=”);printf(“max=”);return(xy?x:y);return(xy?x:y);min(int x,int y)printf(“min=”);printf(“min=”);return(xy?x:y);return(xy?x:y);add(int x,int y)printf(“sum=”);printf(“sum=”);return(x+y);return(x+y);38.6 返回指针值的函数 函数定义形式:类型标识符 *函数名(参数表);例 int *f(int x,int y)例 指针函数实现:有若干学生成绩,要求输入学生序号后,能输出其全部成绩main()float

5、 score4=60,70,80,90,56,89,67,88,34,78,90,66;float *search(float (*pointer)4,int n),*p;int i,m;printf(Enter the number of student:);scanf(%d,&m);printf(The scores of No.%d are:n,m);p=search(score,m);for(i=0;i*y)return x;elsereturn y;main()int a=2,b=3;int*p;p=f1(&a,&b);printf(%dn,*p);.2000201020142004

6、2008200C23 指针变量y 指针变量x(f1)20042000COPY变量a 变量b(main)指针变量p*5例 写一个函数,求两个int型变量中居于较大值的变量的地址.20002010201420042008200C2变量a 变量b(main)3 指针变量p*2004int*f3(int*x,int*y)if(*x*y)return x;elsereturn y;main()int a=2,b=3;int*p;p=f1(&a,&b);printf(%dn,*p);6例 写一个函数,求两个int型变量中居于较大值的变量的地址int*f3(int x,int y)if(xy)return&

7、x;elsereturn&y;main()int a=2,b=3;int*p;p=f3(a,b);printf(%dn,*p);.20002010201420042008200C23 变量y 变量x(f3)32COPY变量a 变量b(main)指针变量p*7例 写一个函数,求两个int型变量中居于较大值的变量的地址不能返回形参或局部变量的地址作函数返回值.20002010201420042008200C2变量a 变量b(main)3 指针变量p*2010int*f3(int x,int y)if(xy)return&x;elsereturn&y;main()int a=2,b=3;int*p;

8、p=f3(a,b);printf(%dn,*p);88.7 指针数组和指向指针的指针用于处理二维数组或多个字符串指针数组v定义:数组中的元素为指针变量v定义形式:存储类型 数据类型*数组名数组长度说明;例 int *p4;指针所指向变量的数据类型指针本身的存储类型区分int *p4与int (*p)4v指针数组赋值与初始化赋值:main()int b23,*pb2;pb0=b0;pb1=b1;.int *pb2pb0pb1int b23123246初始化:main()int b23,*pb=b0,b1;.int *pb2pb0pb1int b231232469v指针数组赋值与初始化L i s

9、p 0F o r t r a n 0B a s i c 0p0p1p2p30赋值:main()char a=Fortran;char b=Lisp;char c=Basic;char*p4;p0=a;p1=b;p2=c;p3=NULL;.或:main()char*p4;p0=Fortran;p1=Lisp;p2=Basic;p3=NULL;.初始化:main()char*p=Fortran,Lisp,Basic,NULL;.L i s p 0F o r t r a n 0B a s i c 0p0p1p2p3010 char name59=“gain”,“much”,“stronger”,“p

10、oint”,“bye”;char*name5=“gain”,“much”,“stronger”,“point”,“bye”;g a i n 0s t r o n g e r 0p o i n t 0m u c h 0name0name1name2name3name4b y e 0g a i n 0s t r o n g e r 0p o i n t 0m u c h 0b y e 0v二维数组与指针数组区别:二维数组存储空间固定字符指针数组相当于可变列长的二维数组分配内存单元=数组维数*2+各字符串长度指针数组元素的作用相当于二维数组的行名但指针数组中元素是指针变量二维数组的行名是地址常量11

11、main()int b23,*pb2;int i,j;for(i=0;i2;i+)for(j=0;j3;j+)bij=(i+1)*(j+1);pb0=b0;pb1=b1;for(i=0;i2;i+)for(j=0;j3;j+,pbi+)printf(b%d%d:%2dn,i,j,*pbi);例 用指针数组处理二维数组int *pb2pb0pb1int b23b00 *pb0b01 *(pb0+1)b02 *(pb0+2)b10 *pb1b11 *(pb1+1)b12 *(pb1+2)12324612例 对字符串排序(简单选择排序)main()void sort(char *name,int n

12、),print(char *name,int n);char*name=Follow me,BASIC,Great Wall,FORTRAN,Computer;int n=5;sort(name,n);print(name,n);void sort(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;name0name1name2name3name4nameGreat WallFORTRANComputerFollow

13、 meBASICkjkjjji=013例 对字符串排序(简单选择排序)main()void sort(char *name,int n),print(char *name,int n);char*name=Follow me,BASIC,Great Wall,FORTRAN,Computer;int n=5;sort(name,n);print(name,n);void sort(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;name

14、k=temp;name0name1name2name3name4nameGreat WallFORTRANComputerFollow meBASICkkjjji=1k14例 对字符串排序(简单选择排序)main()void sort(char *name,int n),print(char *name,int n);char*name=Follow me,BASIC,Great Wall,FORTRAN,Computer;int n=5;sort(name,n);print(name,n);void sort(char*name,int n)char*temp;int i,j,k;for(i

15、=0;in-1;i+)k=i;for(j=i+1;j0)k=j;if(k!=i)temp=namei;namei=namek;namek=temp;name0name1name2name3name4nameGreat WallFORTRANComputerFollow meBASICkkjji=215例 对字符串排序(简单选择排序)main()void sort(char *name,int n),print(char *name,int n);char*name=Follow me,BASIC,Great Wall,FORTRAN,Computer;int n=5;sort(name,n);

16、print(name,n);void sort(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;name0name1name2name3name4nameGreat WallFORTRANComputerFollow meBASICkkji=316例 对字符串排序(简单选择排序)main()void sort(char *name,int n),print(char *name,int n);char*name=F

17、ollow me,BASIC,Great Wall,FORTRAN,Computer;int n=5;sort(name,n);print(name,n);void sort(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;name0name1name2name3name4nameGreat WallFORTRANComputerFollow meBASIC17多级指针v定义:指向指针的指针v一级指针:指针变量中存

18、放目标变量的地址p1&p2&i3P2(指针变量)i(整型变量)例 int *p1;int *p2;int i=3;p2=&i;p1=&p2;*p1=5;v二级指针:指针变量中存放一级指针变量的地址例 int *p;int i=3;p=&i;*p=5;&i3P(指针变量)i(整型变量)一级指针单级间接寻址二级指针一级指针目标变量二级间接寻址18l定义形式:存储类型 数据类型 *指针名;如 char *p;例 int i,*p;p=&i;()/p是二级指针,不能用变量地址为其赋值指针本身的存储类型最终目标变量的数据类型*p是p间接指向对象的地址*p是p间接指向对象的值例 int i=3;int *

19、p1;int *p2;p1=&i;p2=&p1;*p=5;ip1p23&i&p1*p2,*p1*p2v多级指针例 三级指针 int *p;四级指针 char *p;1920002010201420042008200C12变量a 变量b(main)指针变量p2000 指针变量q2004例 一级指针与二级指针#include void swap(int*r,int*s)int*t;t=r;r=s;s=t;main()int a=1,b=2,*p,*q;p=&a;q=&b;swap(p,q);printf(%d,%dn,*p,*q);20042000COPY 指针变量s 指针变量r(swap)指针变

20、量t2000200420002020002010201420042008200C12变量a 变量b(main)指针变量p2000 指针变量q2004例 一级指针与二级指针#include void swap(int*r,int*s)int*t;t=r;r=s;s=t;main()int a=1,b=2,*p,*q;p=&a;q=&b;swap(p,q);printf(%d,%dn,*p,*q);输出:1,221例 一级指针与二级指针#include void swap(int*r,int*s)int*t;t=r;r=s;s=t;main()int a=1,b=2,*p,*q;p=&a;q=&b

21、;swap(p,q);printf(%d,%dn,*p,*q);abpqabpqrsabpqsrabpq输出:1,222例 一级指针与二级指针#include void swap(int*r,int*s)int*t;t=*r;*r=*s;*s=t;main()int a=1,b=2,*p,*q;p=&a;q=&b;swap(&p,&q);printf(%d,%dn,*p,*q);20002010201420042008200C12变量a 变量b(main)指针变量p2000 指针变量q2004200C2008COPY 二级指针s 二级指针r(swap)指针变量t20002004200023例

22、一级指针与二级指针#include void swap(int*r,int*s)int*t;t=*r;*r=*s;*s=t;main()int a=1,b=2,*p,*q;p=&a;q=&b;swap(&p,&q);printf(%d,%dn,*p,*q);20002010201420042008200C12变量a 变量b(main)指针变量p2000 指针变量q200220002004输出:2,124例 一级指针与二级指针#include void swap(int*r,int*s)int*t;t=*r;*r=*s;*s=t;main()int a=1,b=2,*p,*q;p=&a;q=&b

23、;swap(&p,&q);printf(%d,%dn,*p,*q);abpqbapqabrspqabrspq输出:2,125例 用二级指针处理字符串#define NULL 0void main()char*p;char*name=hello,good,world,bye,;p=name+1;printf(%o:%s ,*p,*p);p+=2;while(*p!=NULL)printf(%sn,*p+);name0name1name2name3name4char*name5worldbye0hellogoodnamep运行结果:644:good bye用*p可输出地址(%o或%x),也可用它输

24、出字符串(%s)p*(p+)26v二级指针与指针数组的关系int *p 与 int *q10 l指针数组名是二级指针常量lp=q;p+i 是qi的地址l指针数组作形参,int *q 与int*q完全等价;但作为变量定义两者不同l系统只给p分配能保存一个指针值的内存区;而给q分配10块内存区,每块可保存一个指针值27命令行参数v命令行:在操作系统状态下,为执行某个程序而键入的一行字符v命令行一般形式:命令名 参数1 参数2参数nmain(int argc,char *argv)v命令行参数传递v带参数的main函数形式:C:TC copy.exe source.c temp.c有3个字符串参数的

25、命令行命令行中参数个数元素指向命令行参数中各字符串首地址形参名任意命令行实参main(形参)系统自动调用main函数时传递第一个参数:main所在的可执行文件名可执行文件名28例 输出命令行参数main(int argc,char*argv)while(argc1)+argv;printf(%sn,*argv);-argc;main(int argc,char *argv)while(argc-0)printf(%sn,*argv+);1.编译、链接test.c,生成可执行文件test.exe2.在DOS状态下运行(test.exe所在路径下)例如:C:TC test.exe hello wo

26、rld!运行结果:hello world!运行结果:test hello world!argv0argv1argv2char*argvworldtesthelloargvargc=329定义含义int i;int *p;int an;int *pn;int (*p)n;int f();int*p();int(*p)();int*p;定义整型变量ip为指向整型数据的指针变量定义含n个元素的整型数组an个指向整型数据的指针变量组成的指针数组pp为指向含n个元素的一维整型数组的指针变量f为返回整型数的函数p为返回指针的函数,该指针指向一个整型数据p为指向函数的指针变量,该函数返回整型数p为指针变量,它指向一个指向整型数据的指针变量8.8指针的数据类型30例 下列定义的含义(1)int *p3;(2)int (*p)3;(3)int *p(int);(4)int (*p)(int);(5)int *(*p)(int);(6)int(*p3)(int);(7)int *(*p3)(int);函数指针数组,函数返回int型指针指针数组指向一维数组的指针返回指针的函数指向函数的指针,函数返回int型变量指向函数的指针,函数返回int 型指针函数指针数组,函数返回int型变量31

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com