ImageVerifierCode 换一换
格式:PPT , 页数:72 ,大小:827.50KB ,
资源ID:14193406      下载积分:10 金币
快捷注册下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.zixin.com.cn/docdown/14193406.html】到电脑端继续下载(重复下载【60天内】不扣币)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

开通VIP折扣优惠下载文档

            查看会员权益                  [ 下载后找不到文档?]

填表反馈(24小时):  下载求助     关注领币    退款申请

开具发票请登录PC端进行申请

   平台协调中心        【在线客服】        免费申请共赢上传

权利声明

1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

注意事项

本文(C语言课程电子课件模板.ppt)为本站上传会员【仙人****88】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4009-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

C语言课程电子课件模板.ppt

1、单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,信息工程系计算机教研室,C,程 序 设 计,第10章:指针,重点及要求:,掌握指针的概念、定义、指针变量的引用,掌握地址与指针的关系,掌握指针与数组的关系。,掌握指针与函数的关系。,熟悉指针的运算,了解指向,void,类型的指针。,10.1 地址和指针的概念,一、指针概述:,1、,地址的概念与取地址运算,:,内存以字节编码,每个编码都是一个地址。我们原先学过的变量、数组、函数等都放在内存中,至于它们放在内存的什么地方,这都是机器的事,我们只要知道它们是以怎样的顺序放在内存中的,以便一一按顺序引用。我们怎

2、样知道机器将某种数据放在内存的什么地方呢?可用求地址运算符&,如:,int,a=3;,&a,就是变量在内存中的地址。,可以用,printf,(“%x n”,看出其地址。,注意,这个地址并不是始终不变的,这是由机器和操作系统来安排的,我们无法预先知道。,则,a,表示的地址和&,a 0,的地址相同。,但&不能施加在常数、常量或表达式上,也不能施加在寄存器变量上(因为寄存器变量在,cpu,中,不在内存中)。,二、指针变量:既然存储在内存中的各种变量都有一个地址,我们能否这样设想:定义某种变量,让这个变量的值始终等于某个变量的地址,如同某个房间号、门牌号一样?回答是肯定的。我们把,这种存放某种变量地址

3、的变量称为指针变量。,10,35,.,a,b,2010,2012,p,2010,q,2012,因此,在,C,语言中,将地址形象化地称为,指针,10.2 变量的指针和指向变量的指针变量,说明,(系统对变量的访问形式分为两种),一个变量的访问(访问是指取出其值或向它赋值)方式有两种:,(1)直接访问,通过变量名访问,如通过变量名,i,直接访问。,(2)间接访问,通过该变量的指针来访问,如通过,指针,p,访问变量,i。,10.2.1 定义指针变量:,存储类型 数据类型,*,指针变量名1,*指针变量名2,;,如:,int,*p,a=3;,int,*q,b=5;,基类型,即该指针变量所指向的变量的类型,

4、如何使一个指针变量指向另外一个变量呢?,P=,q=,.,5,3,a,b,2010,2012,p,2010,q,2012,为什么要为指针变量定义类型:,由于不同的数据有不同的数据类型,如,char,仅占一个字节、,int,占两个字节、,float,型占三个字节,而内存又是以字节为单位进行地址编号,因而对,char,型,只要地址数加减1,取出里面的数据就是,char,型的完整数据。对,int,型就不同了,要取出其中的数据需2字节,就不能对地址进行简单的加减1了。怎样取出一个完整的,int,型数据或,float,型数据呢?如果能够将指针变量也定义为具有同样的数据类型,那么对指针进行加1或减1运算,就

5、是让指针移动相应基类型对应的字节数。,指针变量赋值(这里要用到取地址运算符“&”),指针变量的赋值:例、,pointer_1=,pointer_2=,注意,,指针变量中只能存放地址,不能将一个非地址类型的数据(如常数等)赋给一个指针变量,如:,pointer_1=100;,3.14,2.12,p,P+1,4,byte,p,P+1,P+2,P+3,1,2,3,4,2,byte,也可以在定义指针变量的同时指定其初值,如、,int,a;,int,*p=,10.2.2 指针变量的引用,1、取地址运算:如:,int,*p,i=3,j=5;,p=/*,让,p,其指向 变量,i */,2、,对指针变量施加,

6、运算,则代表取指针所指向的单元的内容。,这里,*,p,与变量,i,是等价的。,区分:*运算符在不同场合的作用,编译器能够根据上下文环境判别*的作用。,int,a,b,c;,int,*p;(*,表示定义指针),p=,*p=100;(*,表示指针运算符),c=a*b;(*,表示乘法运算符),printf,(“%d n”,*p);p=,printf,(“%d n”,*p);,但不能,int,*p;char c=A;p=(,类型不匹配),区分*运算符的以下用法:,int,a;,int,*p=/*,定义指针变量时指定初值,是为,p,指定初值*/,*,p=100;/*,给指针,p,所指向的变量赋值,这

7、里是给变量,a,赋值*/,例,l0_1.c,main(),int,*p1,*p2,a1,a2;,scanf,(“%d%d”,printf,(“%d,%d n”,*,p1,*,p2);p2=p1;,printf,(“%d,%d n”,*,p1,*,p2);,这里有一个运算符,*,,其作用是:加在指针变量的前面,取出该指针变量所指对象的内容。,例,l0_2.c,使两个指针变量交换指向。,main(),int,*p1,*p2,*p,a1=10,a2=20;p1=,printf,(“%d,%d n”,*p1,*p2);p=p1;p1=p2;p2=p;,printf,(“%d,%d n”,*p1,*p2

8、);,交换前,下面表示,p1,和,p1,交换所指内容,3,5,a1,a2,P1&a1,P2&a2,3,5,a1,*p2,a2,*p1,交换后,P1&a2,P2&a1,5,3,a1,*p1,a2,*p2,交换后,P1&a1,P2&a2,3,5,a1,*p1,a2,*p2,交换前,P1&a1,P2&a2,a=*p1;*p1=*p2;*p2=p,P=p1;p1=p2;p2=p,例,l0_3.c,交换两个指针变量所指向的变量的值。,main(),int,*p1,*p2,a1,a2,a;,a1=10;,a2=20;,p1=,p2=,a=*p1;*p1=*p2;*p2=a;,printf,(“a1=%d,

9、a2=%d n”,a1,a2);,10.3 指针与数组,10.3.1 指向数组元素的指针,复习:一维数组在内存中的存放方法?,A0,A1,A2,A3,A4,P=a,p=a+1,P=a+2,P=a+3,P=a+4,例,10_4.cmain(),int,a 5=1,3,5,7,9,*p;for(i=0;i5;i+),printf,(“%d”,*(a+i);,Printf,(“n”);/*,地址法*/,for(p=a;pa+5;p+),printf,(“%d”,*p);/*,指针法*/,如何用一个指针变量将数组中的元素取出并显示出来?,当,p=a,后,有:,p=a=&a 0 *p=*(a+0)=a

10、0,p+1=a+1=&a 1 *(p+1)=*(a+1)=a 1,这里*(,p+1),若写成*,p+1,就不行了,*,p+1,的内容是2。,复习:,1.,指针变量作为函数的参数(,p138,例题),函数的参数不仅可以是整型、实型等基本数据类型,还可以是指针类型。它的作用是把地址传给被调函数。,注意,:,被调用函数不能改变实参指针变量的值,但可以改变实参指针变量所指向的变量的值。,几种常见的错误,(,p139),(1)(2)(3),引用一个数组元素,可以用两种方法:,下标法:通过数组元素序号来访问数组元素,用,ai,形式来表示;,指针法:通过数组元素的地址访问数组元素,用*(,p+i),或*(,

11、a+i),的形式来表示。,例10_.5 输出数组的全部元素。(设10个元素,整型)。,访问各元素有三种方法:,1、下标法(常用,很直观),main(),int,a10;,int,i;,for(i=0;i10;i+),scanf,(%d,printf,(n);,for(i=0;i10;i+),printf,(%d,ai,);,2、用数组名计算数组元素的地址。(效率与下标法相同,不常用),main(),int,a10;,int,i;,for(i=0;i10;i+),scanf,(%d,printf,(n);,for(i=0;i10;i+),printf,(%d,*(a+i),);,3、用指针访问各

12、元素。(常用,效率高),main(),int,a10;,int,*p,i;,for(i=0;i10;i+),scanf,(%d,printf,(n);,for(p=a;p(a+10);p+),/*p+,使,p,指向下一个元素*/,printf,(%d,*p,);,使用指针指向数组,应注意以下问题:,1、若指针,p,指向数组,a,,虽然,p+i,与,a+i、*(p+i),与*(,a+i),意义相同,但仍应注意,p,与,a,的区别(,a,代表数组的首地址,是不变的;,p,是一个指针变量,可以指向数组中的任何元素),例、,for(p=a;a(p+10);a+)a,代表数组的首地址,是不变的,a+,不

13、合法,printf,(%d,*a),2、,指针变量可以指向数组中的任何元素,注意指针变量的当前值。,例10_6 输出数组,a,的10个元素。,程序:,main(),int,*p,i,a10;,p=a;,for(i=0;i10;i+),scanf,(%d,p+);,printf,(n);,for(i=0;i10;i+,p+,)(p,的值不对),printf,(%d,*p);,main(),int,*p,i,a10;,p=a;,for(i=0;i10;i+),scanf,(%d,p+);,printf,(n);,p=a;,for(i=0;i10;i+,p+,),printf,(%d,*p);,此程

14、序正确,3、使用指针时,应特别注意避免指针访问越界。在上例中,第二次,for,循环,,p,已经越过数组的范围,但编译器不能发现该问题。避免指针访问越界是程序员自己的责任。,4、指针使用的几个细节。,设指针,p,指向数组,a(p=a),,则:,p+(,或,p+=1),p,指向下一个元素。,*,p+,,相当于*(,p+)。,因为,*和+同优先级,+是右结合运算符。,*(,p+),与*(+,p),的作用不同。,*(,p+):,先取*,p,,再使,p,加1。,*(+,p):,先使,p,加1,再取*,p。,(*,p)+,表示,,p,指向的元素值加1。,如果,p,当前指向数组,a,的第,i,个元素,则:,

15、p-),相当于,ai-,,先取*,p,,再使,p,减1。,*(+,p),相当于,a+i,,先使,p,加1,再取*,p。,*(-p),相当于,a-i,,先使,p,减1,再取*,p。,10.3.3 数组名作函数参数,数组名代表数组首地址,因此,它作实参在函数调用时,是把数组首地址传送给形参。这样,实参数组和形参数组共占同一段内存区域。从而在函数调用后,实参数组的元素值可能会发生变化。,例10_7 将数组,a,中,n,个元素按相反顺序存放。,算法:,a0,与,an-1,交换,,a1,与,an-2,交换,.,,a(n-1)/2,与,an-,int,(n-1)/2),交换。,实现:用,i,j,作元

16、素位置变量,开始,i=0,j=n-1。,将,ai,与,aj,交换,然后,i,加1,,j,减1,直到,i=(n-1)/2。,程序:,Void inv(,int,x,int,n)/*,形参是数组*/,int,t,i,j,m=(n-1)/2;,for(i=0;i=m;i+),j=n-1-i;,t=ai;ai=aj;aj=t;,return,;/*,函数的返回值类型是,void,,不返回任何值*/,main(),static,int,i,a10=3,7,9,11,0,6,7,5,4,2;,printf,(the original array:n);,for(i=0;i10;i+),printf,(%d

17、ai);,printf,(n);,inv(a,10);,printf,(the array has been inverted:n);,for(i=0;i10;i+),printf,(%d,ai);,printf,(n);,函数,inv(),可以用指针作形参,运行情况与用数组作形参相同。,void inv(,int,*x,int,n),int,*p,t,*i,*j,m=(n-1)/2;,i=x;/*,指针,i,指向数组第一个元素*/,j=x+n-1;/*,指针,j,指向数组最后一个元素*/,p=x+m;/*,指针,p,指向数组中间一个元素*/,for(;i=p;i+,j-),t=*i;*i=

18、j;*j=t;,小结:数组作函数的参数,,实参和形参之间传送数组的首地址,,首地址可以用指针表示,也可以用数组名表示。,10.3.4 指向多维,数组的指针和指针变量,若再定义,int,*p;,p=,这时,p+1=?&a 0 1 p+3=?&a 1 0 p+6=&a 2 0,A0,表示第0行.,Ai,表示第,i,行因此,a0,代表第0行的首地址,它与&,a00,等价。,A00,A01,A02,A10,A11,A12,A20,A21,A22,P=&A00,P+1,P+2,:,P+i,:,P+8,二维数组的指针表示法,复习二维数组在内存中的表示法?,main(),int,a 3 3=1,2,3,4

19、5,6,7,8,9;,int,*p;,for(p=a0;pa0+10;p+),printf,(“%d”,*p);,printf,(“n ”);,从中可看出,这样用,p,指针表示二维数组很不直观,指向时不知指在哪一行、哪一列。如果我们这样来理解二维数组,把二维数组看作是由若干行向量(一维数组)组成的:如下图所示:,A0 1 2 3,A1 4 5 6,A2 7 8 9,P,P+1,P+2,每一行的,元素个数,定义:,存储类型 数据类型(*指针变量 名)元素个数例如:,int,a34;,int,(*p)4;p=a0;,所以,我们可以定义一种指向行向量的指针,让它指向二维数组的第一行,该指针加1,就

20、指向二维数组的下一行,这样的指针就叫做,行指针。,通过上一节的讨论,我们可以得出两点接结论:,1、在,C,语言中,一维数组名代表了该数组的起始地址,或者说,它是一个指向所代表数组,即指向其起始单元的指针。,2、在,C,语言中,一维数组的任何一个元素的地址,都可以用其数组名加上一个偏移量来表示,这个位移量的单位不是字节,而是数组元素的大小。,这两点可以推广到二维 乃至多维数组。,二维数组,amn,可以看做是由,m,个一维数组,a0、a1、am-1,组成。由此我们可以推导,用指向一维数组的指针(行指针)来表示二维数组元素:,A00,A01,A02,A10,A11,Ai0,Aij,A22,A0,P,

21、P+1,P+i,行向量地址,*(,p+0)+0,*(p+0)+1,*(p+0)+2,*(p+1)+0,*(p+1)+1,.,*(p+i)+0,*(p+i)+j,*(p+2)+2,元素地址,*(*(,p+0)+0),*(*(p+0)+1),*(*(p+0)+2),*(*(p+1)+0),*(*(p+1)+1),.,*(*(p+i)+0),*(*(p+i)+j),*(*(p+2)+2),元素值,*,p0,*(p0+1),*(p0+2),*(p1),*(p1+1),*pi,*(pi+j),*(p2+2),p,例,10,_8.cmain(),int,a 3 5=1,2,3,4,5,6,7,8,9,10

22、11,12,13,14,15;,int,j,k,(*p)5;p=a;for(j=0;j3;j+)for(k=0;k5;k+),printf,(“%d”,*(*(p+j)+k);,printf,(“n”);,P,实际上是一个二级指针,必须对它施加两次*运算,才能得到相应的数组元素值。,10,.4,字符串的指针,10.4.1 字符串的表现形式,C,语言中,有两种方式可以实现字符串:字符数组、字符指针。,例10_16,main(),char string=“I love China!”,Printf,(“%sn”,string);,例10_17,main(),char*string=“I love

23、 China!”,Printf,(“%sn”,string);,以上两程序输出结果均为:,I love China!,从以上两个例子中,可以看到:,1、字符数组和字符指针的概念不同。,2、字符指针指向字符串,而,C,语言中,字符串按数组方式处理,因此,字符数组和字符指针的访问方式相同。例如,均可以使用%,s,格式控制符进行整体输入输出。但应注意,如果不是字符数组,而是整型、实型等数字型数组,不能用%,s,,只能逐个元素处理。,例10.18 将字符串,a,复制到字符串,b。,main(),char a=I am a boy.“;,char b20;,int,i;,for(i=0;*(a+i)!=

24、0;i+),*(b+i)=*(a+i);,*(b+i)=0;,printf,(string a is:%sn,a);,printf,(string b is:%sn,b);,for(i=0;bi!=0;i+),printf,(%c,bi);,printf,(n);,例10.19 将字符串,a,复制到字符串,b。(,用指针处理),main(),char a=I am a boy.,b20,*p1,*p2;,int,i;,p1=a;p2=b;,for(;*p1!=0;p1+,p2+),*,p2=*p1;,*p2=0;,printf,(string a is:%sn,a);,printf,(stri

25、ng b is:%sn,b);,for(i=0;bi!=0;i+),printf,(%c,bi);,printf,(n);,10.4.2 字符串指针作函数参数,将一个字符串从一个函数传递到另一个函数,可以使用传地址的方式,即用字符数组名或字符指针变量作参数。有以下四种情况:,实参 形参,数组名 数组名,数组名 字符指针变量,字符指针变量 字符指针变量,字符指针变量 数组名,例10.20 用函数调用实现字符串的复制。,(1)用字符数组作参数。,Void copy_string(char from,char to),int,i=0;,while(fromi!=0),toi=fromi;i+;,to

26、i=0;,main(),char a=I am a teacher.;,char b=you are a student.;,printf,(string_a=%sn string_b=%sn,a,b);,copy_string(a,b);,printf,(string_a=%sn string_b=%sn,a,b);,main(),函数可以改写为(使用字符指针):,main(),char*a=I am a teacher.;,char*b=you are a student.;,printf,(string_a=%sn string_b=%sn,a,b);,copy_string(a,b);

27、printf,(string_a=%sn string_b=%sn,a,b);,(2)形参用字符指针,。,Void copy_string(char*from,char*to),for(;*form!=0;from+,to+),*to=*from;,*to=0;,main(),char*a=I am a teacher.;,char*b=you are a student.;,printf,(string_a=%sn string_b=%sn,a,b);,copy_string(a,b);,printf,(string_a=%sn string_b=%sn,a,b);,10.4.3 字符串指

28、针变量与字符数组的区别,字符数组,字符指针变量,由若干元素组成,每个元素中放一个字符。,存放字符串的首地址。,static char,str,=I love China!;,char*a=I love China!;,char,str,14;,char*a;,str,=I love China!,a=I love China!;,字符数组一个元素占一字节内存,且在编译时分配,。,指针变量中只可以放一个地址值(近指针=2字节,远指针=4 字节)。且编译时未指定,char,str,10;,char*a;,scanf,(“%s”,str,);,scanf,(“%s”,a);,尚未指向任何变量,字符数

29、组名是地址常量,指针变量可以进行、等运算,不允许进行、等运算,指针的变量的值允许改变,书上例题(,p154,155),10.5 指向函数的指针变量,10,.,5,.,1,使用函数指针调用函数。,指向函数的指针变量,函数的指针:函数的入口地址(函数的首地址)。,C,语言规定函数的首地址就是函数名,所以函数名就是函数的指针。,指向函数的指针变量:存放函数入口地址(函数指针)的变量,称为指向函数的指针变量。简称函数的指针变量。,函数可以通过函数名调用,也可以通过函数指针调用。,通过函数指针实现函数调用的步骤:,1、,指向函数的指针变量的定义,:,类型(*函数指针变量名)();,例如,int,(*p)

30、);,注意,:两组括号()都不能少。,int,表示被指向的函数的类型,即被指向的函数的返回值的类型。,2、指向函数的指针变量的赋值,指向某个函数:函数指针变量名=函数名;,3、利用指向函数的指针变量调用函数:,(*函数指针变量名)(实参表),例10_21:输入10个数,求其中的最大值。,P155.,/*,使用函数名调用函数*/,main(),int,i,m,a10;,for(i=0;i10;i+),scanf,(%d,m=max(a);/*,函数调用格式:函数名(实参表)*/,printf,(max=%dn,m);,int,max(,int,*p)/*max,在10个整数中选择最大值*/,i

31、nt,i,t=*p;,for(i=1;it)t=*(p+i);,return t;,结果:,-52 87 29 79-32 94 23-112 46 67,max=94,声明函数,/*使用函数指针变量调用函数*/,main(),int,i,m,a10,max(,int,*);/*declare,func,*/,int,(*pf)();/*define,func,pointer*/,for(i=0;imax()*/,m=(*pf)(a);/*call max*/,printf,(max=%dn,m);,声明函数,指针的定义:,定义函数指针变量,pf,(,返回整型数),指针的初始化:,函数指针,p

32、f,指向,max,指针的引用:,调用函数指针,pf,指向的函数,max,int,max(,int,*p),int,i,t=*p;,for(i=1;it)t=*(p+i);,return t;,说明:,(1)定义函数指针变量时,两组括号()都不能少。如果少了前面的一组括号=返回值类型*函数名();-返回值为地址值(指针)的函数。,(2)函数指针变量的类型是被指向的函数的类型,即返回值类型。,(3)函数指针的赋值,只要给出函数名,不必给出参数。(不要给出实参或形参)。,(4)用指针变量调用函数时,(*函数指针)代替函数名。参数表与使用函数名调用函数一样。,(5)可以看出,定义的函数指针变量可以用于

33、一类函数,只要这些函数返回值类型(函数类型)相同。,函数可以通过函数名调用,也可以通过函数指针调用。函数指针常常用在函数需要作为函数参数的情况。,10.5.2 用指向函数的指针作为函数的参数(常用于编制“通用”的函数),函数的参数除了可以是变量、指向变量的指针,数组(实际是指向数组的指针)、指向数组的指针以外,还可以是函数的指针。,函数的指针可以作为函数参数,在函数调用时可以将某个函数的首地址传递给被调用的函数,使这个被传递的函数在被调用的函数中调用,(看上去好象是将函数传递给一个函数)。函数指针的使用在有些情况下可以增加函数的通用性,特别是在可能调用的函数可变的情况下。,例10_22:编制一

34、个对两个整数,a,b,的通用处理函数,process,,要求根据调用,process,时指出的处理方法计算,a,b,两数中的大数、小数、和。,解:,int,max(,int,int,);,int,min(,int,int,);,int,add(,int,int,);,int,add1(,int,);,main(),int,a,b;,printf,(,“,enter two num to a,b:,”,);,scanf,(%d%d,声明3个处理函数(只需要形参类型),printf,(max=%dn,process(a,b,max);/*,调用通用处理函数*/,printf,(min=%dn,pr

35、ocess(a,b,min);,printf,(add=%dn,process(a,b,add);,printf,(add1=%dn,process(a,b,add1);,int,max(,int,x,int,y)return xy?x:y;/*,返回两数之中较大的数*/,int,min(,int,x,int,y)return xy)z=,return z;,结果:,enter two num to i,j:12 38,max=38,说明:,(1),main,函数从键盘获得两个整数,i,j(,本例12,38)。将,i,j,作为实参调用,fun。,(2),通过虚实结合,,fun,函数的形参,x,

36、y,获得了这两个整数(本例12,38),将大数的地址返回(本例是&,y)。,(3),返回的地址值赋值给,main,函数的指针变量,p,main,函数打印,p,指向的整型数,即,y,的值。,10.7 指针数组与指向指针的指针,10.7.1 指针数组,数组的指针:指向数组元素的指针。数组元素可以是一般数据类型,也可以是数组、结构体等数据类型。数组指针的定义与数组元素指针的定义相同。,指针数组:一个数组,如果其数组元素均为指针,那么此数组为指针数组。,一维指针数组的定义:类型名*数组名数组长度;,例如:,int,*p4;,定义一个4个元素的数组,p,,其中每个元素是一个整型指针,也即数组,p,是一个

37、4元素整型指针数组。,又如:,char*p4;,定义一个4个元素的字符指针数组,p,,其中每个数组元素是一个字符指针,可以指向一个字符串。也就是说利用此字符指针数组可以指向4个字符串。,指针数组用得最多的是“字符型指针数组”,利用字符指针数组可以指向多个长度不等的字符串,使字符串处理更加方便、灵活,节省内存空间。,Name,使用二维字符数组存储多个字符串(上图),指针数组,name,字符串,C,P,r,o,g,r,a,m,0,B,A,S,I,C,0,C,o,m,p,u,t,e,r,E,n,g,l,i,s,h,0,W,o,r,d,name0,name1,name2,name3,C Program

38、BASIC,Computer English,Word,使用字符型指针数组指向多个字符串,(上页下图),使用字符型指针数组指向多个字符串与使用两维字符数组存储多个字符串的比较:,(1)节省存储空间(二维数组要按最长的串开辟存储空间),(2)便于对多个字符串进行处理,节省处理时间。(使用指针数组排序各个串不必移动字符数据,只要改变指针指向的地址),说明:,(1),main(),中定义了指针数组,name,,它有4个元素,其初值分别是,C Program,BASIC,Computer English,Word,四个字符串常量的首地址。,(2),函数,sort,使用选择排序法对指针数组指向的字符串

39、进行排序(按字母顺序),在排序过程中不交换字符串本身,只交换指向字符串的指针(,nameknamei)。,(3)排序前后指针数组的指向参看教材,p161,图10-12,,p162,图10-13。,(4)利用字符指针数组进行字符串排序。,10.7.2,指针的指针,、指针的指针:指向指针变量的指针变量。指针的指针存放的是指针变量地址.,指针变量的指针变量(指针的指针)的定义:,类型 *指针变量名;,例如:,P2 p1 i,&,p1,&,i,2,int,i=2;/*,定义整型变量,i*/,int,*p1,*p2;/*,定义,p1,为整型指针,定义,p2,为整型指针的指针*/,p1=/*i,的地址=,

40、p1,,即,指针,p1,指向变量,i*/,p2=/*,指针,p1,的地址=,p2,,即,指针,p2,指向指针,p1*/,对变量,i,的访问可以是,i,*p1,又因为*,p2=p1,,即,*,p2=*p1,,所以对变量,i,的访问可以是,i,*p1,*p2。,2、,指针的指针与指针数组的关系,我们知道,数组的指针是指向数组元素的指针(整型、实型、字符型一维数组的指针分别是指向整型、实型、字符型指针,二维数组的指针是指向一维数组的指针);同理:,指针数组的指针,也是指向其数组元素的指针。指针数组的数组元素是指针,所以,指向指针数组的指针就是指针的指针,。也就是说,,可以使用“指针的指针”指向指针数

41、组,。,例10_24:指向指针的指针变量的应用,main(),char*name=C Program,BASIC,Computer English,Word;,char*p;,for(p=name;p,可执行程序名(命令名)参数表 (,操作系统命令行),(2)操作系统调用可执行程序时,将操作系统命令行中的“(程序)命令名”以及各个参数(字符串)作为,main(),函数的参数,传递给,main(),函数的,argc,argv,。,然后程序由,main(),函数开始运行程序。,例如:,DOS,的,xcopy,命令(外部命令)实际是一个程序。,其使用是格式是:,xcopy,c:,mycprg,*.c

42、 d:,mybak,/s,例10_25:编写一个命令文件,把键入的字符倒序打印出来。设文件名为,invert.c。,main(,int argc,char*,argv,),int,i;,for(i=,argc,-1;i=0;i-),printf,(%sn,argv,i);,E:10ainvert I love China,China,love,I,E:10AINVERT.EXE,10.8 指针运算小结,例10_26:编写函数,length(char*s),,函数返回指针,s,所指字符串的长度。,例10_27:已知存放在数组,a,中的数不相重复,在数组,a,中查找与值,x,相等的位置。若找到,输出该值和该值在数组,a,中的位置;若没有找到,输出相应的信息。,

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服