




已阅读5页,还剩83页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第8章善于利用指针,8.1指针是什么8.2指针变量8.3通过指针引用数组8.4通过指针引用字符串,1.变量的“直接访问”方式:,3,直接访问:,按变量的地址(即变量名)存取变量值的方式。,例如:inti=3;,讨论一个问题:,A、B和C三人约定住宿在某旅馆。A先到达旅馆,在服务台登记了房间,房间号是2010。然后,A电话通知了B,但没有通知C。,B怎样找到A呢?,B可以直接到2010找到A.,inti=3,j=6,k;,printf(“%d”,i);,通过变量名i,找到i的地址2000H,从而从存储单元读取3,讨论一个问题:A、B和C三人约定住宿在某旅馆。A先到达旅馆,在服务台登记了房间,房间号是2010。然后,A电话通知了B,但没有通知C。,C怎样找到A呢?,C可以从旅馆的服务台查询到A的房号2010,间接找到A。,将变量的地址放在另一个内存单元中,先到另一个内存单元中取得变量的地址,再由变量的地址找到变量并进行数据存取(见下图)。,2.变量的“间接访问”方式,间接访问方式:,3,作用相当服务台,inti=3,j=6,k;,定义特殊变量i_pointer,将i的地址存到这里,间接存取,i_pointer=,*i_pointer=50;,50,8.1指针是什么,地址:内存中存储单元的编号。指针:在C在语言中一个变量的地址称为该变量的“指针”。例如:inta;/*int*p1,*p2;p1=,8.2.1使用指针变量的例子,p1如:int*p1,*p2;int是为指针变量指定的“基类型”。基类型指定指针变量可指向的变量类型。p1,p2是指针变量名,而不是*p1,*p2p1可以指向整型变量,但不能指向其他类型变量。,例如:inta;floatb;int*p;p=,正确,错误,8.2.3怎样引用指针变量,在引用指针变量时,可能有三种情况:给指针变量赋值。如:p=,使p指向a,*p相当于a,以十六进制输出a的地址,8.2.3怎样引用指针变量,要熟练掌握两个有关的运算符:,1、/*将m的地址赋给指针变量p*/,8.2.3怎样引用指针变量,要熟练掌握两个有关的运算符:,2、*间接存取运算功能:返回其后随地址(指针变量值)中的变量值例:int*p,m;p=/*将200赋给指针变量p所指向的变量m*/,指针变量的赋值:变量的指针(地址)是一个无符号整数,可以将一个变量的指针赋值给一个指针变量,但不能将一个整数直接赋值给一个指针变量。1、用变量的地址给指针变量赋值(求地址运算符注意:指针变量若不赋值,则指针变量的值是随机的。,危险,8.2.3怎样引用指针变量,3、赋空值NULL,例如:,int*p;p=NULL;,或p0;,指针变量赋空值NULL与不赋值的区别:,(1)指针变量赋空值NULL,指向为0的单元,系统保证该单元不作它用,表示指针变量值没有意义;,用途:避免指针变量的非法引用,在程序中常作为状态比较,如果p=NULL就不能操作p,此时p无意义,只有p!=NULL,即p指向有意义的空间,才能操作p所指向的对象。,(2)指针变量不赋值,指针变量的值是随机的,指向也是随机的,具有不确定性;,例main()inti=10,b=3;int*p;*p=i;printf(“%d”,*p);,危险!,例main()inti=10,k;int*p;p=,指针变量必须先赋值,再使用,10,4、void*类型指针,void*p;,表示不指定p是指向哪一种类型数据的指针变量,使用时要进行强制类型转换,例如:int*p1;p1=(int*)p;,取指针变量所指向地址内容:,b=*p;,存指针变量所指向地址内容:,*p50;,例如:main()inta=5,b=3,*p;p=,*p,2000,3,5,运行结果:,a=4,b=8,8,4,5、指针变量的存取操作,注意:,*p若出现在“”的右边或其他表达式中则为取内容,*p若出现在“”的左边则为存内容,例8.2输入a和b两个整数,按先大后小的顺序输出a和b。#includeintmain()int*p1,*p2,*p,a,b;printf(pleaseentertwointegernumbers:);scanf(%d,%d,#includevoidmain()inta=5,b=8;intt;printf(“a=%d,b=%dn”,a,b);t=a;a=b;b=t;printf(“a=%d,b=%dn”,a,b);,#includevoidmain()inta=5,b=8;int*pa=,例题1:通过一个主函数来完整地实现交换a,b两个数算法,直接访问,间接访问,例题2:通过编写一个子函数实现两个数的交换,#includevoidswap(intx,inty)intt;t=x;x=y;y=t;voidmain()inta=3,b=5;swap(a,b);printf(“a=%d,b=%dn”,a,b);,5,a,2010H,b,2B12H,x,3100H,y,3F02H,3,5,3,35,53,3,t,4D24H,不能实现两个数的交换,参数之间是值传递,单向(从实参传递给形参),例题3:#includevoidswap(int*x,int*y)intt;t=*y;*y=*x;*x=t;voidmain()inta=3,b=5;swap(,5,a,2010H,b,2B12H,x,3100H,y,3F02H,2010,2B12,3,3,35,t,4A10H,5,能实现两个数的交换,8.2.4指针变量作为函数参数,例题3:#includevoidswap(int*x,int*y)intt;t=*y;*y=*x;*x=t;voidmain()inta=3,b=5;swap(,5,a,2010,b,2B12,3,3,35,c语言中实参变量和形参变量之间的数据传递是单向的“值传递”方式。指针变量作函数参数也要遵循这一规则。调用函数不可能改变实参指针变量的值,但是可以改变实参指针变量所指变量的值。,例题4:#includevoidswap(int*x,int*y)int*t;t=x;x=y;y=t;voidmain()inta=3,b=5;swap(,5,a,2010,b,2B12,x,3100,y,3F02,2010,2B12,3,2B12,2010,t,4C00,2010,不能实现两个数的交换,1.实参和形参都是指针变量,2.被调函数中修改指针所指向的空间的值(即修改*p的值),指针作为参数应用的方式:,voidswap(int*x,int*y)intt;t=*y;*y=*x;*x=t;,voidswap(int*x,int*y)int*t;t=x;x=y;y=t;,voidmain()inta=3,b=5;swap(,/能实现交换功能的函数,/不能实现交换功能的函数,#includevoidswap(int*x,int*y)int*t;*t=*x;*x=*y;*y=*t;voidmain()inta=3,b=5;swap(,有问题:指针变量t没有指向对象,语句存在危险,#includevoidswap(int*x,int*y)int*t,w;t=,能够实现两个数的交换,例如:inta,*pa;pa=,指针变量应用总结,要求:”*”后面必须是地址表达式,int*p;p=,注意:数组名a是数组首元素的地址。“p=a;”的作用是“把a数组的首元素的地址赋给指针变量p”。即p下标法对数组进行运算for(i=0;i=指针的关系运算是两个指针所指向的地址之间的比较运算,相等,为同一变量地址,否则,为不同变量的地址,运算产生的结果为1和0。,注意:指针应指向同一数组,否则比较无意义。,不同类型指针之间的比较无意义;指针与整型常量或整型变量的比较无意义,唯整数0例外(0表示空指针)。,例:有定义:doublea5,*p1,*p2;p1,p2指向如图所示,p1=NULL或p1=0或!p1判断p1是否为空指针结果:0,a,a0,a1,a2,a3,a4,p1,p2,计算:p1=p2判断p1,p2是否指向同一变量结果:0,p1p2指向前面元素的指针变量地址值小结果:1,p1!=0或p1功能同上,结果相反结果:1,低地址,高地址,第i个元素地址的表示(p的初值为a):a+i数组名法p+i指针法p+;p=p+5;a=,总结,正确,错误,设inta5,*p=a;,指针变量,数组指针,下标法,地址关系:,pa,指针法,数组名,下标法,*(p)*(a)a0p0,*(p+1)*(a+1)a1p1,*(p+2)*(a+2)a2p2,*(p+3)*(a+3)a3p3,*(p+4)*(a+4)a4p4,下标法,8.3.3通过指针引用数组元素,引用一个数组元素,可用下面两种方法:其中a是数组名,p是指向数组元素的指针变量,其初值p=a。()下标法如ai、pi形式()指针法如*(a+i)或*(p+i),8.3.3通过指针引用数组元素,例8.6有一个整型数组a,有10个元素,要求输出数组中的全部元素。解题思路:引用数组中各元素的值有3种方法:(1)下标法;(2)通过数组名计算数组元素地址,找出元素的值;(3)用指针变量指向数组元素,(1)下标法。#includeintmain()inta10;inti;int*p=a;printf(pleaseenter10integernumbers:);for(i=0;i10;i+)scanf(%d,下标法,for(i=0;i10;i+)printf(%d,pi);,(2)通过数组名计算数组元素地址,找出元素的值#includeintmain()inta10;inti;int*p=a;printf(pleaseenter10integernumbers:);for(i=0;i10;i+)scanf(%d,指针法,for(i=0;i10;i+)printf(%d,*(p+i);,(3)用指针变量指向数组元素#includeintmain()inta10;int*p,i;printf(pleaseenter10integernumbers:);for(i=0;i10;i+)scanf(%d,for(i=0;i10;a+,i+)printf(“%d”,*a);,错!数组名是常量,不可以修改值,指针变量法,例8.7通过指针变量输出整型数组a的10个元素。#includeintmain()int*p,i,a10;p=a;printf(“enter10integernumbers:n);for(i=0;i10;i+)scanf(“%d”,p+);p=a;for(i=0;i10;i+,p+)printf(“%d”,*p);printf(n);return0;,是否可以省略?,8.3.4用数组名作函数参数,用数组名作函数参数时,因为实参数组名代表该数组首元素的地址,形参用来接收实参传递的地址。C编译将形参数组名作为指针变量来处理的,通过定义指针变量作为形参来接收数组实参传递过来的地址。,voidfun(inta,intn);intmain()intarray10;fun(array,10);return0;voidfun(inta,intn),voidfun(int*a,intn),array0,a0,array数组,a,array3,a3,a+3,*a,例8.8将数组a中n个整数按相反顺序存放解题思路:将a0与an-1对换,最后将a4与a5对换。,j,i,2,3,j,i,5,9,j,i,4,7,j,i,7,11,j,i,6,0,例8.8将数组a中n个整数按相反顺序存放#includevoidinv(intx,intn);intmain()inti,a10=3,7,9,11,0,6,7,5,4,2;for(i=0;i10;i+)printf(“%d”,ai);printf(n);inv(a,10);for(i=0;i10;i+)printf(“%d”,ai);printf(n);return0;,voidinv(intx,intn)inttemp,*i,*j;for(i=x,j=x+n-1;ij;i+,j-)temp=*i;*i=*j;*j=temp;,添加代码实现反序存放,例8.9改写例8.8,用指针变量作实参。#includevoidinv(int*x,intn);intmain()intarr10,*p;for(p=arr;parr+10;p+)scanf(“%d”,p);p=arr;inv(p,10);for(p=arr;parr+10;p+)printf(“%d”,*p);printf(n);return0;,例8.10用指针方法对10个整数按由大到小顺序排序。#includevoidsort(intx,intn);intmain()inti,*p,a10;p=a;for(i=0;i10;i+)scanf(“%d”,p+);p=a;sort(p,10);for(p=a;p*(x+k)k=j;,t=*(x+i);*(x+i)=*(x+k);*(x+k)=t;,在xi+1x9中,最大数xk与xi对换,总结:指针变量与一维数组的关系,int*p与inta10
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年通信安全员ABC证模拟试题及答案
- 医疗大数据驱动的智能医疗系统研究
- 沧州市第四医院高级职称工作人员招聘笔试真题2024
- 2024年张家界市消防队员招聘考试真题
- 2024年北流市消防队员招聘考试真题
- 数字经济下贵州省数据知识产权司法保护研究
- 区块链内容分发-洞察阐释
- 企业级数字货币解决方案与发展趋势
- 基于大数据的供应链管理创新-洞察阐释
- 云生物感应信号传导-洞察阐释
- 乙烯高压气相本体聚合制备低密度聚乙烯的合成工艺
- HAY-胜任素质模型构建与应用完整版
- 医院硬式内镜清洗消毒技术规范(2019年版)
- DB23T 3104-2022 油田含油污泥处置与利用污染控制要求
- 精选芭蕾舞男女演员之间的潜规则汇总
- fevr的治疗进展专题知识讲座
- 《中华传统文化》第11课戏曲-教学教案
- 机械基础章节练习题集题库带答案
- 塔式起重机大臂减臂使用的受力分析和计算
- 生物大分子晶体学基础(I)2016
- 申请增值电信业务经营许可证材料范本说明书
评论
0/150
提交评论