欢迎来到三一文库! | 帮助中心 三一文库31doc.com 一个上传文档投稿赚钱的网站
三一文库
全部分类
  • 研究报告>
  • 工作总结>
  • 合同范本>
  • 心得体会>
  • 工作报告>
  • 党团相关>
  • 幼儿/小学教育>
  • 高等教育>
  • 经济/贸易/财会>
  • 建筑/环境>
  • 金融/证券>
  • 医学/心理学>
  • ImageVerifierCode 换一换
    首页 三一文库 > 资源分类 > PPT文档下载  

    C语言复习PPTC10.ppt

    • 资源ID:3479418       资源大小:1.07MB        全文页数:70页
    • 资源格式: PPT        下载积分:8
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录   微博登录  
    二维码
    微信扫一扫登录
    下载资源需要8
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    C语言复习PPTC10.ppt

    第十章 指针,内容提要 指针的概念 指针变量的定义和引用 数组与指针 字符串与指针 指向函数的指针(了解) 返回指针值的函数(了解) 指针数组和指向指针的指针(了解),A、B、C三人欲使用某旅馆的房间。A先到达旅馆,在服务台登记房间,房号是518。然后A电话通知B,但没有通知C。 B和C该怎样找到A呢? B可以直接到518找到A。 C可以从旅馆的服务台查询到A的房号是518,再找到A。,例子,10.1 指针的概念,一、变量的地址 计算机中,数据的存储在内存中。 内存可划分若干存储单元,每个单元可以存放8位二进制数,即一个字节。 内存单元采用线性地址编码,每个单元具有唯一的地址编码。,1、变量的地址:系统为变量分配的内存单元的地址 一个无符号的整数 int a; float b; a=3; b=5;,存储区间,变量i的地址 2000 变量j的地址 2002 变量k的地址 2004,数组a的指针元素a0的地址 2030 元素a1的地址 2032 元素a2的地址 2034,i j k,a0 a1 a2,变量i、j、k以及数组a的地址分配:,例:若定义int i,j,k,a3;,2、变量的有关概念 存储内容:数据值 空间大小:数据类型 空间位置:地址 生存周期:存储类别,二、变量的访问方式,1、直接访问:通过变量名进行访问;,int a; float b; a=3; b=5;,将3送入a所占用的内存单元,a b p,2、间接访问:通过一个变量来访问另一个变量,定义一个变量p,存放a的地址,通过p访问a, 若将变量p的值改为3AB8(b的地址),则可以通过p访问b。,如何定义p? 如何获得变量a的地址? 通过p访问a?,例:int i,j,k,*p; /*定义p为指针变量*/ i=3; j=i*2; /*变量的直接访问*/ p= /*以p的值作为地址对i间接访问*/ ,2000 2002 2004 3010,i j k p,3 6 9 2000,三、指针变量,指针变量就是存放地址的变量。 如p为指针变量,它存放整型变量a的地址,则称指针变量p指向整型变量a,a b p,地址也称为“指针”,变量的地址就是变量的指针。 数组、函数也都有指针。数组的指针是数组的起始地址,函数的指针是函数的入口地址。,指针变量的性质 定义后,编译时为其分配一个存储单元,该单元的字节数与编译系统存储模式有关:隐含的小模式下为2字节,大模式为4字节; 指针变量中只能存放指针(地址); 按指针变量所指向的对象,指针变量可分类为: 指向变量/数组元素的指针变量(存放变量指针) 指向数组行的指针变量(存放数组某行指针) 指向函数的指针变量(存放函数入口地址),10.2 指针变量的定义和引用,一、指针变量的定义方法 类型标识符 *指针变量名,指针说明符,指针变量的类型 所指向的数据的类型。,int *p1,*p2; float *pf; char *ps;,注意: 1)每个指针变量都要加*号,表明指针变量, *本身不是变量的一部分; 2)类型标识符,不是指针变量本身的类型,指针变量为整型,存储长度:2 / 4字节。 3)某种类型的指针变量只能指向同类型的变量。如:pf只能指向float型的变量。 4)每个指针变量有各自的存储单元,在未赋值前其值不定。,二、指针变量的赋值,指针变量的值是个无符号整数。 不能直接将整常量赋给指针变量。,用变量的地址给指针变量赋值(求地址运算符&) 注:变量的类型必须与指针变量的类型相同,如:int a,b,*p; p=,用相同类型的指针变量赋值 注:若不赋值,指针变量的值是随机的,赋空值NULL,如:int a; int *p1,*p2; p1=,如:int *p; p=NULL; 或 p=0;,指针变量初始化的方法: 赋空值NULL 用已定义变量的地址,如:int *p=NULL; float a; float *p2=,赋值规则: 1)赋值的指针单位要一致; 指向变量的指针变量=变量或数组元素的指针 指向数组行的指针变量=数组行的指针 指向函数的指针变量=函数的指针 2)赋值的指针类型要一致; 如:指向整型指针变量=整型变量的地址 注意: 不能随意将一个整数赋给指针变量,只能将有效的指针值赋给指针变量。 如:p1=100; 使p1指向了100号存储单元,而100号单元对用户是不透明的,若出现利用p1向100号单元赋值的情况将导致对系统或用户程序的破坏。,三、指针变量的应用,1、两个有关的运算符 & * 形式: &任意变量 取地址运算符 *指针变量 指针运算符 含义:&a表示变量a所占的内存空间的首地址 *p表示指针变量p所指向内存中的数据,应用:通过指针变量访问所指变量, 将指针变量指向被访问的变量 如:int a=5,*p,b; p=,访问所指变量 取内容:b=*p; printf(“%dn”,*p); 存内容:*p=100;,viod main() int a=5,b=3; int *p; p=,注意:*P若出现在“”的左边则为存内容 *P若出现在“”的右边或其他表达式中为取内容,2 、运算规则,*、& 优先级相同 右结合 与+、- -、!等单目运算符的优先级相同 高于算术运算符*、/、%,如: int a=2;*p=,结果是: 2 2 3 2,从右向左计算参数值,例:计算一个数的倍数。 #include “stdio.h“ void main( ) int a, b; int *p1, *p2; p1= 5 a=5,b=10 &a:65488, 65488,使用 p1保持指向m,m自加1为6。 *p1+ *与+同为二级,结合方向自右而左,相当于*(p1+),即先引用p1的值&m, 而后p1自加1不再指向m ; *(&m)得m的值5。,写出下面各表达式的结果,并找出具有等价关系的对子。 int a=5,*p= &*p *&a (*p)+ &a a *p+ *(p+) a+, ,思考:下列表达式是何含义? &*p *&a,等价于 p a,指向变量的指针变量举例:,#include void main( ) int a, b,c; int *pa, *pb, *pc; pa= ,2 3 a=2,b=3 c=5 c=5 c=6 c=6 c=7 a=4,b=4,(*pa)+)+*pb,例:利用指针变量将a、b按先大后小的顺序输出。 方法1:不改变a、b的值,而使p1指向值大的变量。 #include “stdio.h“ void main( ) int *p1, *p2, *p, a, b; scanf(“%d,%d“, ,5,8,&b,&a,p1,b,p2,a,p,&a,&b,&a,方法2:不改变指针变量的指向,而使a为大数。 #include “stdio.h“ void main( ) int *p1, *p2, t, a, b; scanf(“%d,%d“, ,5,8,&b,&a,p1,b,p2,a,t,5,8,5,四、指针变量作为函数参数,意义: 将主调函数中某变量地址传递给被调函数;被调函数对这个地址对应的存储单元进行引用或赋值操作,其结果在函数调用结束后依然存在,主调函数可引用。 形参、实参的对应关系: 实参 形参 已指向某变量的指针变量 或变量的地址,指针变量,例:编写函数实现两个数的交换,#include viod swap(int x,int y) int t; t=x;x=y;y=t; main( ) int a=3,b=5; swap(a,b); printf(”%d,%dn”, a,b); ,#include viod swap(int *x,int *y) int t; t=*x;*x=*y;*y=t; main( ) int a=3,b=5; swap( ,a b x y,3,5,3,5,2000 2040 2400 2470,2000,2040,viod swap(int *x,int *y) int *t; t=x; x=y; y=t;,错误,错误,viod swap(int *x,int *y) int *t; *t=*x; *x=*y; *y=*t;,有问题(t没指向变量),#include void swap(int *p1, int *p2) int t; t=*p1; *p1=*p2; *p2=t; void main( ) int a, b,c; scanf(“%d,%d,d“, ,形参 p1,形参 p2,例:输入三个数,按大小顺序输出。 利用指针作为函数的参数,将a、b按a大b小的顺序存储。,结论: 为使在函数中改变了的变量值能被main函数所用,用指针变量作为函数参数,在函数执行过程中使指针变量所指向的变量值发生变化,函数调用结束后,这些变量值的变化依然保留,这样就实现了“通过调用函数使变量的值发生变化,在主调函数中使用这些改变了的值”的目的。,想通过函数调用得到n个要改变的值: 在主调函数中设n个变量,用n个指针变量指向它们; 然后将指针变量作实参,将这n个变量的地址传给所调用的函数的形参; 通过形参指针变量,改变该n个变量的值; 主调函数中就可以使用这些改,思考: 1)若以基本类型变量为形参是否可实现交换? void main( ) ; if(ab) swap(a, b); ; void swap(int x, int y) int t; t=x; x=y; y=t; ,实参a,8,形参x,实参b,5,形参y,t,5,2)改变形参指针变量的指向是否可实现交换? void main( ) ; if(ab) swap( ,a,实参&a,&b,形参 p1,b,实参&b,&a,形参 p2,p,&a,例:定义一个函数,用指针作为函数的参数,实现小写字母转换为大写。 #include “stdio.h“ void main( ) void toup(char *p); char c1, c2, *p1; c1=getchar( ); c2=getchar( ); p1= ,2010,c1,第一次调用:,实参p1,E,2011,c2,第二次调用:,实参p1,F,形参 p,*p=*p-32,形参 p,*p =*p-32,例:编写一个简化的模拟scanf(“%d”, 分析:这个例子可以使我们了解两点: scan_exa 函数怎样将字符串转换成整数; scanf 函数参数中地址表的意思,为什么要用变量地址,而不用变量名。, 计算机接收键盘信息,接收的是ASCII码。例如键入 123 1 2 3 转换整型数的方法:循环读字符,赋给字符变量c,用公式t=10*t+(c-0)将各位字符拼成一个整数。 为了使拼好的整数能够传回主函数,函数形参p应是指针变量,实参是地址,拼好的整数赋给p所指向的变量,就是实参地址所指的变量,这样主函数就能得到转换好的整数了。,#include “stdio.h“ void main() int i,k; void scan_exa(int *); scan_exa( ,10.3 数组与指针,一、一维数组与指针,1、数组是连续存放若干各元素的集合 2、数组名就是指向此数组第1各元素的指针(首地址) 如:int a10,*p; 则p=a等价于 p=&a0,3000 2 4 6 8 A C E 10 12,a p,a0 a1 a9,3、某一元素的地址:=&ai 用指针引用该元素:*p ai,4/,4、数组元素的下标在内部实现时,统一按“基地址位移”的方式处理 即 a a+1 a+i 故表示数组元素的地址可以用:p+i 、a+i 表示数组元素的内容可以用:ai、*(p+i)、 *(a+i),注意:数组名a与指向数组首地址的指针变量p不同,a不是变量。,例 读程序,写出结果 #include void main( ) int a=3, b=5; int *p= ,3 5 4, 6,#include void main( ) int i, a5; int *p; for (i=0;i5;i+) p= ,#include void main( ) int i, a5; int *p=a; for (i=0;i5;i+,p+ ) *p = i; printf(“%3dn“, *p); printf(“n“); ,0 1 2 3 4,注意:数组首地址、元素地址、下一个元素地址,数组指针、指针变量和数组元素之间的关系,设有int a10,*p; p=a;则,地址关系,内容关系,例 :数组的使用,#include void main( ) int i, a5, *pa; printf(“Input 5 numbers:n“); for (i=0;i5;i+) sacnf(“%d”, ,sacnf(“%d”, a+i );,sacnf(“%d”, p+i );,printf(“%d”, *(a+i);,printf(“%d”, *(p+i);,二、指针的运算,1、赋值运算 如:p=&x p=a p=NULL 注:指针类型相同,2、加减运算 用法:指针±整数 如:a + i p ± i 注:只能用于数组元素的引用 注意下标的有效范围,3、指针相减运算:求两地址间距 用法:指针指针 如: p-a 注:两个指针的类型相同,并指向统一连续的存储的区域,4、移动指针(+、-) 如:p+ p- 注:对数组名不能实施运算,5、比较运算: 用法:指针 运算符 指针 如:pq 依据:地址,注意:2-5通常用于 指向数组的指针,例 将数组a的数据赋值到数组b中并输出来。,#include #define M 7 void main( ) int i, aM=12,22,35,4,25,8,7; int bM; for(i=0; iM; i+) bi=ai; printf(“Output numbers:n“); for(i=0; iM; i+) printf(“dn“, bi); printf(“n“); ,#include #define M 7 void main( ) int i, aM=12,22,35,4,25,8,7; int bM; int *p=a,*q=b; for(i=0; iM; i+) *q=*p;q+;p+; printf(“Output numbers:n“); for(i=0; iM; i+) printf(“dn“, bi); printf(“n“); ,#include #define M 7 void main( ) int i, aM=12,22,35,4,25,8,7; int bM; int *p=a,*q=b; for(i=0; iM; i+) *q+=*p+; printf(“Output numbers:n“); for(i=0; iM; i+) printf(“dn“, bi); printf(“n“); ,printf(“dn“, *q+);,q=b;,例 用指针变量输出一维数组各元素及各元素和。 #include void main( ) int i, sum, a5=1,2,3,4,5,*p; p= ,p,2030 2032 2034 2036 2038 2040,说明: 1)p+的增量取决于p所指向的类型所占字节数; double *p; 增量为8 float *p; 增量为4 int *p; 增量为2 char *p; 增量为1 2)若p=则 *p+ *(p+) 先访问a0,再使p指向a1 (*p)+ a0+ 先访a0,再使a0自加 *(+p) p先自加,再访问*p,*p为a1 +(*p) +a0 先使a0自加,再访问a0,例 用指针查找一维数组最大元素值。 #include void main( ) int i, max, a5, *p; p=a; for(i=0; imax) max= *(p+i) ; printf(“nmax=%dn“, max); 注意:循环中p始终保持指向a0不变。,p,2030 2032 2034 2036 2038,P+1:,P+2:,P+3:,P+4:,总结: 1)p+i的含义:p后第i个变量的地址 p= 该循环过程中p不断改变指向,分别指向各元素a0,a1,a2,a3,a4。,三、数组的指针与函数的参数,数组作为函数参数,实参和形参的对应关系可归纳一下四种情况:,int f(int x,int n) viod main() int a10; f(a,10); ,int f(int *x,int n) viod main() int a10; f(a,10); ,int f(int *x,int n) viod main() int a10;*p=a; f(p,10); ,int f(int x,int n) viod main() int a10;*p=a; f(p,10); , ,例:编写一函数求一维数组最大元素值及其下标位置(要求使用指针),已知:数组首地址p,元素个数n; (作为函数参数) 结果:下标k(左返回值),int max(int *p,int n) 设最大值放在max中。则初始状态为: max=*p,k=0 如果*(p+i)max 则 max=*(p+i) 且k=i,#include int max_array(int *p,int n) int i,k,max; max=*(p);k=0; for(i=0; imax) max= *(p+i) ;k=i; return k; void main( ) int a10=12,22,35,4,25,8,7,2,1,9; int i *p=a,k; for(i=0; i10; i+) printf (“%5d”,*(p+i) ; k=max_array(a,10); printf(“nmax=a%d=%dn“, k,*(p+k); ,i+,p+),*( p ),*( p ),指针p变化吗?,例 :定义函数,用指针作为函数参数,实现一维数组的倒置存储和输出。,已知:一维数组,元素个数n; (作为函数参数) 结果:倒置后的一维数组,算法: 两个指针初始指向数组的两头,交换所指向的元素,并逐渐向中间靠拢,#include “stdio.h“ #define N 5 void turn(float x ) float *p1,*p2, t; p1=x; p2=x+(N-1); for( ; p1p2; p1+, p2-) t=*p1; *p1=*p2; *p2=t; return; void main( ) float aN, *p; int i; for(i=0; iN; i+) scanf(“%f“, a+i); p=a; turn(p); for( ; pa+N; p+) printf(“%4.0f“, *p);,a0 a1 a2 a3 a4,x0 x1 x2 x3 x4,实参p,形参x,局部t,局部p1,局部p2,1,5,1,例 方法1:实参是已指向数组的指针变量,形参为数组,方法2:实参是已指向数组的指针变量,形参也为指针变量;,实参p,形参p1,局部p2,a0 a1 a2 a3 a4,void turn(float *p1) float *p2, t; p2=p1+(N-1); for( ; p1p2; p1+, p2-) t=*p1; *p1=*p2; *p2=t; return; ,四、二维数组与指针,1、二维数组是数组的数组,即是由3个一维数组组成。 2、数组名a代表整个二维数组的首地址,也就是第0行的首地址。 a+1是第1行的地址,a+2代表第2行的首地址。,若有定义: int a34=1,3,5,7,9,11,13,15,17,19,21,23,4、某一元素的地址: 0行第1列元素的地址a0+1 i行第j 列元素的地址ai+j 数组元素的地址可以用:&a12、a1+2、*(a+1)+2 数组元素的内容可以用: a12 、*(a1+2)、 *(*(a+1)+2),3、数组名代表数组的首地址, a0、a1、a2 是一维数组名,a0代表第0行一维数组中第0列元素的地址,即&a00。a1的值是&a10,a2的值是&a20。,a1 等价*(a+1),行指针与列指针,a指向一维数组,a0指向a00元素 注意: 1行指针前加*,就转化为列指针,a,a+1指向行,*a,*(a+1)指向列的指针 2列指针前加&,就转化为行指针,a0 指向0行0列元素,加&变 &ai。不要把 &ai简单地理解为 ai单元的物理地址,因为不存在 ai这样一个变量。 &ai或a+i指向行,而ai或*(a+i)指向列,2000 2002 2004 2006 2008 2010 2012 2014 2016 2018 2020 2022,a00 a01 a02 a03 a10 a11 a12 a13 a20 a21 a22 a23,87 73 91 76 82 89 67 73 93 70 80 82,0行,1行,2行,p,P不断自加1,按二维数组存储结构顺序指向各元素。,方法1:,访问数组元素的方法:,方法2: i行j列元素地址 p+i×列数+j,2000 2008 2016,p,元素a21地址: p+2*4+1 =p+9 (9为元素位移量) =p+sizeof(int)*9 =2000+18=2018,P保持不变!,例 利用指针按逻辑结构输出二维数组及各行元素之和。,#include “stdio.h“ #define N 3 #define M 4 void main( ) int aNM=1,2,3,4,5,6,7,8,9,10,11,12; int *p,*ps,*pe, i, j, sum; ps=,p-ps的值不是指针量,是两指针间相隔的数据个数,#include “stdio.h“ #define N 3 #define M 4 void main( ) int aNM=1,2,3,4,5,6,7,8,9,10,11,12; int *p, i, j; p= ,例 输出二维数组i行j列元素值。,10.4 字符串与指针,一、字符串的指针,C语言的字符串是以0作结束符的字符序列 用字符数组组存放字符串( 含0 的字符数组可以看作字符串) 字符串指针就是字符数组的首地址,如:char a=“Apple” char b=C,h,i,n,e,0,二、字符串指针变量,定义:char *指针变量,如:char *p,*q=“Language”; p=“This is a book.”;,int *p,*q; p=123; p=,如:char *p,c10; p=c;,注意:C语言对字符串常量按字符数组处理,内存中开辟一个字符数组存放该常量。P指向字符串的首地址,不是存放字符串,用指针变量访问字符数组(与数值型数组相同),例:char str320, *p; p= 则:p+i*20+j &strij *(p+i*20+j) strij,指针变量访问一维/二维字符数组 例:char str10=“Hello!“, *p; p=str; 则:p+i &stri, i:元素位移量 p+i的值:str+i×1,例:逆序打印字符串,算法: 设字符串为q; 令p指向串尾;打印字符*p,并将p前移;直到p指向串头;,#include void main( ) char *p,*q=“language”; for (p=q;*p!=0;)p+; for (p-;p=q;p-) putchar(*p); putchar(0); ,#include void main( ) char *p,*q=“language”; int n; n=strlen(q);p=q+n; for (p-;p=q;p-) putchar(*p); putchar(0);,P指向串的0,例 写一函数判断一个字符串是否回文(顺读和逆读相同),已知:字符串指针变量p(作参数) 结果: 是(1)或否(0)(返回值),算法: 1 令q指向最后一个字符 2 若*p=*q,则指针向中间靠拢,直到p=q,则return 1,否则return 0,int ishuiwen (char *p) char *q=p; while (*q!=0) q+; q-; while (pq) if (*p=*q)p+;q-; else return 0; return 1;,int ishuiwen (char *p) char *q=p; while (*q!=0) q+; q-; while (pq) if (*p+!=*q-) return 0; return 1; ,例:不用strcpy函数,实现字符串的拷贝。,pa,pb,b,a,#include “stdio.h“ void main( ) char a =“Hello!“, b20,*pa,*pb; pa=a; pb=b; for(;*pa!=0;pa+,pb+) *pb=*pa; *pb=*pa; printf(“nA string: %s“, a); printf(“nB string: %s“, b); ,总结: 1)编译时对字串常量的处理如同字符数组,将其存放在连续存储区域,末尾自动加入空字符; 2)p=“China”; 字串常量存储区的起始地址赋给指针变量p,使p指向该字串首字符,不是把一串字符赋给p; 3)p的指向可用赋值语句确定,也可在定义时确定; 如:char *p=“China“; p=“Hello, Wang.“; 4)已指向字串的指针变量p保持不变时,p可带下 标使用; 如:pi代表字串中的第i+1个字符。 5)p+i的值为:p+i×类型长=p+i p+i的含义:第i+1个字符的地址,三、字符数组与字符指针比较,char a=“I love this game ”,*p=a;,1、存储的内容不同: 字符数组可以存字符串,存的是字符; 字符指针变量存的是字符串在内存的首地址,I love this game,300A,数组a,变量p,300A,2、赋值方式不同:,字符数组只能对各个元素赋值; (一次只能赋一个字符) 字符指针变量值赋值一次,赋的是地址,如:char a10,*p p=“China”; a=“Hello”;,3、当没有赋值时: 字符数组名代表一个确切的地址; 字符指针变量中的地址是不确定的。,如:char a10,*p scanf(“%s”,a); scanf(“%s”,p);,×,×,4、字符数组名是常量,不能改变值; 字符指针变量可以改变值。,5、 可用下标的形式引用指针变量所指字符串中的字符。,如:a+ p+,如:char *p=“abcd”; putchar(p3); p2=x;,×,6、字符串指针变量的应用: 例如:可以用指针变量指向一个格式字符串,在printf中直接使用此指针变量。,如:char *fmt=“a=%d,b=%d,c=%dn”; 则printf (fmt,a,b,c);等价于 printf (“a=%d,b=%d,c=%dn”,a,b,c);,7、注意使用的区别,char d10,*q; int x=5, *p=,×,×,×,10.5 指向函数的指针,C 源程序经编译后,每个函数都被编译成一段执行代码,这段执行代码第一条指令的地址就叫作该函数的指针(函数入口地址); 在源程序中函数名就代表函数的指针。,一、 用函数的指针变量调用函数,1、指向函数的指针变量的定义与赋值 定义一般形式:类型标识符 (*指针变量名)( );,赋值形式:指向函数的指针变量=函数指针,其中:类型标识符指明了指针变量所指向函数返回值的类型;,其中:函数指针用函数名表示,可以是库函数名或用户自定义函数名。,表示指针变量指向函数,2、利用指向函数的指针变量调用函数,调用形式: (*指针变量名)(实参表);,其中:指针变量必须已指向需要调用的函数;实参表中列出需要调用函数所要求的参数。,例:#include “stdio.h“ void main( ) int max(int, int); int a, b, (*p)(int,int ); scanf(“%d,%d“, ,说明: 指向函数这个整体,不能做加、减、关系运算。 不同类型指针变量的区别 定义形式、指向的对象、 运算及运算规则不同。,max(a,b),二、 用函数的指针作为函数的参数 当函数中要调用其它函数,而调用的函数名不是固定的,则应采用函数指针变量作为形参。,(已指向某函数),函数的指针,实参与形参的对应关系: 实参 形参 函数名 函数指针变量 指向函数的指针变量,float t(double (*f1)( ), double (*f2)( ), float x) float y; y=(*f1)(x)/(*f2)(x); return(y);,sin代码,cos代码,f1,f2,cos入口,sin入口,#include “math.h“ void main( ) float t(double (*f1)( ), double (*f2)( ), float x); float y1, y2, x; int j; printf(“nInput:“); scanf(“%d“, ,例:利用指向函数的指针变量作为形参,编写一函数,使其即能求正切值、也能求余切值。,#include “math.h“ void out(double (*f)(double),double x1, double x2,double step) double x; int i=1; for(x=x1;x=x2;x=x+step,i+) printf(“%lf “, (*f)(x) ); if(i%5=0)printf(“nt“); printf(“ntx=%lfn“,x-step); ,例:利用指向函数的指针变量调用函数,根据菜单选择实现输出f1(x)、f2(x)、exp(x)函数在区间x1,x2内的函数值,x的步长为step的值。,分析:将输出函数值的功能定义为一个函数out,由于输出函数值的函数名不同,所以用指向函数的指针变量调用函数。,double f1(double x) return(x*2+1); double f2(double x) return(x*x); ,void main( ) double f1(double),f2(double),exp(double); void out(double (*f)(double),double x1,double x2, double step); int s; printf(“t out funtion:nt 1. x*2+1; 2. x*x 3. exp“); printf(“nt please select: “); scanf(“%d“, ,10.6 返回指针值的函数,一、 返回指针值函数的定义和调用,定义形式: 类型标识符 *函数名(形参列表) ; return(指针量); ,调用形式: 变量的指针变量=函数名(实参表),例:int *fun1(int x, int y) ; return(指向int型的指针量); ,例:char *search(char str , int n) ; return(指向char型的指针量); ,一个函数可以返回一个整型值、字符值、实型值等,也可以返回指针型的数据,即地址。,例: 定义一函数,在字符串中查找某小写字符是否存在;若存在返回该字符的指针,并在主调函数将其转换为大写并输出它在字串中的位置。 要求:字串中无重复字符。,分析: 1)主调函数要将字串的指针及要查找的字符传递给查找函数; 2)在查找函数中,找到字符将所其指针返回给主调函数;若没找到返回空指针。,#include “stdio.h“ void main( ) char *search(char *, char); char str20, c, *p; printf(“nInput a string:“); gets(str); printf(“Input a character to search:“); c=getchar( ); p=search(str, c); /*函数返回指针值*/ if(p=NULL) printf(“Has not be found.n“); else *p=*p-32; puts(str); printf(“char=%c, p=%dn“,*p+32, (p-str)+1); ,void main( ) ; p=search(str, c); char *search(char *fp, char ch) for( ; *fp!=ch /*fp的值:字符e的指针*/ ,fp,实参:str,查找e,

    注意事项

    本文(C语言复习PPTC10.ppt)为本站会员(本田雅阁)主动上传,三一文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    经营许可证编号:宁ICP备18001539号-1

    三一文库
    收起
    展开