第17讲指针(1).ppt

上传人:hyn****60 文档编号:70761096 上传时间:2023-01-27 格式:PPT 页数:30 大小:438KB
返回 下载 相关 举报
第17讲指针(1).ppt_第1页
第1页 / 共30页
第17讲指针(1).ppt_第2页
第2页 / 共30页
点击查看更多>>
资源描述

《第17讲指针(1).ppt》由会员分享,可在线阅读,更多相关《第17讲指针(1).ppt(30页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、第十七讲指针(一)/学习目标理解变量、内存单元和地址之间的关系能够定义、使用指针掌握指针变量的基本运算会使用指针作为函数的参数/8.1寻找保险箱密码一个关于特工007寻找保险箱密码的故事关键点分析得到线索:0217单元的“虎跑号”寄存箱 提示地址:1976单元找到目标:“龙井号”寄存箱取出内容:911/8.1寻找密码的途径分析n密码密码911911存放在某个寄存箱内,如果我们存放在某个寄存箱内,如果我们知道这个寄存箱的名字,就能够找到密码知道这个寄存箱的名字,就能够找到密码.n如果不知道密码所在的寄存箱名字,知道如果不知道密码所在的寄存箱名字,知道该寄存箱的地址也照样能够取出密码该寄存箱的地址

2、也照样能够取出密码.n如果寄存箱的地址也不知道,但是有另外如果寄存箱的地址也不知道,但是有另外一个地方存放这个寄存箱的地址,就能顺一个地方存放这个寄存箱的地址,就能顺藤摸瓜,间接找到密码藤摸瓜,间接找到密码./8.1密码存放示意图龙井号龙井号9111976虎跑号虎跑号19760217名字虎跑号龙井号地址02171976内容1976911/例8-1利用指针模拟寻找保险箱密码的过程获取密码的两种方法intmain(void)intkey=911;/*变量key存放密码*/int*addr=NULL;/*变量addr存放地址*/addr=&key;/*将key的地址赋给addr*/*通过变量key输

3、出密码值*/printf(Thekeyis:%dn,key);/*通过变量key的地址来输出密码值*/printf(IfIknowtheaddressofthekey,Ialsocangetit:%dn,*addr);return0;Thekeyis:911IfIknowtheaddressofthekey,Ialsocangetit:911/8.1.2地址和指针指针的概念 内存单元内存单元地址地址 内容内容 变量变量intx=20,y=1,z=155;printf(%d,x;)直接访问直接访问:通过变量名访问:通过变量名访问间接访问间接访问:通过通过另一个变量访问另一个变量访问把变量的地址放

4、到另一变量中把变量的地址放到另一变量中使用时先找到后者使用时先找到后者再再从中取出前者的地址从中取出前者的地址100020 x10021y1004155z20001000p2002地址地址 指针变量指针变量/指针 内存单元内存单元地址地址 内容内容 变量变量intx=20,y=1,z=155;printf(%d,x;)100020 x10021y1004155z20001000p2002地址地址 指针变量指针变量指针变量指针变量:存放地址的变量:存放地址的变量某个某个变量变量的地址的地址指向指向/指针变量所指向的变量的类型指针变量所指向的变量的类型int*p;p是整型指针,指向整型变量是整型指

5、针,指向整型变量float*fp;fp是浮点型指针,指向浮点型变量是浮点型指针,指向浮点型变量char*cp;cp是字符型指针,指向字符型变量是字符型指针,指向字符型变量类型名*指针变量名指针声明符指针声明符8.1.3指针变量的定义/指针变量的定义类型名类型名*指针变量名指针变量名int*p;指针变量名是指针变量名是p,不是不是*p。*是指针声明符是指针声明符p里保存一个地址,这个地址在哪里?里保存一个地址,这个地址在哪里?(p指向哪里?)指向哪里?)intk,*p1,*p2;等价于:等价于:intk;int*p1;int*p2;/指针变量的初始化一般形式:存储类型数据类型*指针名=初始地址值

6、;赋给指针变量例 inti;int*p=&i;变量必须已说明过类型应一致例int*p=&i;inti;例 inti;int*p=&i;int*q=p;用已初始化指针变量作初值例main()inti;staticint*p=&i;.()不能用auto变量的地址去初始化static型指针/例#includevoid main()inti=10;int*p;*p=i;printf(“%d”,*p);例#includevoidmain()inti=10,k;int*p;p=&k;*p=i;printf(“%d”,*p);指针变量的初始化一般形式:存储类型数据类型*指针名=初始地址值;/零指针与空类型指

7、针零指针:(空指针)定义:指针变量值为零表示:int*p=0;p指向地址为0的单元,系统保证该单元不作它用表示指针变量值没有意义#defineNULL0int*p=NULL:p=NULL与未对p赋值不同用途:避免指针变量的非法引用在程序中常作为状态比较例int*p;.while(p!=NULL).void*类型指针表示:void*p;使用时要进行强制类型转换例char*p1;void*p2;p1=(char*)p2;p2=(void*)p1;表示不指定p是指向哪一种类型数据的指针变量/变量的指针和指针变量变量的指针内存中存储某个变量的存储单元的首地址。指针(地址)实质上是一个整数(不是C的整型

8、)。可以通过变量的地址来间接的访问变量。指针变量指针(地址)是一个数据,也可以用另一个变量来存放,即指针变量。通过指针变量可以间接访问变量或内存数据。/8.1.4指针的基本运算*间接访问运算符间接访问运算符,访问指针所指向的变量访问指针所指向的变量*p:指针变量指针变量p所所指向的指向的变量变量a3&ap*p如果指针的值是某个变量的地址,通过指针就能间接访问那个变量。1、取地址运算和间接访问运算&取地址运算符,给出变量的地址int*p,a=3;p=&a;把a的地址赋给p,即p指向a指针变量的类型和它所指向变量的类型相同指针变量的类型和它所指向变量的类型相同/#includeintmain(vo

9、id)inta=3,*p;p=&a;printf(“a=%d,*p=%dn”,a,*p);*p=10;printf(a=%d,*p=%dn,a,*p);printf(Entera:);scanf(%d,&a);printf(a=%d,*p=%dn,a,*p);(*p)+;printf(a=%d,*p=%dn,a,*p);return0;例8-2指针取地址运算和间接访问运算a3&ap*pa=3,*p=3a=10,*p=10Entera:5a=5,*p=5a=6,*p=6/a3&ap*p(1)当当p=&a后,后,*p与与a相同相同(2)int*p;定义定义指针指针变量变量p*p=10;指针指针p所

10、指所指向向的变量的变量,即即a(3)&*p与与&a相同相同,是是地址地址*&a与与a相同相同,是是变量变量(4)(*p)+等价于等价于a+将将p所指所指向向的变量值加的变量值加1*p+等价于等价于*(p+)先取先取*p,然后然后p自加,自加,此时此时p不再指向不再指向a说明inta=1,x,*p;p=&a;x=*p+;b2&bp2*p2a1&ap1*p121#includeintmain(void)inta=1,b=2,t;int*p1,*p2;p1=&a;p2=&b;printf(a=%d,b=%d,*p1=%d,*p2=%dn,a,b,*p1,*p2);t=*p1;*p1=*p2;*p2=

11、t;printf(a=%d,b=%d,*p1=%d,*p2=%dn,a,b,*p1,*p2);return0;例例8-3通过通过指针指针改变改变变量的值变量的值a=1,b=2,*p1=1,*p2=2a=2,b=1,*p1=2,*p2=1/2、赋值运算a3&ap1&ap2*p1*p2inta=3,*p1,*p2;p1=&a;把a的地址赋给p1,即p1指向ap2=p1;p2也指向a相同类型的指针才能相互赋值相同类型的指针才能相互赋值/b4&bp2*p2a2&ap1*p16c&a&c例例8-4指针指针赋值赋值intmain(void)inta,b,c,*p1,*p2;a=2;b=4;c=6;p1=&

12、a;p2=&b;printf(a=%d,b=%d,c=%d,*p1=%d,*p2=%dn,a,b,c,*p1,*p2);p2=p1;p1=&c;printf(a=%d,b=%d,c=%d,*p1=%d,*p2=%dn,a,b,c,*p1,*p2);return0;*p2*p1a=2;b=4;c=6;*p1=2,*p2=4a=2;b=4;c=6;*p1=6,*p2=2/例例8-5intmain(void)inta=1,b=2;int*p1=&a,*p2=&b,*pt;printf(a=%d,b=%d,*p1=%d,*p2=%dn,a,b,*p1,*p2);pt=p1;p1=p2;p2=pt;pr

13、intf(“a=%d,b=%d,*p1=%d,*p2=%dn”,a,b,*p1,*p2);return0;8.1.5指针变量的初始化p1b2&bp2*p2a1&a*p1ptb2&ap2*p1a1&bp1*p2pt&aa=1;b=2;*p1=1,*p2=2a=1;b=2;*p1=2,*p2=1/对指针的操作/对指针所指向变量的操作*p1和和*p2的值都由的值都由1和和2变成了变成了2和和1(1)直接改变指针的值直接改变指针的值(2)改变指针所指变量的值改变指针所指变量的值p1b2&bp2*p2a1&a*p1ap1b2&ap2*p11&b*p2p1b1&bp2*p2a2&a*p1/8.2狸猫换太子

14、一个关于发生在北宋年间变量替换的故事关键点分析真宗和李玉未出生的孩子:小王子刘娥的阴谋:用狸猫替换掉孩子筹备工作:设计两套替换行动方案实施结果:行动一失败,行动二成功/intmain(void)intbaby=PRINCE;/*baby代表孩子,刚出生时是王子*/printf(beforechange,babyis);display(baby);replace1(baby);/*实施狸猫换太子第一次行动*/printf(n);printf(afterfirstaction,babyis);display(baby);replace2(&baby);/*实施狸猫换太子第二次行动*/printf(

15、n);printf(aftersecondaction,babyis);display(baby);return0;例8-6指针作为函数参数模拟狸猫换太子#defineCIVET0定义狸猫值为定义狸猫值为0#definePRINCE1定义王子值为定义王子值为1voidreplace1(intbaby)baby=CIVET;voidreplace2(int*baby)*baby=CIVET;voiddisplay(intwho)if(who=CIVET)printf(狸猫狸猫);elseif(who=PRINCE)printf(王子王子);beforechange,babyis王子王子after

16、firstaction,babyis王子王子aftersecondaction,babyis狸猫狸猫8.2.2指针作为函数的参数函数参数包括实参和形参,两者的类型要一致,可以是指针类型。如果实参是某个变量的地址,相应的形参就是指针。intmain(void)inta=1,b=2;int*pa=&a,*pb=&b;voidswap1(intx,inty),swap2(int*px,int*py),swap3(int*px,int*py);swap1(a,b);printf(“Aftercallingswap1:a=%db=%dn”,a,b);a=1;b=2;swap2(pa,pb);printf

17、(“Aftercallingswap2:a=%db=%dn”,a,b);a=1;b=2;swap3(pa,pb);printf(“Aftercallingswap3:a=%db=%dn”,a,b);return0;调调用用哪哪个个函函数数,可可以以交交换换main()中变量中变量a和和b的值的值?例8-7swap1()a12bx12y21swap1(a,b);voidswap1(intx,inty)intt;t=x;x=y;y=t;/例8-7swap2()swap2(&a,&b);voidswap2(int*px,int*py)intt;t=*px;*px=*py;*py=t;abpxpy12

18、值传递,地值传递,地址未变,址未变,但存放的变量的值改变了但存放的变量的值改变了21/例8-7swap3()swap3(&a,&b);voidswap3(int*px,int*py)int*pt;pt=px;px=py;py=pt;abpxpy12值传递,形参指针的改变值传递,形参指针的改变不会影响实参不会影响实参/指针作为函数参数的应用swap2(&a,&b);voidswap2(int*px,int*py)intt;t=*px;*px=*py;*py=t;要通过函数调用来改变主调函数中某个变量的值:要通过函数调用来改变主调函数中某个变量的值:(1)在主调函数中,在主调函数中,将该变量的地址或者指向该变量的将该变量的地址或者指向该变量的指针作为实参指针作为实参(2)在被调函数中,在被调函数中,用指针类型形参接受该变量的地址用指针类型形参接受该变量的地址(3)在被调函数中,改变形参所指向变量的值在被调函数中,改变形参所指向变量的值abpxpy1221作业与实验作业习题7:6、7实验习题7:8、9/

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

当前位置:首页 > 生活休闲 > 生活常识

本站为文档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