《c语言教学资料》6指针.ppt
《《c语言教学资料》6指针.ppt》由会员分享,可在线阅读,更多相关《《c语言教学资料》6指针.ppt(74页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
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在程序中定义一个变量,在程序中定义一个变量,在对程序进行编译时,系在对程序进行编译时,系统就会给这个变量分配具统就会给这个变量分配具体的内存单元。这个单元体的内存单元。这个单元有个地址,变量名和其地有个地址,变量名和其地址对应。址对应。2000Ha556.1 6.1 地址与指针地址与指针v在程序中我们是通过变量名来对在程序中我们是通过变量名来对内存单元进行存取操作的。内存单元进行存取操作的。这种这种按变量名存取变量值的方式称为按变量名存取变量值的方式称为“直接访问直接访问”方式。方式。v例如:例如:a=5;a=5;v b
3、=a;b=a;v其实程序经过编译以后已经将变其实程序经过编译以后已经将变量名转换为变量的地址,对变量量名转换为变量的地址,对变量值的存取都是通过地址进行的。值的存取都是通过地址进行的。2000Ha5b52004H66.1 6.1 地址与指针地址与指针v还有一种还有一种“间接访问间接访问”变量值变量值的方法:将的方法:将a a变量的地址存放在另变量的地址存放在另一个专门存放地址的变量一个专门存放地址的变量papa中,中,通过通过papa变量存取变量存取a a变量的值。变量的值。v例如:变量例如:变量a a存放数值存放数值5;5;变量变量papa存放存放a a变量的地址变量的地址2000H2000
4、H。vb=*pa;b=*pa;v什么是指针呢?什么是指针呢?变量的地址(编变量的地址(编号)就是变量的指针号)就是变量的指针。存放地址存放地址的变量就是指针变量。的变量就是指针变量。在这里的在这里的papa就是指针变量。就是指针变量。2000Ha5pa3020H 2000Hb576.1 6.1 地址与指针地址与指针v指针变量指针变量用来指向另一个变量。用来指向另一个变量。v为了表示指针变量和它所指向的变量之间的联系,为了表示指针变量和它所指向的变量之间的联系,在程序中用在程序中用“*”“*”符号表示指向(取指针内容),符号表示指向(取指针内容),它实际执行的是它实际执行的是“间接访问间接访问”
5、运算,如果已定义运算,如果已定义papa为指针变量且存放为指针变量且存放a a变量的地址,则变量的地址,则*papa是是papa所所指向的变量。指向的变量。*papa等价于等价于a a。v若若a a变量存放的值为变量存放的值为5 5,则,则a a代表代表5 5,papa代表代表a a的地址,的地址,*papa代表代表a a,就是,就是5 5。8 6.2 6.2 变量的指针和指针变量变量的指针和指针变量本节内容本节内容 6.2.2 指针变量的引用指针变量的引用 6.2.1 指针变量的定义指针变量的定义96.2.1 6.2.1 指针变量的定义指针变量的定义v定义指针变量的一般形式为定义指针变量的一
6、般形式为 基类型基类型*指针变量名指针变量名;v下面都是合法的定义:下面都是合法的定义:vfloat*pffloat*pf;vchar c,*pcchar c,*pc;v可以用赋值语句使一个指针变量得到另一个变量可以用赋值语句使一个指针变量得到另一个变量的地址,从而使它指向该变量。例如:的地址,从而使它指向该变量。例如:vpc=&c;pc=&c;将变量将变量c c的地址存放到的地址存放到pcpc中,因此中,因此pcpc就就“指向指向”了变量了变量c c。106.2.1 6.2.1 指针变量的定义指针变量的定义v在定义指针变量时要注意两点:在定义指针变量时要注意两点:在定义指针变量时,在定义指针
7、变量时,指针变量名前面加指针变量名前面加“*”“*”表示该表示该变量的类型为指针型变量。变量的类型为指针型变量。但但在使用指针变量时,在使用指针变量时,指针变量名前面加指针变量名前面加“*”“*”表示进表示进行间接寻址操作(取指针内容)。行间接寻址操作(取指针内容)。如有:如有:int i=3,j,*pi;int i=3,j,*pi;“*”“*”表示表示pipi的类型为指针型变量的类型为指针型变量pi=&i;pi=&i;j=*pi;j=*pi;“*”“*”表示取指针表示取指针pipi所指变量的值所指变量的值结果:结果:j j的值为的值为3 3。一个指针变量只能指向定义时指定的基类型的变量,一个
8、指针变量只能指向定义时指定的基类型的变量,不能忽而指向一个整型变量,忽而指向一个实型变量。不能忽而指向一个整型变量,忽而指向一个实型变量。116.2.2 6.2.2 指针变量的引用指针变量的引用v指针变量同普通变量一样,在使用之前要先定义,指针变量同普通变量一样,在使用之前要先定义,但需注意的是指针变量定义后,变量值不确定,但需注意的是指针变量定义后,变量值不确定,应用前还必须先赋予具体的值。未经赋值的指针应用前还必须先赋予具体的值。未经赋值的指针变量是不能使用的。变量是不能使用的。v未经赋值的指针变量叫做未经赋值的指针变量叫做“野指针野指针”,它的初始,它的初始值是随机的。如果未经赋值而对它
9、随机指向的内值是随机的。如果未经赋值而对它随机指向的内存单元进行操作,可能产生存单元进行操作,可能产生严重后果严重后果。v指针变量只能赋予地址,绝不能赋予任何其他数指针变量只能赋予地址,绝不能赋予任何其他数据,否则将引起错误。据,否则将引起错误。126.2.2 6.2.2 指针变量的引用指针变量的引用v6.2.2.1 6.2.2.1 指针变量的初始化指针变量的初始化v指针变量初始化的一般形式为:指针变量初始化的一般形式为:基类型基类型 *指针名指针名=初始地址值;初始地址值;v变量的地址是由编译系统内部分配的,用户不知变量的地址是由编译系统内部分配的,用户不知道变量的具体地址,所以不能直接给出
10、地址值,道变量的具体地址,所以不能直接给出地址值,只能通过运算获得。有两个有关指针的运算符:只能通过运算获得。有两个有关指针的运算符:v&:取地址运算符:取地址运算符v*:指针运算符:指针运算符(取指针内容运算符取指针内容运算符)intint a,*pa=&a;a,*pa=&a;/用用&取取a a的地址,的地址,papa指向指向a a变量变量*pa=10;*pa=10;/给给papa所指向的变量(所指向的变量(a a)赋值)赋值136.2.2 6.2.2 指针变量的引用指针变量的引用#include main()char x,y;char*p1,*p2;x=a;y=b;p1=&x;/把变量x的
11、地址赋给p1p2=&y;/把变量y的地址赋给p2printf(%c,%cn,x,y);printf(%c,%cn,*p1,*p2);【例例6-1】通过指针变量访通过指针变量访问字符型变量。问字符型变量。146.2.2 6.2.2 指针变量的引用指针变量的引用v“&”&”和和“*”“*”是互逆运算(可以抵消):是互逆运算(可以抵消):&*p1&*p1的含义是什么的含义是什么?先进行先进行*p1p1的运算,它就是变量的运算,它就是变量x x,再执行,再执行&运算就是运算就是&x&x。因此,因此,&*p1&*p1与与&x&x等价,也与等价,也与p1p1等价等价,表示变量,表示变量x x的的地址地址。
12、*&x&x的含义是什么的含义是什么?先进行先进行&x&x运算,得运算,得x x的地址,再进行的地址,再进行*运算,得到运算,得到&x&x所指所指向变量向变量x x。可见。可见*&x&x和和*p1p1以及变量以及变量x x是等价的是等价的,即,即 *&x&x与与x x等价等价,表示变量,表示变量x x的的值值。p2p2&*p1&*p1;它的作用是将它的作用是将&x(x&x(x的地址的地址)赋给赋给p2p2,与与p2=p1;p2=p1;等价等价。如。如果果p2p2原来指向原来指向y y,经过重新赋值后它已不再指向,经过重新赋值后它已不再指向y y了,而了,而指向了指向了x x。156.2.2 6.
13、2.2 指针变量的引用指针变量的引用v(*p1)+(*p1)+v相当于相当于x+x+。p1p1仍指向仍指向x x。结果。结果x x的值加的值加1 1。X X的值变为的值变为bb。v*p1+p1+,v相当于相当于*(p1+)(p1+)。v由于由于+在在p1p1的右侧,是的右侧,是“后加后加”,因此首先对,因此首先对p1p1的原值进行的原值进行*运运算,得到算,得到x x的值。式子的取值为:的值。式子的取值为:aa。v然后使然后使p1p1的值改变,这样的值改变,这样p1p1不再不再指向指向x x了,而是指向了了,而是指向了y y变量。变量。2000Hxap13020H 2000Hyb2001H16
14、6.2.2 6.2.2 指针变量的引用指针变量的引用3 3变量变量变量变量i i20002000pipi*pipii i*pipi&i&ipipii=3;i=3;*pi=3;pi=3;pipi =&i&i =&(*pi)&(*pi)i i =*pi*pi =*(&i)*(&i)是值是值值的几种形式值的几种形式是地址是地址地址的几种形式地址的几种形式是赋值操作是赋值操作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=p2;p2=p;p
15、rintf(x=%d y=%dn,x,y);printf(min=%d max=%dn,*p1,*p2);【例例6-2】输输入入x和和y两个整两个整数,按从小到数,按从小到大的顺序输出大的顺序输出x和和y。186.2.2 6.2.2 指针变量的引用指针变量的引用ppp1p1p2p2xxyy&x&x&y&y612126&x交换前交换前交换后交换后196.2.2 6.2.2 指针变量的引用指针变量的引用v6.2.2.2 6.2.2.2 指针变量的赋值指针变量的赋值vint xint x;vint*pint*p;v若需要通过指针变量若需要通过指针变量p p来操作来操作x x,那么可以先让,那么可以先
16、让p p指指向向x x,这只要将,这只要将x x的地址赋予的地址赋予p p p=&x;p=&x;206.2.2 6.2.2 指针变量的引用指针变量的引用v在对指针变量赋值时,要注意以下问题:在对指针变量赋值时,要注意以下问题:v在将一个普通变量的地址赋值给指针变量时,在将一个普通变量的地址赋值给指针变量时,普通变量必须先定义,再使用。例如:普通变量必须先定义,再使用。例如:int*p=&x;/xint*p=&x;/x变量还未定义变量还未定义v不能将一般的普通变量,例如整型变量赋给指不能将一般的普通变量,例如整型变量赋给指针变量,指针变量也不能赋给普通变量。例如:针变量,指针变量也不能赋给普通变
17、量。例如:int x=3,y,int x=3,y,*p;p;p=x;p=x;/错误错误 p=&y;/p=&y;/可以可以 x=p;/x=p;/错误错误216.2.2 6.2.2 指针变量的引用指针变量的引用v可以将一个指针的值赋给另一个指针变量;可以将一个指针的值赋给另一个指针变量;int x=3,y,int x=3,y,*p1p1,*p2;p2;p1=&x;p1=&x;p2=p1;/p2=p1;/可以可以v可以为一个指针赋值为可以为一个指针赋值为NULLNULL。int *p=NULL;int *p=NULL;可以可以可以可以避免避免因为误因为误引用引用没有没有被初始化被初始化的指针变量的指
18、针变量造成的严造成的严重问题。重问题。22 6.3 6.3 指针运算指针运算本节内容本节内容 6.3.2 指针的逻辑运算指针的逻辑运算 6.3.1 指针的算数运算指针的算数运算236.3.1 6.3.1 指针的算数运算指针的算数运算v指针除了可以参与赋值和间接访问之外,只能进指针除了可以参与赋值和间接访问之外,只能进行加减运算和比较运算。在这些运算中,基类型行加减运算和比较运算。在这些运算中,基类型起着决定性的作用。起着决定性的作用。v6.3.1.1 6.3.1.1 自加和自减运算自加和自减运算v指针变量可以进行自加和自减运算。指针变量可以进行自加和自减运算。float xfloat x,*p
19、 p;p=&xp=&x;v假定变量假定变量x x的内存起始地址为的内存起始地址为20002000,进行如下运算:,进行如下运算:p+p+;运算后运算后p p的值并不是的值并不是20012001,而是,而是20042004。因为基类型的数。因为基类型的数据占四个字节。据占四个字节。246.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的内存起始地址为的内存起始地址为20002000,借
20、此我们讨论几种常见的指针运算。,借此我们讨论几种常见的指针运算。v*p+p+和和*(p+)(p+)由于由于+运算与运算与*运算优先级别相同,但结合次序都是由运算优先级别相同,但结合次序都是由右至左,故这二个表达式具有相同含义。又因为表达式右至左,故这二个表达式具有相同含义。又因为表达式p+p+的值为的值为p p加加1 1运算之前的值,因此,运算之前的值,因此,此表达式等同于此表达式等同于变量变量x x。不过,在计算完此表达是后,。不过,在计算完此表达是后,p p加加1 1,指向,指向y y。256.3.1 6.3.1 指针的算数运算指针的算数运算v*+p+p和和*(+p)(+p)这是两个完全等
21、同的表达式。因为表达式这是两个完全等同的表达式。因为表达式+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的值不变。的值不变。266.3.1 6.3.1 指针的算数运算指针的算数运算v6.3.1.3 6.3.1.3 加减算术运算加减算术运算v指针只可以与指针和整数进行部分加减算术运算。指针只可
22、以与指针和整数进行部分加减算术运算。指针与整数的加减法指针与整数的加减法指针可以与整数进行加减法运算,结果仍是指针。指针可以与整数进行加减法运算,结果仍是指针。p=p+1p=p+1;p+p+;两者作用相同,相当于指针移过一个两者作用相同,相当于指针移过一个由基类型所定义的位移量。由基类型所定义的位移量。整数与指针的加减法整数与指针的加减法一个整数与指针的加法结果仍是指针,但整数不能与指一个整数与指针的加法结果仍是指针,但整数不能与指针进行减法运算,即类似针进行减法运算,即类似5-p5-p形式的表达式是错误的。形式的表达式是错误的。指针与指针的加减法指针与指针的加减法两个指针不能进行加法运算,结
23、果没有意义。两个指针两个指针不能进行加法运算,结果没有意义。两个指针的减法是允许的,但结果不再是指针而是一个整数,表的减法是允许的,但结果不再是指针而是一个整数,表示两个地址之间的距离。示两个地址之间的距离。276.3.2 6.3.2 指针的逻辑运算指针的逻辑运算v指针的逻辑运算相对简单,可以使用关系运算符指针的逻辑运算相对简单,可以使用关系运算符比较两个指针的大小,但通常是在两个指针指向比较两个指针的大小,但通常是在两个指针指向同一目标,如一个数组或一内存块时才使用。同一目标,如一个数组或一内存块时才使用。v可以将一个指针与可以将一个指针与0 0或或NULLNULL进行比较,以测试该指进行比
24、较,以测试该指针是否已指向某一确定的内存地址。针是否已指向某一确定的内存地址。28 6.4 6.4 一维数组与指针一维数组与指针本节内容本节内容 6.4.2 指向数组的指针变量的运算指向数组的指针变量的运算 6.4.1 通过指针引用一维数组元素通过指针引用一维数组元素296.4 6.4 一维数组与指针一维数组与指针1 1200020003 35 520042004 20082008a0a0 a1a1 a2a2=20002000a a数组代表类型相同、连续存放数组代表类型相同、连续存放连续连续数组名代表地址数组名代表地址地址地址数组名代表常量数组名代表常量常量常量306.4.1 6.4.1 通过
25、指针引用一维数组元素通过指针引用一维数组元素v可以定义一个指向数组元素的指针变量,其方法可以定义一个指向数组元素的指针变量,其方法与以前介绍的定义指针变量的方法相同。例如:与以前介绍的定义指针变量的方法相同。例如:vint a3,*pint a3,*p;v因为数组因为数组a a为为intint型,所以指向该数组元素的指针型,所以指向该数组元素的指针变量也应该为变量也应该为intint型的指针变量。下面两种对指针型的指针变量。下面两种对指针变量赋值的方法是一样的:变量赋值的方法是一样的:vp=&a0;p=&a0;或或 p=ap=a;v表示把表示把a0a0元素的地址赋给指针变量元素的地址赋给指针变
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- c语言教学资料 语言 教学 资料 指针
限制150内