《c语言程序设计基础》6指针课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《《c语言程序设计基础》6指针课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- c语言程序设计基础 语言程序设计 基础 指针 课件
- 资源描述:
-
1、第第6章章 指针指针2 第第6 6章章 指针指针本章内容本章内容 6.2 变量的指针和指针变量变量的指针和指针变量 6.3 指针运算指针运算 6.4 一维数组与指针一维数组与指针 6.1 地址与指针地址与指针 6.5 二维数组与指针二维数组与指针3第第6 6章章 指针指针本章内容本章内容 6.7 指针变量作函数的参数指针变量作函数的参数 6.8 函数与指针函数与指针 6.9 指向指针的指针变量指向指针的指针变量 6.6 字符数组与指针字符数组与指针 6.10 指针应用举例指针应用举例46.1 6.1 地址与指针地址与指针v内存就是内部存储器,是由存储单元组成的。我内存就是内部存储器,是由存储单
2、元组成的。我们需要对它编号,这个编号就是内存地址。们需要对它编号,这个编号就是内存地址。v如果在程序中定义了一个变量,在对程序进行编如果在程序中定义了一个变量,在对程序进行编译时,系统就会给这个变量分配具体的物理内存译时,系统就会给这个变量分配具体的物理内存单元。单元。v虽然程序中是通过变量名来对内存单元进行存取虽然程序中是通过变量名来对内存单元进行存取操作的,其实程序经过编译以后已经将变量名转操作的,其实程序经过编译以后已经将变量名转换为变量的地址,对变量值的存取都是通过地址换为变量的地址,对变量值的存取都是通过地址进行的。这种按变量地址存取变量值的方式称为进行的。这种按变量地址存取变量值的
3、方式称为“直接访问直接访问”方式。方式。56.1 6.1 地址与指针地址与指针v对应对应“直接访问直接访问”还有另外一种称之为还有另外一种称之为“间接访间接访问问”的变量值存取方法,将变量的地址存放在另的变量值存取方法,将变量的地址存放在另一个变量中,通过存放变量地址的变量存取变量一个变量中,通过存放变量地址的变量存取变量的值。的值。v什么是指针呢?什么是指针呢?C C语言规定变量的地址就是变量的语言规定变量的地址就是变量的指针。对于变量指针。对于变量a a和存放变量地址的变量和存放变量地址的变量a_pointera_pointer来讲,一个用于存放变量的数值来讲,一个用于存放变量的数值258
4、258,一个用于存放变量的地址一个用于存放变量的地址20002000,在这里的,在这里的a_pointera_pointer就是指针变量。就是指针变量。66.1 6.1 地址与指针地址与指针v内存地址内存地址:内存中存储单元的编号:内存中存储单元的编号v变量地址变量地址 :系统分配给变量内存单元的起始地址:系统分配给变量内存单元的起始地址 变量地址起指向作用,因此形象称地址是变量的变量地址起指向作用,因此形象称地址是变量的指针指针,即即地址就是指针,指针就是地址地址就是指针,指针就是地址 变量地址,还隐含变量地址,还隐含变量类型信息变量类型信息v指针指针:一个变量的地址就是该变量的指针:一个变
5、量的地址就是该变量的指针v指针变量指针变量 :专门存放变量地址的变量:专门存放变量地址的变量76.1 6.1 地址与指针地址与指针200020042006200520012002200386.1 6.1 地址与指针地址与指针v变量的地址就是变量的指针。存放变量地址的变变量的地址就是变量的指针。存放变量地址的变量是指针变量,它用来指向另一个变量。量是指针变量,它用来指向另一个变量。v为了表示指针变量和它所指向的变量之间的联系,为了表示指针变量和它所指向的变量之间的联系,在程序中用在程序中用“*”符号表示指向,它实际执行的是符号表示指向,它实际执行的是“间接访问间接访问”运算,如果已定义运算,如果
6、已定义a_pointera_pointer为指针为指针变量且存放变量且存放a a变量的地址,则变量的地址,则*a_pointera_pointer是是a_pointera_pointer所指向的变量。所指向的变量。v若若a a变量存放的值为变量存放的值为3 3,则,则a a代表代表3 3,a_pointera_pointer代代表表a a的地址,的地址,*a_pointera_pointer代表代表a a即即3 3。9 6.2 6.2 变量的指针和指针变量变量的指针和指针变量本节内容本节内容 6.2.2 指针变量的引用指针变量的引用 6.2.1 指针变量的定义指针变量的定义106.2.1 6.
7、2.1 指针变量的定义指针变量的定义v定义指针变量的一般形式为定义指针变量的一般形式为v基类型基类型 *指针变量名指针变量名;v下面都是合法的定义:下面都是合法的定义:vfloat float*pfpf;vchar char*pcpc;v可以用赋值语句使一个指针变量得到另一个变量可以用赋值语句使一个指针变量得到另一个变量的地址,从而使它指向该变量。的地址,从而使它指向该变量。pointer_ipointer_i&i&i;pointer_jpointer_j&j&j;将变量将变量i i的地址存放到的地址存放到pointer_ipointer_i中,因此中,因此pointer_ipointer_i
8、就就“指向指向”了变量了变量i i。116.2.1 6.2.1 指针变量的定义指针变量的定义v在定义指针变量时要注意两点:在定义指针变量时要注意两点:在定义指针变量时,指针变量名前面加在定义指针变量时,指针变量名前面加“*”表示该表示该变量的类型为指针型变量。指针变量名是变量的类型为指针型变量。指针变量名是pointer_ipointer_i、pointer_jpointer_j,而不是,而不是*pointer_ipointer_i、*pointer_jpointer_j。但在但在使使用用指针变量时,指针变量名前面加指针变量时,指针变量名前面加“*”表示进行间接表示进行间接寻址操作。寻址操作。
9、如有:如有:i=3;i=3;j=j=*pointer_ipointer_i;则则j j的值为的值为3 3。一个指针变量只能指向同一个类型的变量,不能忽而指一个指针变量只能指向同一个类型的变量,不能忽而指向一个整型变量,忽而指向一个实型变量。向一个整型变量,忽而指向一个实型变量。126.2.2 6.2.2 指针变量的引用指针变量的引用v指针变量同普通变量一样,在使用之前要先定义,指针变量同普通变量一样,在使用之前要先定义,但需注意的是指针变量定义后,变量值不确定,但需注意的是指针变量定义后,变量值不确定,应用前还必须先赋予具体的值。未经赋值的指针应用前还必须先赋予具体的值。未经赋值的指针变量是不
10、能使用的。变量是不能使用的。v未经赋值的指针变量叫做未经赋值的指针变量叫做“野指针野指针”,它的初始,它的初始值是随机的。如果未经赋值而对它随机指向的内值是随机的。如果未经赋值而对它随机指向的内存单元进行操作,可能产生存单元进行操作,可能产生严重后果严重后果。v指针变量只能赋予地址,绝不能赋予任何其他数指针变量只能赋予地址,绝不能赋予任何其他数据,否则将引起错误。据,否则将引起错误。136.2.2 6.2.2 指针变量的引用指针变量的引用v6.2.2.1 6.2.2.1 指针变量的初始化指针变量的初始化v指针变量初始化的一般形式为:指针变量初始化的一般形式为:v基类型基类型 *指针名指针名=初
11、始地址值;初始地址值;v在在C C语言中,变量的地址是由编译系统分配的,对语言中,变量的地址是由编译系统分配的,对用户完全透明,用户不知道变量的具体地址。下用户完全透明,用户不知道变量的具体地址。下面是两个有关指针变量的运算符。面是两个有关指针变量的运算符。v&:取地址运算符:取地址运算符v*:指针运算符:指针运算符(或称间接访问运算符或称间接访问运算符)intint a;a;intint *p=&a;p=&a;/p/p指向指向a a*p=10;p=10;/相当于相当于 a=10;a=10;146.2.2 6.2.2 指针变量的引用指针变量的引用#include main()char x,y;
12、char*p1,*p2;x=a;y=b;p1=&x;/把变量x的地址赋给p1p2=&y;/把变量y的地址赋给p2printf(%c,%cn,x,y);printf(%c,%cn,*p1,*p2);156.2.2 6.2.2 指针变量的引用指针变量的引用v下面对下面对“&”&”和和“*”运算符再作些说明:运算符再作些说明:v如果已执行了语句如果已执行了语句plpl&x&x;&*plpl的含义是什么的含义是什么?先进行先进行*p1p1的运算,它就是变量的运算,它就是变量x x,再执行,再执行&运算。运算。因此,因此,&*plpl与与&x&x相同,即变量相同,即变量x x的地址。的地址。v*&x&x
13、的含义是什么的含义是什么?先进行先进行&x&x运算,得运算,得x x的地址,的地址,再进行再进行*运算,即运算,即&x&x所指向的变量,也就是变量所指向的变量,也就是变量x x。即即*&x&x和和*plpl的作用是一样的,它们都等价于变量的作用是一样的,它们都等价于变量x x,即即 *&x&x与与x x等价。等价。v如果如果p2p2&*p1p1;它的作用是将;它的作用是将&x(xx(x的地址的地址)赋给赋给p2p2,如果如果p2p2原来指向原来指向y y,经过重新赋值后它已不再指向,经过重新赋值后它已不再指向y y了,而指向了了,而指向了x x。166.2.2 6.2.2 指针变量的引用指针变
14、量的引用v(*p1)+p1)+相当于相当于x+x+。如果没有括号,就成为了。如果没有括号,就成为了*p1+p1+,它相当于,它相当于*(p1+)(p1+)。由于。由于+在在p1p1的右侧,的右侧,是是“后加后加”,因此先对,因此先对p1p1的原值进行的原值进行*运算,得到运算,得到x x的值,然后使的值,然后使p1p1的值改变,这样的值改变,这样p1p1不再指向不再指向x x了。了。176.2.2 6.2.2 指针变量的引用指针变量的引用#include main()int*p1,*p2,*p,x,y;scanf(%d,%d,&x,&y);p1=&x;p2=&y;if(xy)p=p1;p1=p
15、2;p2=p;printf(x=%d y=%dn,x,y);printf(min=%d max=%dn,*p1,*p2);186.2.2 6.2.2 指针变量的引用指针变量的引用v6.2.2.2 6.2.2.2 指针变量的赋值指针变量的赋值vint xint x;vint int*p p;v若需要通过指针变量若需要通过指针变量p p来操作来操作x x,那么可以先让,那么可以先让p p指指向向x x,这只要将,这只要将x x的地址赋予的地址赋予p p p=&x;p=&x;196.2.2 6.2.2 指针变量的引用指针变量的引用v在对指针变量赋值时,要注意以下问题:在对指针变量赋值时,要注意以下问
16、题:v在将一个普通变量的地址赋值给指针变量时,在将一个普通变量的地址赋值给指针变量时,要注意普通变量,必须先定义,再使用。要注意普通变量,必须先定义,再使用。v不能将一般的普通变量,例如整型变量赋给指不能将一般的普通变量,例如整型变量赋给指针变量,指针变量也不能赋给普通变量;针变量,指针变量也不能赋给普通变量;v可以将一个指针的值赋给另一个指针变量;可以将一个指针的值赋给另一个指针变量;v可以为一个指针赋值为可以为一个指针赋值为NULLNULL。intint *p=NULL;p=NULL;避免避免对对没有没有被初始化被初始化指针变量的非法指针变量的非法引用引用 voidvoid指针指针 例例
17、void void *p p 不指定不指定p p是指向哪一种类型数据是指向哪一种类型数据的指针变的指针变量量20 6.3 6.3 指针运算指针运算本节内容本节内容 6.3.2 指针的逻辑运算指针的逻辑运算 6.3.1 指针的算数运算指针的算数运算216.3.1 6.3.1 指针的算数运算指针的算数运算v指针除了可以参与赋值和间接访问之外,只能进指针除了可以参与赋值和间接访问之外,只能进行加减运算和比较运算。在这些运算中,基类型行加减运算和比较运算。在这些运算中,基类型起着决定性的作用。起着决定性的作用。v6.3.1.1 6.3.1.1 自加和自减运算自加和自减运算v指针变量可以进行自加和自减运
18、算。指针变量可以进行自加和自减运算。float xfloat x,*p p;p=&xp=&x;v假定变量假定变量x x的内存起始地址为的内存起始地址为20002000,现在进行如下,现在进行如下运算:运算:p+p+;但运算后但运算后p p的值并不是的值并不是20012001,而是,而是2004 2004 226.3.1 6.3.1 指针的算数运算指针的算数运算v6.3.1.2 6.3.1.2 与自加和自减相关的运算与自加和自减相关的运算 float xfloat x,y y,*p p;p=&xp=&x;假定假定x x,y y在内存中连续存储,且在内存中连续存储,且x x的内存起始地址为的内存起
19、始地址为20002000,借此我们讨论几种常见的指针运算。,借此我们讨论几种常见的指针运算。v*p+p+和和*(p+)(p+)由于由于+运算与运算与*运算优先级别相同,但结合次序都是由运算优先级别相同,但结合次序都是由右至左,故这二个表达式具有相同含义。又因为表达式右至左,故这二个表达式具有相同含义。又因为表达式p+p+的值为的值为p p加加1 1运算之前的值,因此,此表达式等同于运算之前的值,因此,此表达式等同于变量变量x x。不过,在计算完此表达是后,。不过,在计算完此表达是后,p p加加1 1,指向,指向y y。236.3.1 6.3.1 指针的算数运算指针的算数运算v*+p+p和和*(
20、+p)(+p)这是两个完全等同的表达式。因为表达式这是两个完全等同的表达式。因为表达式+p+p的值为的值为p p加加1 1运算后的值,等于运算后的值,等于&y&y,指向,指向y y,因此原表达式等同于变,因此原表达式等同于变量量y y。v(*p)+p)+由于变量由于变量*p p与变量与变量x x等价,此表达式相当于等价,此表达式相当于x+x+。v+(+(*p)p)此表达式与此表达式与+x+x等价,表达式计算后,等价,表达式计算后,p p的值不变。的值不变。246.3.1 6.3.1 指针的算数运算指针的算数运算v6.3.1.3 6.3.1.3 加减算术运算加减算术运算v指针只可以与指针和整数进
21、行部分加减算术运算。指针只可以与指针和整数进行部分加减算术运算。指针与整数的加减法指针与整数的加减法 指针可以与整数进行加减法运算,结果仍是指针。指针可以与整数进行加减法运算,结果仍是指针。p=p+1p=p+1;p+p+;两者作用相同,相当于指针移过一个两者作用相同,相当于指针移过一个由基类型所定义的位移量。由基类型所定义的位移量。整数与指针的加减法整数与指针的加减法 一个整数与指针的加减法结果仍是指针,但整数不能与一个整数与指针的加减法结果仍是指针,但整数不能与指针进行减法运算,即类似指针进行减法运算,即类似5-p5-p形式的表达式是错误的。形式的表达式是错误的。指针与指针的加减法指针与指针
22、的加减法 两个指针不能进行加法运算,结果没有意义。两个指针两个指针不能进行加法运算,结果没有意义。两个指针的减法是允许的,但结果不再是指针而是一个整数,表的减法是允许的,但结果不再是指针而是一个整数,表示两个地址之间的距离。示两个地址之间的距离。256.3.2 6.3.2 指针的逻辑运算指针的逻辑运算v指针的逻辑运算相对简单,可以使用关系运算符指针的逻辑运算相对简单,可以使用关系运算符比较两个指针的大小,但通常是在两个指针指向比较两个指针的大小,但通常是在两个指针指向同一目标,如一个数组或一内存块时才使用。特同一目标,如一个数组或一内存块时才使用。特别的,可以将一个指针与别的,可以将一个指针与
23、0 0或或NULLNULL进行比较,以测进行比较,以测试该指针是否已指向某一确定的内存地址。试该指针是否已指向某一确定的内存地址。26 6.4 6.4 一维数组与指针一维数组与指针本节内容本节内容 6.4.2 指向数组的指针变量的运算指向数组的指针变量的运算 6.4.1 通过指针引用一维数组元素通过指针引用一维数组元素276.4 6.4 一维数组与指针一维数组与指针1 1200020003 35 520042004 20082008a0a0 a1a1 a2a2=20002000a a数组代表类型相同、连续存放数组代表类型相同、连续存放连续连续数组名代表地址数组名代表地址地址地址数组名代表常量数
24、组名代表常量常量常量286.4.1 6.4.1 通过指针引用一维数组元素通过指针引用一维数组元素vintint a10 a10;*p p;v因为数组因为数组a a为为intint型,所以指向该数组的指针变量型,所以指向该数组的指针变量也应该为也应该为intint型的指针变量。下面两种对指针变量型的指针变量。下面两种对指针变量赋值的方法是一样的:赋值的方法是一样的:vp=&a0;p=&a0;或或 p=ap=a;v表示把表示把a0a0元素的地址赋给指针变量元素的地址赋给指针变量p p。或者说。或者说p p指向指向a a数组的第数组的第0 0号元素。号元素。vp p,a a,&a0&a0都指向同一单
25、元,它们都是数组都指向同一单元,它们都是数组a a的的首地址,也是数组首地址,也是数组a a的的0 0号元素号元素a0a0的首地址。但的首地址。但需要注意的是:需要注意的是:p p是变量,而是变量,而a a和和&a0&a0都是常量,都是常量,所以不能进行所以不能进行a+a+或或+a+a之类的操作。之类的操作。296.4.1 6.4.1 通过指针引用一维数组元素通过指针引用一维数组元素v在在C C语言中,如果指针变量语言中,如果指针变量p p已指向数组中的一个已指向数组中的一个元素,则元素,则p+1p+1指向同一个数组中的下一个元素。指向同一个数组中的下一个元素。v如果如果p p的初值为的初值为
展开阅读全文