




已阅读5页,还剩85页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
共84页第1页,第九章指针,共84页第2页,本章要点,1.理解指针与地址的概念;2.掌握指针的定义和运算;3.掌握指向基本类型、数组、字符串的指针的使用;4.充分理解指针和数组的等价性;5.掌握指针函数和函数指针的使用;6.了解指向指针的指针的概念及其使用。,共84页第3页,预备知识,内存:就是内部存储器,是由存储单元组成的。它的特点是存储单元是线性连续的。存储单元的最小单位是字节。,1.内存的概念,共84页第4页,地址:为了访问内存中的某个存储单元,我们要为它编号,这种编号称为内存地址。通过地址我们就能够访问该地址所标识的存储单元。,2.地址的概念,共84页第5页,变量的地址:变量的地址是变量在内存中占用连续字节的首地址。,2007,存储单元,共84页第6页,以往对变量的访问:定义变量:intk;编译系统根据类型为k分配内存。输入变量的值:scanf(“%d”,通过指针间接访问:C提供了另一种方式,将变量k的地址存放在另一个变量处(假定为pk),通过访问pk,就可以间接地访问变量k,这种方式称为间接访问。,变量的存取方法:直接存取和间接存取。,共84页第7页,引入指针程序设计的优点,有效表示复杂的数据结构。方便使用字符串、数组。可以得到多个返回值。可以进行动态分配内存。程序简洁、紧凑,执行效率高。,共84页第8页,9.1.1指针的基本概念,指针:一个变量的地址称为该变量的指针。指针变量:若一个变量专用于存放另一个变量的地址(指针),则称此变量为指针变量。若指针变量p的值等于变量x的地址,则说指针变量p指向变量x。,1000,35,1000,p,x,x的值,p的值,X的内存地址,9.1指针的基本概念及指针变量的定义,共84页第9页,指针的对象:当把变量的地址存入指针变量后,就可以说这个指针指向了该变量。,共84页第10页,9.1.2指针变量的定义,指针变量定义的一般形式:类型标识符*标识符,例:float*p1;int*p2;作用:定义变量为指针类型,使之专门用于存放地址。,指针所指的变量的类型,指针变量名,共84页第11页,说明:,(1)*用于定义指针变量,但指针变量名不带*。如int*p1;float*p2;定义的指针变量为p1,p2(2)一个指针变量只能指向同一类型的变量。如p1只能用于指向整型变量p2只能用于指向实型变量(3)无论指针变量指向何种类型,指针变量本身都是整型的,指针变量本身也有自己的地址,占两个字节的存储空间。,共84页第12页,1.取地址运算p=给变量a输入值*p+25等价于a+25,共84页第14页,3.为指针变量赋初值,指针变量使用前必须有值,指针变量的初值必须是地址值(不能是整数),方法:,在说明指针变量时同时初始化inta,*p=,可以为指针赋空值(NULL),此时指针不指向任何变量,如p=NULL或p=0;p=0;(p为空指针),共84页第15页,对*及int*pa,*pb;a=100;b=10;pa=,定义指针变量pa,pb,将a的地址送pa,将b的地址送pb,输出所指向的变量,运行结果为100,10100,10,共84页第17页,例9-2将两个整型数a,b按由大到小次序输出。,main()int*p1,*p2,*p,a,b;scanf(“%d,%d”,注意:a和b并未交换,但p1和p2的值交换了,运行情况:5,9a=5,b=9larger=9,little=5,共84页第18页,在C语言中,凡是可以通过数组下标方式完成的访问(操作)均可以通过指针方式实现。称为指针方式。,9.3指针与数组,数组中的每个元素都可以通过下标唯一确定,即通过下标可以访问(操作)数组中的元素,称为下标方式。如ai,访问数组的两种方式:下标方式,指针方式.,C语言规定:数组名就是数组的首地址常量.,于是:,a=(等价于p=2.通过指针引用数组引用数组元素可以用下标法,也可以用指针法,即通过指向数组元素的指针变量找到所需元素。,P=p=a;,*(p+i),共84页第22页,例如:设有变量定义:inta10,*p,*q;则p=ap指向a0q=a+6q指向a6p=q-4p指向a2,3,4,12,11,5,6,7,8,9,10,p=a,a0,a6,a9,q=a+6,q-4,1000,共84页第23页,2.指针自增自减运算,语法:p+;p-;+p;-p;进行+p或p+运算后都使p指向下一个数据p+与+p的区别:表达式p+的值等于p的原来值;表达式+p的值等于p的新值;取内容运算符“*”、取地址运算符“p=q=a?变成100,a3,a4,共84页第24页,把值为0的指针变量称作空指针变量。空指针变量表示不指向任何地方,表示指针变量的一种状态。p=0;p=0;p=NULL;三个语句等价。其中p为指针变量;0的ASCII码值为0;NULL是在“stdio.h”文件中定义的符号常数,其值为0,代表地址0和空指针的概念。如果给空指针变量所指内存区域赋值,将会得到一个出错信息。,3.空指针,共84页第25页,p-2,p-1,p,p+1,p+2,.,.,p-3,当两个指针指向同一个数组中的元素时,才能进行、=、qp指针所指元素位于q所指元素之后时为1,反之为0。,p=qp指针所指元素位于q所指元素之后(或两指针指向同一元素)时为1,反之为0。,=和!=运算符,比较的是两个指针表达式是否指向同一个内存单元;、=,比较的是两个指针所指内存区域的先后次序语法格式:指针表达式关系运算符指针表达式,例:inta10;int*p=a,*q=a+3;判断以下表达式的值p=p=a;q=则p-q=5表示p,q之间数据元素的个数是5。,共84页第28页,格式:(类型名*)指针表达式功能:将指针表达式的值转换成指定类型的指针。例如:int*p;doubled,*q=,6.强制类型转换运算,共84页第29页,9.3.3通过指针引用数组元素,引用数组中的元素可以用以下方法:下标法:如a3,ai指针法:即通过指向数组元素的指针找到所需的元素.这种方法占内存少,运行速度快,程序代码质量高。假设p已定义为指针变量,并已赋了一个地址,它指向某一个数组元素.且有赋值语句p=则:p+1表示数组中的下一个元素,a+i和p+i都是ai的地址,或者说它们指向ai.*(a+i)或*(p+i)是a+i或p+i所指向的数组元素。指向数组的指针变量也可带有下标,如pi与*(p+i)等价。,对下标为i的元素访问:ai,*(a+i),*(p+i),pi对ai的地址表示:for(i=0;i10;i+)scanf(“%d”,地址法(通过数组名计算数组元素地址)for(i=0;i10;i+)printf(“%5d”,*(a+i);指针法for(p=a;p(a+10);p+)printf(“%5d”,*p);,共84页第31页,例9-3用指针访问数组元素。,main()inta10,*pa,i;for(i=0;i10;i+)ai=i+1;pa=a;for(i=0;i10;i+,pa+)printf(“%d”,*pa);printf(“n”);,不要忘记赋初值,如何修改程序可以完成功能?,共84页第32页,例9-4给定10个整数,求最大值。,main()inta10=5,7,3,6,2,1,8,9,4,0;inti,*p,max;p=a;max=*p+;for(i=1;imax)max=*p;printf(“max=%dn”,max);,问题:如果修改语句for(i=1;imax)max=*p+;能实现程序功能吗?,问题:如果修改语句for(;pmax)max=*p;能实现程序功能吗?,共84页第33页,9.3.4字符串指针与字符串,1.字符串的表示形式用字符数组表示,如:main()charstring=“IloveChina!”;printf(“%sn”,string);,数组名,用字符指针实现,如:mian()char*string=“IloveChina!”;printf(“%sn”,string);,把“IloveChina!”的首地址赋给指针变量string,特点:字符串的长度不受限制;字符指针指向别处,字符串将失踪.,共84页第34页,2.字符指针变量与字符数组的比较,字符数组由若干个元素组成,每个元素中放一个字符,而字符指针变量中存放的是字符串的首地址。赋值方式:charstr=“Iamaboy!”或:charstr20;scanf(“%s”,str);字符指针变量指向字符串首地址。赋值方法三种:(1)char*pa=“Iamaboy!”(2)char*pa;pa=“Iamaboy!”(3)char*pa,str20;pa=str;scanf(“%s”,pa);,共84页第35页,例9-5已知下面程序的输出结果:ABCDCD,请完善程序:main()char*chp=“ABCD”;for(;_A_;chp=chp+2)printf(“%s”,_B_);printf(“n”);,A.*chp!=0,B.chp,共84页第36页,作用:函数的参数不仅可以是整型、实型、字符型,还可以是指针型,它的作用是将一个变量的地址传送到另外一个函数中。,9.4指针与函数,9.4.1指针变量作函数参数,共84页第37页,例:交换两个变量的值。注意函数调用形实结合方式.,swap(x,y)intx,y;intt;t=x;x=y;y=t;,main()inta,b;scanf(“%d,%d”,单向值传递!,调用函数时a的值传送给x,b值传送给y,可是执行完函数后,x和y的值是互换了,但a,b的值并未互换。,共84页第38页,swap(int*p1,int*p2)intp;p=*p1;*p1=*p2;*p2=p;,main()inta,b;int*pa,*pb;scanf(“%d,%d”,运行情况:5,99,5,交换指针所指向的变量的值,分析观察使用指针做形参和实参的结果,例:将两个数按从大到小顺序输出(交换两个变量的值)。,结论:被调用函数不能改变实参指针变量的值,但可以改变实参指针变量所指向的变量的值。,共84页第39页,函数调用过程如下图所示:,调用swap函数之前:,共84页第40页,执行函数语句,p1、p2所指向的变量的值相互交换,*p1,*p2,共84页第41页,函数调用结束后,p1、p2所占用的内存单元被释放,,共84页第42页,swap(int*p1,int*p2)int*p;p=p1;p1=p2;p2=p;,main()inta,b;int*pa,*pb;scanf(“%d,%d”,C语言中,实参和形参间的数据是单向值传递方式。指针做函数参数也遵循该原则.,改变指针形参的值,也不能改变指针实参的值.,结果为:?,交换了两个指针中的内容。,共84页第43页,9.4.2数组名作函数参数,当用数组名作为参数时,如果形参数组中元素的值发生变化,实参数组元素的值也随之变化,为什么?若有一个实参数组,想在函数中改变此数组的元素的值,实参与形参的对应关系有以下4种情况:形参与实参都用数组名实参用数组名,形参用指针变量实参形参均用指针变量实参为指针变量,形参为数组名,都是地址传递,只是形式不同!,共84页第44页,指针作函数参数应注意的问题,指针变量在作实参时,必须有确定的值,即指向一个已定义的单元。如:main()int*p;f(p,10);intf(intx,intn),如何修改?,共84页第45页,例9-6:用选择法对10个整数由小到大排序。方法1:形参和实参都用数组名(在函数中介绍的),main()inti,a10;voidsort();for(i=0;i10;i+)scanf(%d”,voidsort(intx,intn)inti,j,t;for(i=0;ixj)t=xi;xi=xj;xj=t;,形参是数组名,实参也是数组名,共84页第46页,方法2:形参是数组名,实参是指针变量。,main()int*p,i,a10;voidsort();p=a;for(i=0;i10;i+)scanf(%d,p+);sort(p,10);for(p=a,i=0;i10;i+)printf(%d,*p+);,voidsort(intx,intn)inti,j,t;for(i=0;ixj)t=xi;xi=xj;xj=t;,p=a;,形参是数组名,实参是指针,当用数组名作函数参数时,由于数组名代表的是数组首元素地址,因此传递的是地址,所以要求实参为指针变量。,共84页第47页,方法3:实参是数组名,形参是指针变量。,voidsort(int*x,intn)inti,j,t;for(i=0;i*(x+j)t=*(x+i);*(x+i)=*(x+j);*(x+j)=t;,实参是指针,main()inti,a10;voidsort();for(i=0;i10;i+)scanf(%d”,形参是指针,实参是数组名,共84页第48页,方法4:实参和形参都是指针变量。,voidsort(int*x,intn)inti,j,t;for(i=0;i*(x+j)t=*(x+i);*(x+i)=*(x+j);*(x+j)=t;,实参是指针,main()int*p,i,a10;voidsort();p=a;for(i=0;i10;i+)scanf(%d,p+);p=a;sort(p,10);for(p=a,i=0;iy)z=x;elsez=y;return(z);,指向函数的指针,指向max函数,共84页第59页,在一个程序中,一个指针变量可以先后指向不同的函数;例如:int(*p)();intmax();intmin();p=max;c=(*p)(a,b);p=min;c=(*p)(a,b);,P先于*结合,是指针变量,然后再与()结合,表示此指针变量指向函数。,共84页第60页,实参函数名f1f2sub(x1,x2)int(*x1)(),(*x2)();inta,b,i,j;a=(*x1)(i);b=(*x2)(i,j);,定义x1,x2为函数指针变量,调用f1函数,调用f2函数,指向函数的指针变量作函数参数:,共84页第61页,9.5指针与二维数组,9.5.1二维数组的结构数组的名代表该数组的首地址,并可看成是地址常量,这一规定对二维数组或更高维数组同样适用。若有定义:float*p,d35;d0,d1,d2分别是一维数组名,表示一维数组的首地址,p=d0是正确的。,可以把d看成是由3个一维数组组成,即d0,d1,d2,共84页第62页,a代表整个二维数组的首地址,即第0行的首地址a+1是数组a第1行首地址(208)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 地产保险考试题及答案
- 济南护理事业编考试题库及答案
- 中专护理实操考试题库及答案
- 张家界护理职称考试题库及答案
- 袋鼠科学考试题及答案
- 农牧合作社土地用途监管与使用协议
- 六年级写景作文南京玄武湖800字(7篇)
- 划拨土地买卖协议
- 秋日思念的深情抒情类作文15篇范文
- 技术支持流程标准话流程工具技术响应及时版
- 油气开采技术进步与挑战-洞察分析
- 小学生兴趣英语课件
- 【MOOC】国际金融学-湖南大学 中国大学慕课MOOC答案
- 九年级化学人教版基于特定需求设计和制作简易供氧器(教学设计)
- SCAMPER创新思维模型
- 乡镇庆中秋迎国庆活动方案
- 山东科学技术出版社小学一年级上册综合实践活动教案
- DL∕T 1281-2013 燃煤电厂固体废物贮存处置场污染控制技术规范
- 思念混声合唱简谱
- 家庭健康指导员培训方案及流程
- 机械制图教案(完整版)
评论
0/150
提交评论