第三版C语言_第10章 指针 课件讲解.pdf
《第三版C语言_第10章 指针 课件讲解.pdf》由会员分享,可在线阅读,更多相关《第三版C语言_第10章 指针 课件讲解.pdf(90页珍藏版)》请在咨信网上搜索。
1、第十章指针10.1地址和指针的概念数据在内存的存放、读取方式(以变量为例):1、数据使用前的编译处理过程2、用户存取数据方式变量名|二|地址 口 地址所标志的内存段|二|数据大一个比方:旅 客一 变量数据 旅客名字一 变量名旅馆房间一内存区 旅馆房间号一地址 查找旅客:旅客名字一房间号码一房 间一找到旅客存取数据:变量名一内存地址一内存区一数 据*注意:内存单元的地址与内存单元的内容是不同的。I内存单元地址一旅馆房间号码内存单元内容一住在房间内的旅客。内存地址 内存用户数据区20002002QQd v_ 内存中存-一一放的数据20042202006弋3、数据存取举例设程序中已定义三个整型变量i
2、,j,k,编译时系统将2000和2001两个字节给变量i,2002、2003给j,2004、2005给k。内存分配示意图如下内存地址内存用户数据区,20003变量i20026变量J20049变量kprintf(“d”,i)变量名i 一 地址2000 取变量值3 送到PRN k=i+j变量名i 一地址2000 一取变量值3 变量名j 地址2002 取变量值6相加得9 送到K占用的2004,2005飞4、直接访问与间接访问V*直接访问:1 在数据存取中,直接得到变量i地址然后按变量i的地址存取变量i的值的方式。间接访问:在数据存放中,变量i的地址不是直接得到,而是 存放在另一个变量Lpointer
3、中,须先从变量Lpointer中 获取变量i地址,然后按变量i地址存取变量值i的方式。?大一个比方(取抽屉A中的东西):直接访问:直接得到钥匙A 打开抽屉A,取出东西(直接获得变量i地址一按变量i地址存取变量的i值)间接访问:钥匙A在抽屉B中一用钥匙B打开抽屉B得到钥匙A打开抽 屉A取得东西变量i地址放在变_读取变量Lpointer量Lpointer中 值得到变量i的地址按变量i地址存取i值*间接访问例子过程:根据变量名i_pointer获得地址3010,到地址3010 读取数据,得到2000(变量i的地址),到2000地 址读取数据,得到变量i的值。内存地址内存用户数据区2000-3变量i2
4、0026变量J20049变量k30102000变量 i_pointer1 5、指针和指针变量 指针:一个变量的在内存区中的地址称为指针。通过变量的指V*针,可以找到变量的存储单元,从而读取其中存放的值;V 指针变量:专门用来存放指针的变量,称为指针变量。指针变4 量存放的数据为另一变量的地址(指针)。“注意:指针与指针变量的区别体 指针一是一个地址,用于指向存放变量数据的内存单元;指针变量一是一个变量,它的值是指针例如:变量i的地址2000为该变量的指针,变量i_pointer是 用来存放变量i的指针的,它是一个指针变量。10.2变量的指针和指向变量的指针变量指针:它首先是一个地址,是指变量在
5、内存中的地址;指针变量:它是一个变量,是一个专门存放变量地址 的变量,用来指向另一个变量。为了表示指针变量和它所指向的变量之间的联系,在程序中用表示“指向”例:Lpointer代表指针变量,而*Lpointer是i_pointer所指 向的变量。如下图所示:*Lpointer与i是等效的,都i_pointer*Lpointer 表示同一变量,该变量存放-地址为2000。因此:2000 3 i _ _ i=3;*Lpointer=3两语句作用相同2000%,1021定义一个指针变量例:int i,j;int*pointer_1,*pointer_2;第一条命令定义了两个整型变量i,j;!第二条命
6、令定义了两个指针变量pointer,pointer_2,它们 指向整型变量;两个整型变量*pointer,*pointer_2,它们与i,j为相同类型,被pointer_1,pointer_2两个指针所指向;弋*基类型:指针变量的基类型是指该指针变量可以指向的变量的类型;定义指针变量的一般形式:基类型大指针变量名例:floa t*pointer_3;“I(pointer_3是指向实型变量的指针变量)cha r*pointer_4;(pointer_4是指向字符型变量的指针变审)指针变量指向的改变:方法:将一个该指针 的变量的地址赋给该指针;执行赋值语句之前 执行赋值语句之后pointer_1
7、i pointer_1=&i Pointer-1 定义指针变量时应注意的两点:(1)“*”表明它后面所跟的变量类型是指针型变量;需要 指出的,指针变量名为pointer,而不是*pointer,I*pointer是一个整型变量;(2)在定义指针变量时必须指定基类型。因为不同数据类型 占用的内存空间大小不同,在进行指针移动和运算时,将导 致不同的结果。如“指针值+1”,对于基类型为整型,将向 后移动两个字节,对于基类型为实型,将向后移动四个字节;1022指针变量的引用WARNING:指针变量中只能存放地址(指针),不能把其它类型的数 据赋给指针变量。例:pointer为指针变量pointer_1
8、=100为非法赋值,因为100为整型变量。有关的两个运算符:(1)&:取地址运算符;(2)大:指针运算符(或称为“间接访问”运算符)例:&a为变量a的地址,*p为指针变量p所指向的存储单元;二.指针变量的引用例10ma in()(int a,b;int*pl,*p2;a=100;b=10;pl=&a;p2=&b;printf(66%d,%d n 工printf(66%d,%d n 工*/Pl a&a-*plp2 b&b j-10*p2a,b);/*“直接访问”方式*/*pl,*p2);/*“间接访问”方式结果:100,10100,10程序中:*pl表示指针变量pl所指向的变量,即a.*p2表示
9、指针变量p2所指向的变量,即b.关于&与*运算符的说明:1:&是取地址运算符.如:&a,&b等.*是指针运算符.用于定义时表示其后的标识 符是指针变量.而在程序中*p则表示指针变量p 所指向的变量,即目标变量。2.&,*同优先级,按从右至左方向结合.a:如:则:如:则:int a,*p2;pl=&a;&*pl匕&a等效 p2=&*pl;或 p2=&a;p2也指向变量a.b:如:int a,*pl;pl=&a;则:*&a与*pl等效,即等价于变量a.pl&aa*pl*&ac:如:int a,*pl;pl=&a;则:但注意(*pl)+等价于 a+*pl+不等价于(*pl)+因为*pl+等价于*(p
10、l+)即先得pl所指向 变量的值,再使指针变量pl的值自增,此时pl已不在指向 原来M变量了.例 10.2void ma in()(int*pl,*p2,*p,a,b;sca nf(“d,%d,&a,&b);pl=&a;p2=&b;if(a 5p2 b|&b|-|9|5(注意:本程序是采用交换指针变量pl和p2的 指向来实现两个数的比较的.且比较前后a,b的 值并未发生变化)三.指针变量作为函数的参数指针变量可以作函数的参数,其作用是将一个变量的地 址传送到另一个函数中。例 10.3void swap(int*pl,int*p2)int p;p=*pl;*pl=*p2;*p2=p;void m
11、ain()int a,b 5 pointer l 5*pointer_2;scanf(%d,%d 行,&a 5&b)7 pointer i=&a;pointer_2=&b;if(aa一,如果把swa p函数改成:swa p(pl,p2)int/pl,*p2;int/p;P无确定的地址值,它的 的值不可预见,*p所指|向的单元也是不可预见,对*P赋值可能会破坏系L统的正常状态。又如:swa p(int x*p=*pl;(此句有问题)*pl=/p2;*p2=*p;XaJb99x(b)1 y.说明:T 1.不能通过改变形参指针变量的值而使实参指针变 量的值改变.2.可以通过改变形参指针变量所指向的变
12、量的值来改变实参指针变量所指向的变量的俏.3.如想通过函数调用得到n个要改变的值,可以:在主调函数中设n个变量,并用n个指针变量指 向它们;将指针变量作实参,使n个变量的地址传给所调 用的函数形参;(3)通过形参指针变量,改变该n个变量的值;(4)主调函数中就可以使用这些改变了值的变量。飞 swa p(int*pl,int*p2)int*p;.P=Pl;_ 本函数中试图通过改变形参pl=p2;(指针变量的值来使实参指针P2=p;变量的值改变.|ma in()(int a,b,/pointer,pointer!;sca nf(,%d,%d”,&a,&b);pointer l=&a;pointer
13、!=&b;if(a b)swa p(pointer l,pointer!);printf(n%d,%d n”,a,b);作者原意图是实 现这样的结果pointeri&a pointer_2&bj(a)pointerl(d)c语言中实参变量和形 参变量之间的数据传递 是单向的“值传递”方式,指针变量作为函数参 数也要遵循这一规律pointerl a&a-6 5pointer!b&b 1行(d)总结:要实现变量值的双向传递,在被调函 数中必须对指针变量所指向的日标变量进 行操作。如果只是对指针变量本身进行操作,仍然是单向传递。这点是指针变量作为函数参数的难点 和重点。例10.4输入a,b,c3个整
14、数,按大小顺序输出 swap(int*ptl,int*pt2)(int p;p=*ptl;*ptl=*pt2;*pt2=p;)exchange(int*ql,*q2,*q3;)(if(*ql *q2)swap(ql?q2);if(*ql *q3)swap(ql,q3);if(*q2 *q3)swap(q2,q3);)main()(int a,b,c,*p 1,*p2,*p3;scanf(“d,%d,%d,&a,&b,&c);p 1=&a;p2=&b;p3=&c;exchange(pl,p2,p3);printf(n%d,%d,%dn a,b,c);)10.3数组的指针和指向数组的指针变量c语言
15、中,指针变量可以指向变量,也可以指向数组 和数组元素.数组的指针:数组的起始地址.数组元素的指针:数组元素的地址.一.指向数组的指针变量的定义与赋值指向数组的指针变量的定义同指向变量的指针变量 的定义相同.如:int a 10;int*p;若:p=&a 0;则p指向了a数组的第0号元素.由于数组名代表数组的首地址(即起始地址).故:p=&a 0;等价于 p=a;也可:int a 10;int*p=&a 0;int*p=a;注意int*p=&a 0;的含义是将数组首地址赋给指针 变量p,而不是赋给(*p).:.通过指针引用数组元素 P&a 0如:int a 10,*p;P=a;_则:P 的地址;
16、p+的地址;p+的地址.0a 0 a la 9(2)*p=a 0,*(p+1)=a l,.*(p+i)=a i说明:1.数组元素在内存中是连续存放的,c语言 规定,指针变量p+1指向下个元素(不是简单的 加1).2.(p+i)表示指向a i的地址,而a+i也表示 a i的地此故程序中(p+i)等价于a+i.如:p+2;a+2;3.指向数组的指针变量可以带下标.如:Pi I*(P+i)I p a数组p+l,a+i a 0a lp+i 月+I*(P+i)a ip+9 用+9 a 9综上所述:数组元素的引用可以:(假定:int a 10,*p=a;)(1)下标法:数组名I下标或 指针变量名I下标 a
17、 i pi指针法:*(p+i)或*(a+i)例10卓用二种方法输出数组各元素.下标法ma in()(int a 10 5 i;for(i=0;i10;i+)sca nf(66%d,&a i);printf(“n);for(i=0;i10;i+)printf(“d”,a i);用以组名计算元素地址.ma in()(int a 10,i;for(i=0;i10;i+)scanf(%d”,&ai);printf(“n”);for(i=0;i 10;i+)printf(d *(a+i);注意几点:(1)指针变量可以作自增,自减运算.如:+P,P-.而数组名不能作自增,自减运算.如a+,a等 均不合法.
18、因为数组名是常量.(2)注意指针变量的当前值.如:例 10.6:ma in()(int a 10,i,;P=a;for(i=0;i10;i+)sca nf(“%d”,p+);printf(“n);for(i=0;i 10;i+,p+)printf(%d,*p);注意指针变量的运算.如:int a 10,i/p;p=a;贝u:a.p+(或 p+=l)表示p指向a l,此时若执行*p,则取出a l 元素的值.b.“户与“+”同优先级,自右往左结合.如:*P+等效于*(p+),即先取P所指向 变量的值,再使p+1.而*(p+)号*(+P)的作用不同.前恚先取*P的俶后使p+1;者是先使p+1,再取*
19、P的值.(L(*p)+表示使目标变量的值加1.而不是指针变量的 值加loe.*(p+)等价于 a i+T*(+p)等价于a+i即先使p自增,再作文运算.如:ma in()(int a 100,*p;P=a;while(p a+100)叨 printf(%d 二*p+);.ma in()(int a 100 5*p;P=a;while(p a+100)printf(u%d,*p);P+;三.数组名作函数参数数组名作函数参数时,实际上是将实参 数组的首地址传给形参。这样实参数组与 形参数组共占同一段内存。使得在调用函 数过程中,形参数组中元素值发生变化也 就使实参数组的元素值随之而发生变化。t如:
20、ma in()”int a rra y10;a rra yf(a rra y,10);f(a rr,n)int a rr 5 n;a rr1)实参传递给形参后a rr和 a rra y指向同一内存地址;2)将“10”传递给形参n后,界定了形参数组的范围;3)这种“数组名+数组元素 个数”的参数形式是常用的。t例10.7将数组a中n个整数按相反顺序存放.题意分析:本题的关键是最后交换的两个元素的上下标值.的确定。即将第一个元素和最后一个元素对换消第 二个同倒数第二个对换.即两两对换,直到:a int(n-1)/2与 a n-int(n-1)/2-1)对换 为止。void inv(int x,in
21、t n)int t-1)/2;for(i=0;i=m;i+)j=n-l-i;t=xi;xi=xj;xj=t;return;)ma in()(sta tic int i,a 10=3,7,9,11,0,6,754,2);printf(The origina l a rra y:n);for(i=0;i10;i+)printf(66%d 工 a i);printf(“n”);inv(a 510);printf(The a rra y ha s been inverted:n);for(i=0;i10;i+)printf(%d,a i);printf(“n”);例10.8从10个数中找出其中最大值和
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第三版C语言_第10章 指针 课件讲解 第三 语言 10 课件 讲解
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【曲****】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【曲****】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。