第7章间接访问指针ppt课件

上传人:鲁** 文档编号:567941807 上传时间:2024-07-22 格式:PPT 页数:109 大小:410KB
返回 下载 相关 举报
第7章间接访问指针ppt课件_第1页
第1页 / 共109页
第7章间接访问指针ppt课件_第2页
第2页 / 共109页
第7章间接访问指针ppt课件_第3页
第3页 / 共109页
第7章间接访问指针ppt课件_第4页
第4页 / 共109页
第7章间接访问指针ppt课件_第5页
第5页 / 共109页
点击查看更多>>
资源描述

《第7章间接访问指针ppt课件》由会员分享,可在线阅读,更多相关《第7章间接访问指针ppt课件(109页珍藏版)》请在金锄头文库上搜索。

1、程序设计 cs.sjtu 2011.9程序设计 - 1第第7章章 间接访问间接访问指针指针v指针的概念指针的概念v指针运算与数组指针运算与数组v动态内存分配动态内存分配v字符串再讨论字符串再讨论v指针作为函数参数和返回值指针作为函数参数和返回值v指针数组与多级指针指针数组与多级指针v指向多维数组的指针指向多维数组的指针v指向函数的指针指向函数的指针强神普毡虱铸卢唱芥趾很泄渡菌葵呀膝给喷振京线妇捧倒突咐他哪爽服秀第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 2指针介绍 本章将介绍本章将介绍C+C+语言的一个重要的特性:指针,为了语言的一个重要的特性:指针

2、,为了成为一个优秀的成为一个优秀的C+C+语言程序员,你必须掌握指针并语言程序员,你必须掌握指针并熟练地使用它们。熟练地使用它们。指针指针是内存的是内存的地址地址并可作为数据并可作为数据是一个灵活和危险的机制是一个灵活和危险的机制允许允许共享共享处理数据处理数据允许内存允许内存动态动态分配(只要需要,而非预先定义)分配(只要需要,而非预先定义)嫁盖寨瀑歇员循别油蝎冈词痉辣岔誓哗局串筑汰锚裂蹬金逛丰描崎贬团讫第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 3指针的概念指针的概念v指针就是把地址作为数据处理指针就是把地址作为数据处理v指针变量:存储地址的变量

3、指针变量:存储地址的变量v变量的指针:当一个变量存储另一个变量的变量的指针:当一个变量存储另一个变量的地址时,那我们说它就是那个变量的指针地址时,那我们说它就是那个变量的指针v使用指针的目的:提供间接访问使用指针的目的:提供间接访问烈隅翁玩捻括病梆矗汛曲坟融袄郴壕窍术饶润聪改黄嗽纬卿屏牢郊弹燎傻第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 4指针的概念指针的概念 续续续续v如在某一程序中定义了如在某一程序中定义了 int x = 2;v如系统给如系统给x分配的空间是分配的空间是1000号单号单元,则指向元,则指向x的指针是另一个变量的指针是另一个变量p

4、,p中存放的数据为中存放的数据为1000v1000号单元的内容有两种访问方号单元的内容有两种访问方式:式:访问变量访问变量x(直接访问)(直接访问)访问变量访问变量p指向的单元的内容(间接指向的单元的内容(间接访问)访问)1000 21000xp譬米将告历川挽即蕴酋逃胃潮评固菱隐殉荧篙逐稼估鸵佐裹戌蘑礁陌捧涅第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 5定义指针变量定义指针变量v定义指针变量要告诉编译器该变量中存放的是一定义指针变量要告诉编译器该变量中存放的是一个地址。个地址。v指针变量的主要用途是提供间接访问,因此也需指针变量的主要用途是提供间接访

5、问,因此也需要知道指针指向的单元的数据类型要知道指针指向的单元的数据类型v指针变量的定义指针变量的定义 类型标识符类型标识符 *指针变量;指针变量; 如:如:int int *intp;intp; double double *doublep;doublep; int *p, x, *q; int *p, x, *q;那圭撰柬葫则腐扮坤郊固营马肄去敞侥愁础乞热腆修喜圭脱糯胎努喊哼复第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 6指针变量的操作指针变量的操作v如何让指针指向某一变量?因为我们不知道系统分如何让指针指向某一变量?因为我们不知道系统分配给变量

6、的真正地址是什么。配给变量的真正地址是什么。用地址运算符用地址运算符 “&” 解决。如表达式解决。如表达式 “&x” 返回的是返回的是变量变量 x 的地址。如:的地址。如:intp = &x; ;& 运算符后面不能跟常量或表达式。如运算符后面不能跟常量或表达式。如 &2 是没有意义的,是没有意义的,&(m * n + p )。也是没有意义的。也是没有意义的v如何通过指针变量处理和改变它所指向的单元的值如何通过指针变量处理和改变它所指向的单元的值?用引用运算符用引用运算符 “*” 解决。如解决。如 *intp 表示的是表示的是 intp 指指向的这个单元的内容。如:向的这个单元的内容。如:*in

7、tp = 5 *intp = 5 等价于等价于 x = 5 x = 5在对在对 intp 使用引用运算之前,必须先对使用引用运算之前,必须先对 intp 赋值赋值茵硼渤扇梦熟汀活班礼甲怒圣稽团塞感包殆单纯宝碰加阉底沽院计贰赃霜第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 7指针实例指针实例如有:如有:int X, *intp, Y;X=3;Y=4;intp=&X;1000intp10044Y10003X如执行:如执行:*intp=Y+4;1000intp10044Y10008X注意:不能用注意:不能用 intp=100; intp=100;因为我们永远

8、不知道变量存储的因为我们永远不知道变量存储的 真实地址,而且真实地址,而且程序每次运行变量地址可能都不同。程序每次运行变量地址可能都不同。鱼嵌谆栓泼妄磐晴顽祷梗舔晴输维凳渗奉姬朴围斌萨惋惺喊湃荫奏啥牲缴第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 8指针使用指针使用v指针变量可以指向不同的变量。如上例中指针变量可以指向不同的变量。如上例中intp指向指向x,我们可以通过对,我们可以通过对intp的重新赋值改变指针的指向。的重新赋值改变指针的指向。如果想让如果想让intp指向指向y,只要执行,只要执行intp=&y就可以了。就可以了。这时,这时,intp

9、与与x无任何关系。无任何关系。v同类的指针同类的指针变量之间可相互赋值,表示二个指针指变量之间可相互赋值,表示二个指针指向同一内存空间。向同一内存空间。v空指针空指针指针没有指向任何空间指针没有指向任何空间空指针用常量空指针用常量NULLNULL表示,表示,NULLNULL的值一般赋为的值一般赋为0 0不能引用空指针指向的值不能引用空指针指向的值菇沮婚吝坟疟帮哼帮跃饮源部汹晾蚤唾山乾扭柏佐俞寻咙胳并坪慨披枕柜第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 9指针变量的使用指针变量的使用设有定义设有定义 int x, y; int *p1,*p2;1000

10、x1004y1008p11012p2执行语句:执行语句:x=23;y=234;1000 23x1004 234y1008p11012p2执行语句:执行语句:p1=&x;p2=&y;1000 23x1004 234y1008 1000p11012 1004p2执行语句:执行语句:*p1=34;p2=p1;1000 34x1004 234y1008 1000p11012 1000p2绥燎符初霍脊作寂眠短传体蹦陨亲吵粳涵菏滋咏谋探蝗询眉疏妥便宽鞭笺第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 10指针实例指针实例有以下结构有以下结构 Ap1aBp2b比较执行

11、比较执行 p1=p2和和 *p1= *p2后的不同结果。后的不同结果。 解:解: Ap1aBp2bBp1aBp2b汐则滩丹诉琼怯颁承壬畴刨酷秤舶露阻控狼梯笆三拂孜宿逃掺取墙拢池盅第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 11指针的初始化指针的初始化v指针在使用前必须初始化。指针在使用前必须初始化。v和别的变量一样,定义指针不初始化是一个比和别的变量一样,定义指针不初始化是一个比较普通的错误。较普通的错误。v没有初始化的指针可能指向任意地址,对这些没有初始化的指针可能指向任意地址,对这些指针作操作可能会导致程序错误。指针作操作可能会导致程序错误。vN

12、ULLNULL是一个特殊指针值,称为空指针。它的值是一个特殊指针值,称为空指针。它的值为为0 0。它可被用来初始化一个指针,表示不指。它可被用来初始化一个指针,表示不指向任何地址。向任何地址。v思考:思考:int *p; *p = 5; int *p; *p = 5; 有什么问题?有什么问题?嘎央度坚消擂吩劳特亚瞒珐纺蔼锗粕漏晤潮竞剑桐名肖誉枷椭步锋汝赖同第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 12第第7章章 间接访问间接访问指针指针v指针的概念指针的概念v指针运算与数组指针运算与数组v动态内存分配动态内存分配v字符串再讨论字符串再讨论v指针作为

13、函数参数和返回值指针作为函数参数和返回值v指针数组与多级指针指针数组与多级指针v指向多维数组的指针指向多维数组的指针v指向函数的指针指向函数的指针例藩钨恳怪踩珐榷讫郭睛琐疤闪浦椰悔诵香汉褥罕棉穿的干诅卫缓辰芝诌第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 13指针运算和数组指针运算和数组v指向数组元素的指针指向数组元素的指针数组元素是一个独立的变量,因此可以有指针数组元素是一个独立的变量,因此可以有指针指向它。如:指向它。如:p = &a1, p = &ai数组元素的地址是通过数组首地址计算的。如数组元素的地址是通过数组首地址计算的。如数组的首地址是数

14、组的首地址是 1000,则第,则第i 个元素的地址是个元素的地址是1000 + i * 每个数组元素所占的空间长度每个数组元素所占的空间长度铁抵开琉铁秸行烂皆覆臼迪蚜秆生荚沿略恼摔彰踏麓烹忆秩谚脊熊胎峪歌第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 14指针与数组指针与数组v在在C+C+中,指针和数组关系密切,几乎可以互中,指针和数组关系密切,几乎可以互换使用换使用v数组名可以看成是常量指针,对一维数组来说,数组名可以看成是常量指针,对一维数组来说,数组名是数组的起始地址,也就是第数组名是数组的起始地址,也就是第0 0个元素个元素的地址的地址v如执行了

15、如执行了p=arrayp=array,则,则p p与与arrayarray是等价的,对是等价的,对该指针可以进行任何有关数组下标的操作该指针可以进行任何有关数组下标的操作呻痰彬央驯过酮避星树尊台淮汪演怠碟窟目牺冶凄睦配签刮唤舞耻枕蝶殖第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 15例如:有定义例如:有定义 int a10, *p int a10, *p 并且执行了并且执行了 p=a p=a, 那么可用下列语句访问数组那么可用下列语句访问数组a a的元素的元素for ( i=0; i10; +i )for ( i=0; i10; +i ) cout p

16、i; cout pi; 狈殃棠迪蛇差激迄省荤肋宛奋球窥阴改珊描暗昼眼胡隶昌淡蚀厦宁权泄粹第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 16指针运算指针运算v指针指针+1表示数组中指针指向元素的下一元素表示数组中指针指向元素的下一元素地址;地址;v指针指针-1表示数组中指针指向元素的上一元素地表示数组中指针指向元素的上一元素地址;址;v合法的指针操作:合法的指针操作:p + k, p - k, p1 - p2指针保存的是一个地址,地址是一个整型数,因此可指针保存的是一个地址,地址是一个整型数,因此可以进行各种算术运算,但仅有加减运算是有意义的。以进行各种

17、算术运算,但仅有加减运算是有意义的。指针运算与数组有密切的关系指针运算与数组有密切的关系携腮考脉哀线蝎嵌芬掀绣埂呛涡恩棱僧歇较赎欧蒂垃魄滥雍裸莹再粳霹唯第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 17数组元素的指针表示数组元素的指针表示v当把数组名,如当把数组名,如 intarray,赋给了一个同类指针,赋给了一个同类指针intp 后,后,intarray 的元素可以通过的元素可以通过intp访问。第访问。第i个元素的地址可表示为个元素的地址可表示为 intp + i,第,第i个元素的值个元素的值可表示为可表示为 *(intp + i)。v通过指针访

18、问数组时,下标有效范围由程序员自通过指针访问数组时,下标有效范围由程序员自己检查。己检查。v如输出数组如输出数组 a 的十个元素的十个元素湿班晃俞尧抑擒翘塘搓爱郭哄锋翟关氓湛大傣么浪芽眉磅砍腰惭舀乐集啪第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 18方法方法3: for ( p=a; pa+10; +p ) cout *p ; 方法方法2: for ( i=0; i10; +i ) cout *(a+i); 方法方法1: for ( i=0; i10; +i ) cout ai; 方法方法4: for ( p=a, i=0; i10; +i ) co

19、ut *(p+i); 方法方法5: for ( p=a, i=0; i10; +i ) cout pi ; 下列程序段下列程序段 有无问题?有无问题? for ( i=0; i10; +i ) cout *a ; +a; 瞎吃斯金共柬完橱刽谭单涡灼拢略瓤湿首锅如圃洲史烯淄饺两跺淖坪锌酷第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 19指针和数组的区别指针和数组的区别v虽然通过指针可以访问数组,但两者本质是不同的。虽然通过指针可以访问数组,但两者本质是不同的。v在定义数组时为数组的各个元素分配了全部的存储区,在定义数组时为数组的各个元素分配了全部的存储区

20、,而在定义指针时,仅仅分配四个字节的存储区存放指而在定义指针时,仅仅分配四个字节的存储区存放指针地址。只有把一个数组名付给了对应的指针后,指针地址。只有把一个数组名付给了对应的指针后,指针才能当作数组使用针才能当作数组使用v如有:如有:int array5, *intp;int array5, *intp;arrayintp当执行了当执行了 intp = array intp = array后后屈弟葱司稽素唱宴陕柄覆勇赠策坷斩痘测嘲姿孝堤茸汕挽伤皇缕畴贪粒争第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 20第第7章章 间接访问间接访问指针指针v指针的概

21、念指针的概念v指针运算与数组指针运算与数组v动态内存分配动态内存分配v字符串再讨论字符串再讨论v指针作为函数参数和返回值指针作为函数参数和返回值v指针数组与多级指针指针数组与多级指针v指向多维数组的指针指向多维数组的指针v指向函数的指针指向函数的指针碧领杯释恐荡比屠贿灾滔帚羞冉骂彪吵怜叼沮蛋层脊具泵议疵褂腻茁怕霸第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 21动态分配动态分配v在在C+C+语言中,每个程序需要用到几个变量,语言中,每个程序需要用到几个变量,在写程序前就应该知道。每个数组有几个元素在写程序前就应该知道。每个数组有几个元素也必须在写程序时

22、就决定。也必须在写程序时就决定。v有时我们并不知道我们需要多大的数组元素直有时我们并不知道我们需要多大的数组元素直到程序开始运行。因此希望能在程序中根据某到程序开始运行。因此希望能在程序中根据某一个当前运行值来决定数组的大小。如设计一一个当前运行值来决定数组的大小。如设计一个打印魔阵的程序,我们希望先输入魔阵的阶个打印魔阵的程序,我们希望先输入魔阵的阶数,然后根据阶数定义一个矩阵数,然后根据阶数定义一个矩阵帕瘩渍诽唤涝栏涝贱酣止虽嘱嗜瑶畴狄氟敌怂镀蚂这垂绞沧厨枪势莹贞冉第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 22动态分配方法动态分配方法v这些问题

23、的解决方案就是内存的动态分这些问题的解决方案就是内存的动态分配。我们定义一个指针,并让它指向一配。我们定义一个指针,并让它指向一个合适的内存。如:个合适的内存。如: int *scores; int *scores; scores = scores = 内存的起始地址;内存的起始地址;港眶彩理喉哉向喂掀称招檀征绘荣呐习强欢敷备蓟阿蚂奢挥舜夸圆之哆膏第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 23动态内存分配与回收动态内存分配与回收v中由中由new new 和和 delete delete两个运算符替代两个运算符替代- - 运算符运算符newnew用于

24、进行内存分配:用于进行内存分配: 申请动态变量:申请动态变量:p = new type;p = new type; 申请动态数组:申请动态数组:p = new typesize;p = new typesize; 申请动态变量并初始化:申请动态变量并初始化:p = new type(p = new type(初值初值) ); - - 运算符运算符delete delete 释放释放 new new分配的内存:分配的内存: 释放动态变量:释放动态变量:delete p;delete p; 释放动态数组:释放动态数组:delete p;delete p;灰污皇终复距溉拂廖贷键俗向阔亥堂避淄桂某隋轿

25、砚南挨锑品究胁亚瘪化第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 24动态内存分配与回收动态内存分配与回收/为简单变量动态分配内存,并作初始化为简单变量动态分配内存,并作初始化int main()int main() int *p; int *p; p = new int(99); p = new int(99); / /动态分配内存,并将动态分配内存,并将9999作为初始化值赋给它作为初始化值赋给它 cout *p; cout *p; delete p; delete p; return 0; return 0; 摸芍玲寿嘱蛔傻桐决捶饯徐哼师蔼讹敛嘴

26、铲簿惊剔株粟伶铂庭惺奉奸摆球第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 25动态内存分配与回收动态内存分配与回收/动态字符串的使用动态字符串的使用int main()int *p; char *q; p = new int(5); q = new char10; strcpy(q, abcde); cout *p endl; cout q endl; delete p; delete q; return 0;输出结果:输出结果:5abcde嗡邓铬比谊臃蒋盐爪群堡撑吭史苫肩酿匝啥坑誊蝴吨搐组销捉袖捐尺闺献第7章间接访问指针ppt课件程序设计程序设计 c

27、s.sjtu 2011.9程序设计 - 26动态分配的检查动态分配的检查vnew操作的结果是申请到的空间的地址操作的结果是申请到的空间的地址v当系统空间用完时,当系统空间用完时,new操作可能失败操作可能失败vnew操作失败时,返回空指针操作失败时,返回空指针矛臀箍宴狮魄犀疙邻侯寐尾辈掉跺击亦忙衍限芝祸纹崭殴杠披喘驹力符区第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 27动态内存分配与回收动态内存分配与回收/动态分配检查动态分配检查int main()int main()int *p;int *p; p = new int; p = new int;

28、if(!p) if(!p) cout allocation failuren; cout allocation failuren; return 1; return 1; *p = 20; cout *p; *p = 20; cout *p; delete p; return 0; delete p; return 0; 宪篇莎阻胸焉柴儡辊锦霓爵橇嘶峰隆铝淡佯扰蝗喧催蚕奠谢赦垃亨募骡醛第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 28assert宏宏 vassert()宏在标准头文件()宏在标准头文件cassert中中 vassert()有一个参数,表

29、示断言为真的表有一个参数,表示断言为真的表达式,预处理器产生测试该断言的代码。达式,预处理器产生测试该断言的代码。如果断言不是真,则在发出一个错误消如果断言不是真,则在发出一个错误消息后程序会终止。息后程序会终止。 答咒突衅机醛讶霄淮蹬猿块铡野伎兆绣押塘勿叭纵忱火于案诺辐鲁襄儡滁第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 29#include #include /包含包含assert宏的头文件宏的头文件using namespace std;int main() int *p; p = new int; assert (p != 0); /p等于等于

30、0,则退出程序,则退出程序 *p=20; cout *p; delete p; return 0;埃含切根两肯搞素挞恒监辟碰行扭撩剑圣舶耗捆懈厌嚏拇捌灸闪总漆蒜壳第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 30内存分配的进一步介绍内存分配的进一步介绍v静态分配:对全局变量和静态变量,编静态分配:对全局变量和静态变量,编译器为它们分配空间,这些空间在整个译器为它们分配空间,这些空间在整个程序运行期间都存在程序运行期间都存在v自动分配:函数内的局部变量空间是分自动分配:函数内的局部变量空间是分配在系统的栈工作区。当函数被调用时,配在系统的栈工作区。当函数

31、被调用时,空间被分配;当函数执行结束后,空间空间被分配;当函数执行结束后,空间被释放被释放v动态分配:在程序执行过程中需要新的动态分配:在程序执行过程中需要新的存储空间时,可用动态分配的方法向系存储空间时,可用动态分配的方法向系统申请新的空间,当不再使用时用显式统申请新的空间,当不再使用时用显式的方法还给系统。这部分空间是从被称的方法还给系统。这部分空间是从被称为堆的内存区域分配。为堆的内存区域分配。OSProgramHeap动态分配动态分配Stack自动分配自动分配Globe variables静态分配静态分配遥侗陛脑昔还谊悟乏卓埃做揪财侵算是快脑舔颂赏撑玫鱼能胎筐背绣乾植第7章间接访问指针

32、ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 31内存泄漏内存泄漏v动态变量是通过指针间接访问的。如果该指针被修改,这动态变量是通过指针间接访问的。如果该指针被修改,这个区域就被丢失了。堆管理器认为你在继续使用它们,但个区域就被丢失了。堆管理器认为你在继续使用它们,但你不知道它们在哪里,这称为内存泄露。你不知道它们在哪里,这称为内存泄露。v为了避免出现孤立的区域,应该明白地告诉堆管理器这些为了避免出现孤立的区域,应该明白地告诉堆管理器这些区域不再使用。可以采用区域不再使用。可以采用deletedelete操作,它释放由操作,它释放由newnew申请申请的内存。的内存。v

33、当释放了内存区域,堆管理器重新收回这些区域,而指针当释放了内存区域,堆管理器重新收回这些区域,而指针仍然指向堆区域,但不能再使用指针指向的这些区域。仍然指向堆区域,但不能再使用指针指向的这些区域。v要确保在程序中同一个区域释放一次。要确保在程序中同一个区域释放一次。v释放内存对一些程序不重要,但对有些程序很重要。如果释放内存对一些程序不重要,但对有些程序很重要。如果你的程序要运行很长时间,而且存在内存泄漏,这样程序你的程序要运行很长时间,而且存在内存泄漏,这样程序会耗尽所有内存,直至崩溃。会耗尽所有内存,直至崩溃。肛撬傈杰经收恳育扬敏播摆耙慰忘徽氖何希续掘蛔匡滦柬隅骚窗屈馏发幽第7章间接访问指

34、针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 32动态空间分配示例动态空间分配示例v输入一批数据,计算它们的和。数据个数在设输入一批数据,计算它们的和。数据个数在设计程序时尚无法确定。计程序时尚无法确定。v存储一批数据应该用数组,但存储一批数据应该用数组,但C+语言的数组语言的数组大小必须是固定的。该问题有两个解决方案:大小必须是固定的。该问题有两个解决方案:开设一个足够大的数组,每次运行时只使用一部开设一个足够大的数组,每次运行时只使用一部分。缺点:浪费空间分。缺点:浪费空间用动态内存分配根据输入的数据量申请一个动态用动态内存分配根据输入的数据量申请一个动态数组数组

35、要产浩讽敝糯稳共澈傍骋帐将皂区吐遵突闲滚扫苔坯堪透哮做豢汾券哪公第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 33#include using namespace std;int main() int *p, i, n, sum=0; cout An array will be created dynamically.nn ; cout n; if (!(p = new int n) exit(1); for (i=0; i pi; for(i=0; in; +i) sum += pi; delete p;cout Number of elements

36、: n endl; cout Sum of the elements: sum endl; return 0;可改为:可改为:p = new int n;assert( p != NULL);驯蛤所雷矮弧序忧替怖惦劲绕窗营栏亿该艘蚂训贼始木痰凌剪抓写杭逊索第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 34第第7章章 间接访问间接访问指针指针v指针的概念指针的概念v指针运算与数组指针运算与数组v动态内存分配动态内存分配v字符串再讨论字符串再讨论v指针作为函数参数和返回值指针作为函数参数和返回值v指针数组与多级指针指针数组与多级指针v指向多维数组的指针指向

37、多维数组的指针v指向函数的指针指向函数的指针胎冻室滩汗闽油揪与吝瘦整砂畔喊众宁汾悼什酶氓困读寅昆希害床莆状元第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 35字符串再讨论字符串再讨论v字符串的另一种表示是定义一个指向字符的字符串的另一种表示是定义一个指向字符的指针。然后直接将一个字符串常量或字符串指针。然后直接将一个字符串常量或字符串变量赋给它变量赋给它 v如如 char *String, ss =“abcdef”; String = “abcde”; String = ss;惑眶绘墩倒肚鄂浦俺山西邢铜您伪负脚鸵撕搏像砸茵猿绳藐勤灸蝉动付消第7章间接访

38、问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 36 String“abcde”ProgramOS数据段数据段或代码区或代码区栈栈堆堆String = “abcde”;的执行结的执行结果果字符串常量存储在一字符串常量存储在一个称为数据段的内存区个称为数据段的内存区域里域里 将存储字符串将存储字符串”abcdeabcde”的内存的首的内存的首地址赋给指针变量地址赋给指针变量StringString。 蝉宠叮渝狄聂凹婶咕奸巳虽泵藐傣诱铲蔓苇壁寸搔程捐汉增寓很该完奴鹊第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 37 String

39、 “abcdef0” ProgramOS数据段数据段栈栈堆堆String = ss的执行过程的执行过程将字符数组将字符数组ss的起的起始地址存入始地址存入String甥效羞穿恒戍宪茸颁酿坐圣署纹拦昌瞪垃山召殿沙嚼易童巷汝罐奸奎藻恕第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 38String = new char5;strcpy(String, “aaa”) String ProgramOS数据段数据段栈栈堆堆“aaa0”动态变量存储在堆工动态变量存储在堆工作区作区 将存储字符串将存储字符串”aaaaaa”的内存的首地址赋给指的内存的首地址赋给指针变量

40、针变量StringString。 梳辛赶浙析税剿汤妆晒枚柯烽畜狱巳弟胚判靖抚册厂简钵揍成纳凰渡甩徐第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 39用指针表示的字符串的操作用指针表示的字符串的操作v可以直接作为字符串操作函数的参数。但必须可以直接作为字符串操作函数的参数。但必须注意,如果该指针指向的是一个字符串常量时注意,如果该指针指向的是一个字符串常量时,则使用是受限的。如不能作为,则使用是受限的。如不能作为strcpy的第一的第一个参数个参数v由于在由于在C+中,数组名被解释成指向数组首地中,数组名被解释成指向数组首地址的指针。因此,字符串是用一个

41、指针变量表址的指针。因此,字符串是用一个指针变量表示,我们可以把此指针变量解释成数组的首地示,我们可以把此指针变量解释成数组的首地址,通过下标访问字符串中的字符。如址,通过下标访问字符串中的字符。如string3的值是的值是d。 富颁预形衅比垛涵蛮酗作戒船晶均漂汗蚂藏郑合葬开嘿罚宙狐蟹战顷舒刁第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 40用指针处理串用指针处理串v目的:编写一个记录串中单词的个数的目的:编写一个记录串中单词的个数的函数。函数。v关键技术:要传递一个字符串给函数关键技术:要传递一个字符串给函数阳钓竿掺祖菩厕舰诣涌钻约炼诣装疽荆倚章裤炸

42、瓮烤坊肿睁鸯浴醉漫染屿第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 41字符串作为函数的参数字符串作为函数的参数v字符串作为函数的参数和数组名作为参数传递字符串作为函数的参数和数组名作为参数传递一样,可以有两种方法一样,可以有两种方法作为字符数组传递作为字符数组传递作为指向字符的指针传递作为指向字符的指针传递v两种传递方式的本质是一样的,都是传递了字两种传递方式的本质是一样的,都是传递了字符串的首地址符串的首地址v字符串作为字符数组传递时不需要指定长度。字符串作为字符数组传递时不需要指定长度。因为字符串操作的结束是依据因为字符串操作的结束是依据0隶丹蓄

43、蚕勘旷采赢沧先菏嗽叼末耘窜氟绷懂茂纳培痢赵志眨磐掐抠喳稽渠第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 42#include Using namespace std;int word_cnt(const char *s) int cnt = 0; while (*s != 0) while (isspace(*s) +s; /跳过空白字符跳过空白字符if (*s != 0) +cnt;/找到一个单词找到一个单词 while (!isspace(*s) & *s != 0) +s; /跳过单词跳过单词 return cnt;统计字符串中单词数的函数茬态吭

44、遵窜灶浴船渣地哩充骏终寡乙延揉豁度饯怎棋趁藐部摇琵绳塘迫守第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 43第第7章章 间接访问间接访问指针指针v指针的概念指针的概念v指针运算与数组指针运算与数组v动态内存分配动态内存分配v字符串再讨论字符串再讨论v指针作为函数参数和返回值指针作为函数参数和返回值v指针数组与多级指针指针数组与多级指针v指向多维数组的指针指向多维数组的指针v指向函数的指针指向函数的指针吓茁朗雪秀骨洞哆仲程乱曙鬃苯稠吟纠窗豌证拯寞苇咽薛葵酱倒坍侩酪座第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 4

45、4指针作为函数参数和返回值指针作为函数参数和返回值v指针作为函数参数指针作为函数参数v数组名作为函数参数数组名作为函数参数v返回指针的函数返回指针的函数v引用和引用传递引用和引用传递v返回引用的函数返回引用的函数铱鳖楚怨丧奈耙瞅献盲留前葛沦及热忠簧场撅但交溯翰惨邦阐披腕确趴胀第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 45指针作为函数参数指针作为函数参数例:编一函数,交换二个参数值。例:编一函数,交换二个参数值。 void swap(int a, int b) int c; c=a; a=b; b=c; 希望通过调用希望通过调用swap(x, swa

46、p(x, y)y)交换变量交换变量x x和和y y的值的值新手可能会编出如下的函数:新手可能会编出如下的函数:因为因为C+C+采用的是值传递机制,函数中采用的是值传递机制,函数中a a、b b值的值的交换不会影响实际参数交换不会影响实际参数x x和和y y的值的值联奈罐伍馆涌平谜呛澎峨劲拙说揩豁否邑甸智头惹驳郎喀珊袭架拖敏终揩第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 46void swap(int *a, int *b) int c; c=*a; *a= *b; *b=c; 3 4xyab交换交换x x和和y y的值,可以调用的值,可以调用swap

47、(&x, &y)swap(&x, &y)用指针作为参数可以在函数中修改主调程序用指针作为参数可以在函数中修改主调程序的变量值,即实现变量传递。必须小心使用!的变量值,即实现变量传递。必须小心使用!正确的方法鲸垛刘令棘馋氟砧展芽拢堡哦臆户敛椅猖层滋深诌称陵沛帚挺煽鲍兜彪欧第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 47能解一元二次方程的函数能解一元二次方程的函数v目前为止我们了解到的函数只能有一个返目前为止我们了解到的函数只能有一个返回值,由回值,由return 语句返回。语句返回。v一个一元二次方程有二个解,如何让此函一个一元二次方程有二个解,如何让

48、此函数返回二个解。答案是采用指针作为函数数返回二个解。答案是采用指针作为函数的参数。的参数。v由调用程序准备好存放两个根的变量,将由调用程序准备好存放两个根的变量,将变量地址传给函数。在函数中将两个根的变量地址传给函数。在函数中将两个根的值分别放入这两个地址值分别放入这两个地址蓑层欲硕豪溯裁债惜骋村码彦怔砰琉讳状芥迂插疗峻亨盯咙挞殆拦野板诵第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 48函数原型函数原型v函数原型可设计为:函数原型可设计为: void SolveQuadratic(double a, double b, double c, doubl

49、e *px1, double *px2)v函数的调用函数的调用 SolveQuadratic(1.3, 4.5, 2.1, &x1, &x2) SolveQuadratic(a, b, c, &x1, &x2)v函数的参数有两类:输入参数和输出参数。一般,输入参函数的参数有两类:输入参数和输出参数。一般,输入参数用值传递,输出参数用指针传递。在参数表中,输入参数用值传递,输出参数用指针传递。在参数表中,输入参数放在前面,输出参数放在后面。数放在前面,输出参数放在后面。羽玖夸啸废屡互琉潞嫌酵倒趣楔愉抢冰难洒凰概洗沛拭选随债肚太土凿短第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2

50、011.9程序设计 - 49原型的改进原型的改进v并不是每个一元二次方程都有两个不同根,并不是每个一元二次方程都有两个不同根,有的可能有两个等根,有的可能没有根。函有的可能有两个等根,有的可能没有根。函数的调用者如何知道数的调用者如何知道x1和和x2中包含的是否是中包含的是否是有效的解?有效的解?v解决方案:让函数返回一个整型数。该整型解决方案:让函数返回一个整型数。该整型数表示解的情况数表示解的情况 原搅碰乖拙践锁恬渴候帮旷潍醒幅畔箍磺澜痒袭钨逊完矿痔陆哩蜕侨淬兢第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 50完整的函数完整的函数int Solve

51、Quadratic(double a,double b,double c, double *px1,double *px2) double disc, sqrtDisc; if(a = 0) return 3; /不是一元二次方程不是一元二次方程 disc = b * b - 4 * a * c; if( disc 0 ) return 2; /无根无根 if ( disc = 0 ) *px1 = -b /(2 * a); return 1; /等根等根 /两个不等根两个不等根 sqrtDisc = sqrt(disc); *px1 = (-b + sqrtDisc) / (2 * a);

52、*px2 = (-b - sqrtDisc) / (2 * a); return 0;巷塘删篓壤瞅畴惨荆到拽傍拥庶糖效襄玄排掸吏噎钢柞茎钵千插嘘氯晌匠第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 51函数的调用函数的调用int main() double a,b,c,x1,x2; int result; cout a b c; result = SolveQuadratic(a, b, c, &x1, &x2); switch (result) case 0: cout 方程有两个不同的根:方程有两个不同的根:x1 = x1 x2 = x2; brea

53、k; case 1: cout 方程有两个等根:方程有两个等根: x1; break; case 2: cout 方程无根方程无根; break; case 3: cout 不是一元二次方程不是一元二次方程; return 0; 蘑陈拽褒应萤隔叹镐揉炬勉狮锋凿砾胚瘸幂只抱费符镊帛给亦殃排琐庸舶第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 52指针作为函数参数和返回值指针作为函数参数和返回值v指针作为函数参数指针作为函数参数v数组名作为函数参数数组名作为函数参数v返回指针的函数返回指针的函数v引用和引用传递引用和引用传递v返回引用的函数返回引用的函数渗圃

54、阂阎卫杉泣你乒书南豺酗施芝筷埃庸傈试架队苍拐狱聚羌僧裔躺溢茹第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 53数组传递的进一步讨论数组传递的进一步讨论v数组传递的本质是地址传递,因此形参和实参可数组传递的本质是地址传递,因此形参和实参可以使用数组名,也可以使用指针。以使用数组名,也可以使用指针。数组传递是函数原型可写为:数组传递是函数原型可写为: type fun(type a, int size); 也可写为也可写为 type fun(type *p, int size); 但在函数内部,但在函数内部,a和和p都能当作数组使用都能当作数组使用调用时,

55、对这两种形式都可用数组名或指针作为实参调用时,对这两种形式都可用数组名或指针作为实参v建议:如果传递的是数组,用第一种形式;如果建议:如果传递的是数组,用第一种形式;如果传递的是普通的指针,用第二种形式传递的是普通的指针,用第二种形式震灰撤回拳留家谢全羹碎蜂挎夸沟俗蓖却恒螺书疤诣牙铀宴炮鞍收德炎脚第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 54#include using namespace std;void f(int arr, int k)cout sizeof(arr) sizeof(k) endl;void main() int a10=1,

56、2,3,4,5,6,7,8,9,0; cout sizeof(a) endl; f(a,10); 输出:输出:4C+将数组名作为参数传递处理成指针的传递将数组名作为参数传递处理成指针的传递即在即在mainmain中,中,a a是数是数组,占用了组,占用了4040个字个字节。而在函数节。而在函数f f中,中,arrarr是一个指针是一个指针硫茵召磅烧槛五役驭央盔比律沏偏烯鳞褒札阑流待哗厉艘陵驮紫焉肯奔揭第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 55数组传递的灵活性数组传递的灵活性void sort(int p , int n)void sort(in

57、t p , int n).main()main()int a100;int a100; . . sort(a, 100); / sort(a, 100); /排序整个数组排序整个数组 sort(a, 50); / sort(a, 50); /排序数组的前排序数组的前5050个元素个元素 sort(a+50, 50); / sort(a+50, 50); /排序数组的后排序数组的后5050个元素个元素 . . 味矛腆跳收就啸得拜挨盛爵上段泅巩亲功羌讽幸挡费岁唬闷壕溢于枚潭界第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 56实例实例v设计一函数用分治法在一

58、个整数数组中找出最大设计一函数用分治法在一个整数数组中找出最大和最小值和最小值v具体方法是:具体方法是:如果数组只有一个元素,则最大最小都是他。如果数组只有一个元素,则最大最小都是他。如果数组中只有两个元素,则大的一个就是最大数,如果数组中只有两个元素,则大的一个就是最大数,小的就是最小数。这种情况不需要递归。小的就是最小数。这种情况不需要递归。否则,将数组分成两半,递归找出前一半的最大最小否则,将数组分成两半,递归找出前一半的最大最小值和后一半的最大最小值。取两个最大值中的较大者值和后一半的最大最小值。取两个最大值中的较大者作为最大值,两个最小值中的较小值作为最小值。作为最大值,两个最小值中

59、的较小值作为最小值。 嫉苑楔五链府影爽夏分琉夜涛俘宵池放尹忍值鸿枝冲毅阅晾遍纪捷帕与胀第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 57设计考虑设计考虑v函数的参数是要查找的数组,传递一个数组要两个参函数的参数是要查找的数组,传递一个数组要两个参数:数组名和数组规模数:数组名和数组规模v函数返回的是数组中的最大值和最小值,将它们作为函数返回的是数组中的最大值和最小值,将它们作为指针传递的参数指针传递的参数v查找数组的前一半就是递归调用本函数,传给他的参查找数组的前一半就是递归调用本函数,传给他的参数是当前的数组名,数组的规模是原来的一半数是当前的数组名

60、,数组的规模是原来的一半v查找数组的后一半也是递归调用本函数,传给它的参查找数组的后一半也是递归调用本函数,传给它的参数是数组后一半的起始地址,规模也是原来的一半数是数组后一半的起始地址,规模也是原来的一半窜窒煎睦利监屿洱韧踩喷徘才牲折继盐胀蚊啦药渊螺怯掠蜕绦悦秤流骋漓第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 58伪代码伪代码void minmax ( int a , int n , int *min_ptr , int *max_ptr) switch (n) case 1: 最大最小都是最大最小都是a0; case 2: 大的得放入大的得放入*

61、max_ptr,小的放入,小的放入*min_ptr; Default: 对数组对数组a的前一半和后一般分别调用的前一半和后一般分别调用minmax; 取两个最大值中的较大者作为最大值;取两个最大值中的较大者作为最大值; 取两个最小值中的较小值作为最小值取两个最小值中的较小值作为最小值 神哑意父掺铺烟秩烯呐吁慰浦糠瘴沉霜临铣赎酵绢痔袍恰怠阿早匆鸭键甲第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 59void minmax ( int a , int n , int *min_ptr , int *max_ptr) int min1 , max1 , mi

62、n2 , max2; switch(n) case 1: *min_ptr = *max_ptr = a0; return; case 2: if (a0 a1 ) *min_ptr = a0; *max_ptr= a1; else *min_ptr = a1; *max_ptr= a0; return; default: minmax( a, n/2, &min1, &max1 ); minmax( a + n/2, n - n / 2, &min2, &max2 ); if (min1 min2) *min_ptr = min1; else *min_ptr = min2; if (max

63、1 max2) *max_ptr = max2; else *max_ptr = max1; return; 谐湘甭少冷睬砒精遍束鲸睫丰暮灸侣堕扮孰嵌恳墙中副朵河寄瑰噎帕崖工第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 60指针作为函数参数和返回值指针作为函数参数和返回值v指针作为函数参数指针作为函数参数v数组名作为函数参数数组名作为函数参数v返回指针的函数返回指针的函数v引用和引用传递引用和引用传递v返回引用的函数返回引用的函数光硅在粮飞祁茫酸吕摧殆彪偶釉狗浚辉埠禾涸弧爵星桂榴友官跃仕岗汪柞第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu

64、 2011.9程序设计 - 61返回指针的函数返回指针的函数v函数的返回值可以是一个指针函数的返回值可以是一个指针 v返回指针的函数原型:返回指针的函数原型: 类型类型 *函数名(形式参数表);函数名(形式参数表);v当函数的返回值是指针时,返回地址对应的变当函数的返回值是指针时,返回地址对应的变量不能是局部变量。量不能是局部变量。庇霹灼痢舱精钱篆菠磁掘镶涉褥馆信扒鸦医摇硫锣鬼脱莽柒馅遣物挤熊稳第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 62实例实例v设计一个函数从一个字符串中取出一个子串。设计一个函数从一个字符串中取出一个子串。 v原型设计:原型设

65、计:从哪一个字符串中取子串、起点和终点从哪一个字符串中取子串、起点和终点返回值:字符串可以用一个指向字符的指针表示,所返回值:字符串可以用一个指向字符的指针表示,所以函数的执行结果是一个字符串,表示一个字符串可以函数的执行结果是一个字符串,表示一个字符串可以用一个指向字符的指针以用一个指向字符的指针 v返回值指针指向的空间必须在返回后还存在。这返回值指针指向的空间必须在返回后还存在。这可以用动态字符数组可以用动态字符数组望潮烩虹丢窒廓马癌急超绕羞扭棕冯搐栈淘戈许泥湿无肯稿钾桔锯拒抖卧第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 63char *subS

66、tring(char *s, int start, int end)int len = strlen(s);if (start = len | end = len | start end) cout 起始或终止位置错起始或终止位置错 endl;return NULL;char *sub = new charend - start + 2; strncpy(sub, s + start, end - start +1);subend - start +1 = 0;return sub;辕磕侗刺佑竟萨弯域尚捞醚司寓纷戎颤蜗唐么胯验抚叭周图歉邓黍损憨航第7章间接访问指针ppt课件程序设计程序设计 c

67、s.sjtu 2011.9程序设计 - 64指针作为函数参数和返回值指针作为函数参数和返回值v指针作为函数参数指针作为函数参数v数组名作为函数参数数组名作为函数参数v返回指针的函数返回指针的函数v引用和引用传递引用和引用传递v返回引用的函数返回引用的函数噪港陡跋可摧蠕卉恍舱芽组芽佯梯旨糜胰遗轰雀辕迪喧匹歧变觅信橡腊捂第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 65引用传递引用传递v引用传递是地址传递的另一种更简单明引用传递是地址传递的另一种更简单明了的实现方法了的实现方法引用的概念引用的概念函数中的引用函数中的引用妙订殷析估罩李死抿贿炒洪哺任侨惶帽司

68、芥斥惠你霄俘烫皆营珊婆壁汉碱第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 66C+中的引用v引用的定义:给一个变量取一个别名引用的定义:给一个变量取一个别名, ,使一个内使一个内存单元可以通过不同的变量名来访问。存单元可以通过不同的变量名来访问。 例:例:int i;int i; int &j=i; int &j=i; j j是是i i的别名,的别名,i i与与j j是同一个内存单元。是同一个内存单元。vC+C+引入引用的主要目的是将引用作为函数的参引入引用的主要目的是将引用作为函数的参数。数。蓖车得卒呜克嗽桩曹檄茬颇徘旺涛立解式悬牙仑辖统牵吏跑貌徒凿

69、随丧不第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 67引用传递引用传递v引用传递是地址传递的另一种更简单明引用传递是地址传递的另一种更简单明了的实现方法了的实现方法引用的概念引用的概念函数中的引用函数中的引用睹础余僵鲜饰趾世雁彭侦漠彰廓哗躺盼得匙靛铺薛殴杰猜曾梅搅腰惨欢香第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 68引用参数引用参数vC+引入引用的主要目的是将引用作为引入引用的主要目的是将引用作为函数的参数。函数的参数。指针参数指针参数void swap(int *m, int *n) int temp;

70、 temp=*m; *m=*n; *n=temp;调用:调用:swap(&x, &y)引用参数引用参数void swap(int &m, int &n)int temp; temp=m; m=n; n=temp;调用:调用:swap( x, y)注意:实参必须是变量,而不能是一个表达式注意:实参必须是变量,而不能是一个表达式投治椿汗祈和咨柔遍兵烽占奠墨嫩吕尸冀拣年侈踞最九矫眯夫柠贿娇萎往第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 69v调用调用swap(x,y)时,相当于发生了变量定义时,相当于发生了变量定义 int &m = x int &n =

71、yv即,形式参数即,形式参数m和实际参数和实际参数x共享一块空共享一块空间,形式参数间,形式参数n和实际参数和实际参数y共享一块空间。共享一块空间。在在swap函数中交换了函数中交换了m和和n的值,就相当的值,就相当于交换了于交换了x和和y的值。的值。绝旭悼坎汗延栏己连萎碟奠嚷败牟苞陨讥惭海准锅饼匹涧虞控腥息洪肩栓第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 70指针作为函数参数和返回值指针作为函数参数和返回值v指针作为函数参数指针作为函数参数v数组名作为函数参数数组名作为函数参数v返回指针的函数返回指针的函数v引用和引用传递引用和引用传递v返回引用的

72、函数返回引用的函数后赛蘸个益额痰乌销皇幻强弱亥合谭砂十矩揣引陷笼讨管置露萧技兢氨赡第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 71返回引返回引用的函数的主要用途用的函数的主要用途v将函数用于赋值运算符的左边,即作为左值。将函数用于赋值运算符的左边,即作为左值。 int a = 1, 3, 5, 7, 9; int &index(int); /声明返回引用的函数声明返回引用的函数 void main() index(2) = 25; /将将a2重新赋值为重新赋值为25 cout index(2); int &index(int j) return aj

73、; /函数是函数是aj的一个引用的一个引用摈酚跑勾训墙蛆榆封熊睦掀筷穴龚侧厩刃媳摆胯欧晌济夸揖尽意奠惰习足第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 72第第7章章 间接访问间接访问指针指针v指针的概念指针的概念v指针运算与数组指针运算与数组v动态内存分配动态内存分配v字符串再讨论字符串再讨论v指针作为函数参数和返回值指针作为函数参数和返回值v指针数组与多级指针指针数组与多级指针v指向多维数组的指针指向多维数组的指针v指向函数的指针指向函数的指针饿直寂摇什圭显熙梦诵圭剂坯魁肮训想冲努薄茵杀潍迂惫唤猛那勤善膀着第7章间接访问指针ppt课件程序设计程序设

74、计 cs.sjtu 2011.9程序设计 - 73指针数组与多级指针指针数组与多级指针v指针数组指针数组vMain函数的参数函数的参数v多级指针多级指针劲帧拢韭拎膳喘鞘彪甄仔途秽调密住讯戌掉担喻翌熏继辈康崭令晦剃邮翼第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 74指针数组指针数组v地址本身也是数据,他们也可以像其他数据一地址本身也是数据,他们也可以像其他数据一样组织成一个数组样组织成一个数组 v一个数组,如果他的元素均为指针,则称为指一个数组,如果他的元素均为指针,则称为指针数组针数组 v一维指针数组的定义形式:一维指针数组的定义形式: 类型名类型名

75、 *数组名数组名数组长度数组长度;v例如,例如,char *String10; 定义了一个名为定义了一个名为String的指针数组,该数组有的指针数组,该数组有10个元素,数组个元素,数组的每个成员是一个指向字符的指针的每个成员是一个指向字符的指针 受膨硷画述学琐炉具咏洪藏玄孪读堤播荡鞘恫臃疲烂赌分赖耪契弃部快挚第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 75指针数组的应用指针数组的应用v字符串可以用一个指向字符的指针表示,字符串可以用一个指向字符的指针表示,一组字符串可以用一个指向字符的指针一组字符串可以用一个指向字符的指针数组来表示数组来表示v例

76、:写一个函数用二分法查找某一个城例:写一个函数用二分法查找某一个城市在城市表中是否出现。用递归实现市在城市表中是否出现。用递归实现v关键问题:关键问题:城市表的存储:用指向字符的指针数组城市表的存储:用指向字符的指针数组查找时的比较:用字符串比较函数查找时的比较:用字符串比较函数 闻败喂气你愧袱肥穴假征韵酶邵款些环孩狙洒拔田队搜污媒妹狂卵笛腮漆第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 76/该函数用二分查找在该函数用二分查找在cityTable中查找中查找cityName是否出现是否出现/lh和和rh表示查找范围,返回出现的位置表示查找范围,返回出

77、现的位置Int binarySearch(char *cityTable, int lh, int rh, char *cityName)int mid, result; if (lh 0) return binarySearch(cityTable, lh, mid-1, cityName); else return binarySearch(cityTable, mid+1, rh,cityName); return -1; /没有找到没有找到跃妄习晨缕鞘辅晋骗溢叫撒哑硼京鸡闸诊秀唾虐雪晰膳凡治踌脚填蹬煞彰第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计

78、- 77函数的应用函数的应用#include using namespace std;int binarySearch(char *cityTable, int lh, int rh, char *cityName);int main()char *string10 = aaa, bbb, ccc, ddd, eee, fff, ggg, hhh, iii,jjj; char tmp10; while (cin tmp) cout binarySearch(string, 0, 9, tmp) endl; return 0;秤牟断恶扛副恃掉委什殿汁擞谍屏谆柑椎绿灌豹筹前坛烁赏情购泼内景互第7章

79、间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 78“aaa”“bbb”“ccc”“ddd”“eee”“fff”“ggg”“hhh”“iii”“jjj”祸执啮良轧丹铜判续季绦淌逛狮折简肖凄秆碎辛曝瘸攀选鲜尹介费诅毫郊第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 79指针数组与多级指针指针数组与多级指针v指针数组指针数组vMain函数的参数函数的参数v多级指针多级指针撕光乞冀褂妹窄肖返胡羊帮岁冕鹏耐肮粤逐饮讼防谬薛所趣撑骂号半口蚊第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 80

80、main函数的形参函数的形参v如需要实现:如需要实现:copy a b之类的功能,可之类的功能,可以用带有参数的以用带有参数的main函数来实现函数来实现 vmain函数有二个形式参数:函数有二个形式参数: int argc, char *argv argc 参数的数目(包括命令名本身)参数的数目(包括命令名本身)argv 指向每个参数的指针,是一个指指向每个参数的指针,是一个指向字符串的指针数组向字符串的指针数组 阿踞雇怖郊豪蔬姐稚字何口楔匙穴迁填继犬卸踊遂惮第苯漾劝匆社盈课暮第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 81把参数传递给把参数传递给

81、main()#include int main(int argc, char *argv)int i;cout argc=“ argc endl;for(i=0; iargc; +i)cout argv“ i “=“ argvi endl;return 0;假设生成的执行文件myprogram.exe贪瑞紧踌乳听献箩胀乓管抡屉序哼哑稳滁募喊袱今卢艇怀各拯报苔翟驳霹第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 82把参数传递给把参数传递给main() 续续v假设生成的执行文件假设生成的执行文件myprogram.exev在命令行输入:在命令行输入:myp

82、rogram 输出结果:输出结果:argc=1 argv0=myprogramv在命令行输入:在命令行输入:myprogram try this 输出结果:输出结果:argc=3 argv0=myprogramargv1=try argv2=this站改孟盾改汲毁促茶千瘤蚂竣核朵待呐援月请白讨署溪忠媒商茫仪姿瑰挛第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 83main函数参数实例函数参数实例v编写一个求任意编写一个求任意n个正整数的平均数的个正整数的平均数的程序程序v如果该程序对应的可执行文件名为如果该程序对应的可执行文件名为aveg,则可以在命令行

83、中输入,则可以在命令行中输入 aveg 10 30 50 20 40 表示求表示求10、30、50、20和和40的平均值,的平均值,对应的输出为对应的输出为30。 焕琐他算缝彬孵涤汞幂轨兢郁恍精萍炊豢扼俐验达儡邀禾龚诡雇宗办顺晶第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 84设计考虑设计考虑v将这些数据作为命令行的参数将这些数据作为命令行的参数从从argc得到数据的个数得到数据的个数从从argv得到每一个数值,但注意数值是以字符串得到每一个数值,但注意数值是以字符串表示,要进行计算,必须把它转换成真正的数值表示,要进行计算,必须把它转换成真正的数值v

84、由于每个数据都要转换,而且这个工作很独立,由于每个数据都要转换,而且这个工作很独立,所以将它设计成一个函数所以将它设计成一个函数圭嘻阮久拖型艘裙笨刽椅布组叫亿架昆沁芋臼丑界伴纤辩温痔歌怂蛛抿沫第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 85字符串形式的数字转换到真正的字符串形式的数字转换到真正的数值数值int ConvertStringToInt(char *s) int num = 0; while(*s) num = num * 10 + *s - 0; +s; return num; 恫曹整勘蛛晓稻坏棒锚邀塌杨稚哉侄境琼摊魔控堪蚀扰剁呜科淮墨汐

85、柞浩第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 86计算程序计算程序int main(int argc, char *argv) int sum = 0; for (int i = 1; i argc; +i) sum += ConvertStringToInt(argvi); cout sum / (argc - 1) endl; return 0; 凶腮屯鸟救凸菩惠缸函夏腰悦假酒踩件僵青梳棍更剩绳询郧双人洼泵饿名第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 87指针数组与多级指针指针数组与多级指针v指针数

86、组指针数组vMain函数的参数函数的参数v多级指针多级指针浇罩冻惨兆泽凋剪叹蔚眠痛旷均苫趴凉擅厂衍撑毛告简疆署岛绵奇泛勋愚第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 88多级指针多级指针v指针指向的内容还是一个指针,称为多级指针指针指向的内容还是一个指针,称为多级指针 v如有定义:如有定义:char *string10; string是一个数组,数组元素可以通过指针来访是一个数组,数组元素可以通过指针来访问。如果问。如果p是指向数组是指向数组string的某一个元素,那的某一个元素,那么么p指向的内容是一个指向字符的指针,因此指向的内容是一个指向字符

87、的指针,因此p就是一个多级指针。就是一个多级指针。string也是一个多级指针,也是一个多级指针,不过是一个常指针不过是一个常指针弊留郭休卯氮粉宗窍认舌矾销狭又淆念槽磺扰健峻的鸣驮柿呐懊考醇堤西第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 89多级指针的定义多级指针的定义v两级指针:类型名两级指针:类型名 *变量名;变量名;v三级指针:类型名三级指针:类型名 *变量名;变量名;v如:如:int *q; 表示表示q指向的内容是一个指向整型的指针。可以这样指向的内容是一个指向整型的指针。可以这样使用:使用:int x=15, *p=&x; q = &p;v

88、同样:同样:char *s; 表示表示s指向的内容是一个指向字符的指针指向的内容是一个指向字符的指针qp15s“abcde”井锹颇静拥钝汲捌吗壤邮矛锈埂豢贵顾伞袭棵肺录古泊恒呀疑镑释膨盗釉第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 90多级指针的应用多级指针的应用v可以用指向指针的指针访问指针数组的元素。如可以用指向指针的指针访问指针数组的元素。如#include using namespace std;int main() char *city = aaa, bbb, ccc, ddd, eee; char *p; for (p=city; pci

89、ty+5; +p) cout *p endl; return 0; 输出结果:输出结果:aaabbbcccdddeee坠框脾染路登殖尤桑拓鸣表铃骄且格趋贱安使秤眼悔胀乾脯冉菠棺令思贴第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 91第第7章章 间接访问间接访问指针指针v指针的概念指针的概念v指针运算与数组指针运算与数组v动态内存分配动态内存分配v字符串再讨论字符串再讨论v指针作为函数参数和返回值指针作为函数参数和返回值v指针数组与多级指针指针数组与多级指针v指向多维数组的指针指向多维数组的指针v指向函数的指针指向函数的指针凹啸峪浪就鸣辞彭向屯哗菇押躺皖

90、庆絮渠絮寝涕苇鞋诊曹膘品慎毙汾庚淘第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 92二维数组与指针二维数组与指针int a34;等价于定义了等价于定义了3个变量个变量aa1a2a0123456789101112俞创幸绑花我将娩襟揩祥棺亨占厅铃泊宫板币劝奈毛蛆巴涣荣维劣汁卿肪第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 93指向一维数组的指针指向一维数组的指针va a 是一个指针数组,它的每个元素是一个整型指是一个指针数组,它的每个元素是一个整型指针,指向每一行的第一个元素。针,指向每一行的第一个元素。a a是一

91、个指向一维是一个指向一维数组的指针,指向数组的指针,指向a a 的第一个元素。对的第一个元素。对a a加加1 1,事,事实上是跳到下一行实上是跳到下一行 v指向一维数组的指针可以这样定义:指向一维数组的指针可以这样定义: 类型名类型名 (* *指针变量名)指针变量名) 一维数组的元素个数一维数组的元素个数 ;v注意:圆括号不能省略,如果省略了圆括号就变成注意:圆括号不能省略,如果省略了圆括号就变成了指针数组了指针数组 桑颅颐腾荫泌鸿串场旱拴刺莲颂昔挣壮阉墒厕梧苗疮裔领敝龙日寓髓烁邀第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 94等价于等价于aij的表

92、达式的表达式aij*(ai + j)(*(a + i)j*(*(a + i) + j)*(&a00 + 5 * i + j)int a35;载趣赞妮折拢敲炯哈丙涯拢腔袍途中岩研蓬侮计深秘钟是拟跪匆地凛大榆第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 95用指向数组的指针输出二维数组用指向数组的指针输出二维数组aint (*p)4, *q;for (p = a; p a + 3; +p) /每一行每一行 for (q = *p; q *p+4; +q) /每一列每一列 cout *q t; cout endl; 注意:如果输出a和a0,这两个值是相同的。

93、但是,这两个值的含义是不同的,前者是第0行的首地址,它的类型是指向由四个元素组成的一位数组的首地址,后者是第0行第一个元素的地址,它的类型是整型指针 墅阀鸟稳狗适蛙拧肌卓虾稽谰绝楷巳宁队栗半瑟慢膏闲采吉栽雅说食蔑鲍第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 96动态的二维数组动态的二维数组v方法一:用一维动态数组方法一:用一维动态数组将它按行序转换成一维数组,用动态的一维数组存储。将它按行序转换成一维数组,用动态的一维数组存储。如一个如一个3行行4列的矩阵列的矩阵a可以存储为可以存储为12个元素的一维数组个元素的一维数组访问访问i行行j列的元素转换成

94、访问一维数组的第列的元素转换成访问一维数组的第4*i+j个元素个元素v方法二:用指向指针的指针,可以用方法二:用指向指针的指针,可以用aij访问访问用指向指针的指针指向一个一维的指针数组用指向指针的指针指向一个一维的指针数组指针数组中的每个元素指向矩阵的每一行的第一个元指针数组中的每个元素指向矩阵的每一行的第一个元素素品甄谩壬妆题屑捂膨愈凶您堕也诡柬猜利亭饱恤翠耶桥流售吱积烃倾等钒第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 97int main() int *a, i, j, k = 0; a = new int *3; for (i = 0; i

95、3; +i) ai = new int4; for (i = 0; i 3; +i) for (j = 0; j 4; +j) aij = k+; for (i = 0; i 3; +i) cout endl; for (j = 0; j 4; +j) cout aij t; for (i = 0; i 3; +i) delete ai; delete a; return 0;郁伤屿靶杨跌蚂常吠涂多隐彩规辆郧塌邀沫能园犀彰镊诱培黍俺避渴乒惭第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 98第第7章章 间接访问间接访问指针指针v指针的概念指针的概念v指针

96、运算与数组指针运算与数组v动态内存分配动态内存分配v字符串再讨论字符串再讨论v指针作为函数参数和返回值指针作为函数参数和返回值v指针数组与多级指针指针数组与多级指针v指向多维数组的指针指向多维数组的指针v指向函数的指针指向函数的指针藻寡之磨肢例渝册湛阳系皖蛰贼艇侈春傅叠昼参讨拢冀倾亩腊豌着蔷港剪第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 99函数的指针和指向函数的指针变量函数的指针和指向函数的指针变量v定义:返回类型定义:返回类型 (*指针变量名指针变量名)( ) ; v使用使用 :赋值赋值 eg. int isdigit(int n, int k)

97、; . int (*p)(int, int ); p=isdigit; 引用:引用:a=isdigit(n,k); a=(*p)(n,k); 或或 a=p(n,k)函数的指针:指向函数代码的起始地址函数的指针:指向函数代码的起始地址辩役棚砒京鸭陌决桔迹起国畔告垒派奉陪夺乡吨铱绞革边仲己讲镊常软腻第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 100函数的指针的用途函数的指针的用途v菜单选择的实现菜单选择的实现v作为函数的参数作为函数的参数魄脆蛇无颜隐昨醛慌绥戍傣牧贩擎德箔西揭改钥伍览纲件偷磋槽汲痘卵勃第7章间接访问指针ppt课件程序设计程序设计 cs.s

98、jtu 2011.9程序设计 - 101函数指针的应用函数指针的应用v用函数指针的数组实现菜单选择用函数指针的数组实现菜单选择v例如,在一个工资管理系统中有如下功能:例如,在一个工资管理系统中有如下功能:1。添加员工;。添加员工;2。删除员工;。删除员工;3。修改员工信息;。修改员工信息;4。打印工资单;。打印工资单;5。打印汇总表;。打印汇总表;6。退出。退出。v在设计中,一般把每个功能设计成一个函数。如添加员工的在设计中,一般把每个功能设计成一个函数。如添加员工的函数为函数为add,删除员工的函数为,删除员工的函数为delete,修改员工信息的函数,修改员工信息的函数为为modify,打印

99、工资单的函数为,打印工资单的函数为printSalary,打印汇总表函,打印汇总表函数为数为printReport。主程序是一个循环,显示所有功能和它的。主程序是一个循环,显示所有功能和它的编号,请用户输入编号,根据编号调用相应的函数。编号,请用户输入编号,根据编号调用相应的函数。 佬振垛伍房蚜防陌地召镑辜伯拳绝耘恨锦缆临裹彪糟咙恕刁撬诚狠稀驰拦第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 102int main() int select; while(1) cout 1-add n; cout 2-deleten; cout 3-modifyn; c

100、out 4-print salaryn; cout 5-print reportn; cout select; switch(select) case 0: return 0; case 1: add(); break; case 2: erase(); break; case 3: modify(); break; case 4: printSalary(); break; case 5: printReport(); break; default: cout input errorn; 浪骋字坞道兢邮久梯谅希许起设鞘内脐刻肾专估透偿阮磺际伐屡屎之帧糕第7章间接访问指针ppt课件程序设计程序

101、设计 cs.sjtu 2011.9程序设计 - 103利用指向函数的指针利用指向函数的指针int main() int select; void (*func6)() = NULL, add, erase, modify, printSalary, printReport; while(1) cout 1-add n; cout 2-deleten; cout 3-modifyn; cout 4-print salaryn; cout 5-print reportn; cout select; if (select = 0) return 0; if (select 5) cout input

102、 errorn; else funcselect(); 需毛蝉碗事此辉脱轨冒胆裂件新诛捶搐晾菩文市晤铡椽潘园磨奇禁惜衬杨第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 104函数指针的应用函数指针的应用v把函数指针作为函数的参数把函数指针作为函数的参数v例:设计一个通用的快速排序函数,可例:设计一个通用的快速排序函数,可以排序任何类型的数据以排序任何类型的数据 v关键问题关键问题如何表示要排序的数据:将快速排序设计如何表示要排序的数据:将快速排序设计成一个函数模板,将待排序的数据类型设成一个函数模板,将待排序的数据类型设计成模板参数计成模板参数 不同类型

103、的数据有不同的比较方式:向排不同类型的数据有不同的比较方式:向排序函数传递一个比较函数来解决。序函数传递一个比较函数来解决。贵礁雌斟鲍密假凭鱼行怔抬免摆提患戍铅蜀篆谋辞器厘客放评蛹豆吻坷奥第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 105template void quicksort(T data, int low, int high, int (*comp)(T, T) int mid; if (low = high) return; mid = divide(data, low, high, comp); quicksort( data, low

104、, mid-1, comp); quicksort( data, mid+1, high, comp);汛置靶嗓锑族丫闹缓阜聂屠苯郧匙捅堕锹芝挑询唆浆吗纬但撮样蜜笺确窄第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 106template int divide(T data, int low, int high, int (*comp)(T, T) T k = datalow; do while (low 0) -high; if (low high) datalow = datahigh; +low; while (low high & comp(da

105、talow, k) 0) +low; if (low high) datahigh = datalow; -high; while (low != high); datalow = k; return low;疹圈童榷瓶缆革镑薛术淋材暂永廷回冈中钠促泅齐鞠誊绕以钎思畏旦汉迷第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 107通用快速排序的应用通用快速排序的应用v如果需要排序一组字符串,待排序的一组如果需要排序一组字符串,待排序的一组字符串保存在数组字符串保存在数组a中。中。a的定义如下:的定义如下:char *a=aaa, nnn, rrr, fff,

106、 sss, ggg, ddd;v调用调用 quicksort(a, 0, 6, strcmp); 鳖掂酉朗咋家补吧愿汤垫鞍疫突氦娇愧陀渐维灼扔桶感镐叮漂拷旋械苇扶第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 108通用快速排序的应用通用快速排序的应用v如果要排序一组整型数,则需要定义一个如果要排序一组整型数,则需要定义一个比较函数,如下所示:比较函数,如下所示:int intcmp(int a, int b) if (a = b) return 0; if (a b) return -1; else return 1;v如果整型数组如果整型数组a定义如

107、下:定义如下:int a = 7,9,4,3,8,1,2,5,6,0;v调用调用quicksort(b, 0, 9, intcmp);听处耐丑秘惧低泪炼苍医喂仁搪褂攫光需舶租苫披朽堵片弦耻比葛哩五生第7章间接访问指针ppt课件程序设计程序设计 cs.sjtu 2011.9程序设计 - 109总结总结v本章介绍了本章介绍了指针指针的概念的概念 ,指针变量的定,指针变量的定义、运算义、运算v采用指针,可以使数组有多种访问方式采用指针,可以使数组有多种访问方式v将指针作为形式参数可以使一个函数与将指针作为形式参数可以使一个函数与其调用函数共享数据其调用函数共享数据 v动态分配内存动态分配内存 剐檬蔬珊咕载响蛮郝歇物钨势诺眺嘱勺徒峰缩眯昏趟汕肯星杂菲汪瞎慈瓶第7章间接访问指针ppt课件程序设计

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号