第三版C语言PPT课件讲解第10章+指针.ppt
《第三版C语言PPT课件讲解第10章+指针.ppt》由会员分享,可在线阅读,更多相关《第三版C语言PPT课件讲解第10章+指针.ppt(90页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第三版第三版C语言语言PPT课件课件讲解第讲解第10章章+指针指针一个比方一个比方:旅旅 客客 变量数据变量数据 旅旅 客客 名名 字字 变量名变量名 旅馆房间旅馆房间 内内 存存 区区 旅馆房间号旅馆房间号 地地 址址 查找旅客查找旅客:旅客名字:旅客名字房间号码房间号码房房 间间找到旅客找到旅客 存取数据存取数据:变量名变量名 内存地址内存地址内存区内存区数数 据据注意注意:内存单元的地址内存单元的地址与与内存单元的内容内存单元的内容是不同的。是不同的。内存单元内存单元地址地址旅馆房间旅馆房间号码号码 内存单元内存单元内容内容住在房间内的住在房间内的旅客旅客。内存地址内存地址 331 22
2、0 2000 2002 20042006内存用户数据区内存用户数据区内存中存内存中存放的数据放的数据3、数据存取举例、数据存取举例 设程序中已定义三个整型变量设程序中已定义三个整型变量设程序中已定义三个整型变量设程序中已定义三个整型变量 i i,j j,k k,编译时系统将,编译时系统将,编译时系统将,编译时系统将20002000和和和和20012001两个字节给变量两个字节给变量两个字节给变量两个字节给变量i i ,20022002、20032003给给给给j j,20042004、20052005给给给给k k。内存。内存。内存。内存分配示意图如下分配示意图如下分配示意图如下分配示意图如下
3、 内存地址内存地址3 6 9 2000 2002 2004内存用户数据区内存用户数据区变量变量 i i 变量变量 j j 变量变量 k kprintf(“%d”,i)printf(“%d”,i)变量名变量名变量名变量名i i 地址地址地址地址2000 2000 取变量值取变量值取变量值取变量值3 3 送到送到送到送到PRNPRNk=i+jk=i+j 变量名变量名变量名变量名i i 地址地址地址地址2000 2000 取变量值取变量值取变量值取变量值3 3 变量名变量名变量名变量名j j 地址地址地址地址2002 2002 取变量值取变量值取变量值取变量值6 6 相加得相加得9 送到送到K占用的
4、占用的2004,20054、直接访问与间接访问、直接访问与间接访问 直接访问:直接访问:在数据存取中,直接得到变量在数据存取中,直接得到变量 i 地址然后按变量地址然后按变量 i 的地址存取变量的地址存取变量 i 的值的方式。的值的方式。间接访问:间接访问:在数据存放中,变量在数据存放中,变量 i 的地址不是直接得到,的地址不是直接得到,而是而是存放在另一个变量存放在另一个变量i_pointer中,须先从变量中,须先从变量i_pointer中中 获取变量获取变量 i 地址,然后按变量地址,然后按变量i地址存取变量值地址存取变量值i的方式。的方式。一个比方(取抽屉一个比方(取抽屉A中的东西):中
5、的东西):直接访问:直接访问:直接得到钥匙直接得到钥匙A 打开抽屉打开抽屉A,取出东西,取出东西(直接获得变量(直接获得变量 i 地址地址按变量按变量 i 地址存取变量的地址存取变量的 i 值值)间接访问:间接访问:钥匙钥匙A在抽屉在抽屉B中中用钥匙用钥匙B打开抽屉打开抽屉B得到钥匙得到钥匙A打开抽屉打开抽屉A取得东西取得东西变量变量i地址放在地址放在 变变量量i_pointer中中读取变量读取变量i_pointer值得到变量值得到变量i的地址的地址按变量按变量i地址存取地址存取i值值*间接访问例子间接访问例子间接访问例子间接访问例子过程:根据变量名过程:根据变量名过程:根据变量名过程:根据变
6、量名i_pointeri_pointer获得地址获得地址获得地址获得地址30103010,到地址,到地址,到地址,到地址30103010 读取数据,得到读取数据,得到读取数据,得到读取数据,得到20002000(变量(变量(变量(变量i i的地址),到的地址),到的地址),到的地址),到20002000地地地地 址读取数据,得到变量址读取数据,得到变量址读取数据,得到变量址读取数据,得到变量i i的值。的值。的值。的值。内存地址内存地址3 6 92000 2000 2002 20043010内存用户数据区内存用户数据区变量变量 i i变量变量 j j变量变量 k k变量变量 i_pointer
7、i_pointer5 5、指针和指针变量、指针和指针变量、指针和指针变量、指针和指针变量指针:指针:指针:指针:一个变量的在内存区中的一个变量的在内存区中的一个变量的在内存区中的一个变量的在内存区中的地址地址地址地址称为指针。通过变量的指称为指针。通过变量的指称为指针。通过变量的指称为指针。通过变量的指 针,可以找到变量的存储单元,从而读取其中存放的值;针,可以找到变量的存储单元,从而读取其中存放的值;针,可以找到变量的存储单元,从而读取其中存放的值;针,可以找到变量的存储单元,从而读取其中存放的值;指针变量:指针变量:指针变量:指针变量:专门用来存放指针的专门用来存放指针的专门用来存放指针的
8、专门用来存放指针的变量变量变量变量,称为指针变量。指针变,称为指针变量。指针变,称为指针变量。指针变,称为指针变量。指针变 量存放的数据为量存放的数据为量存放的数据为量存放的数据为另一变量的地址另一变量的地址另一变量的地址另一变量的地址(指针)。(指针)。(指针)。(指针)。注意:指针与指针变量的区别注意:指针与指针变量的区别注意:指针与指针变量的区别注意:指针与指针变量的区别 指针指针指针指针是一个是一个是一个是一个地址地址地址地址,用于指向存放变量数据的内存单元;,用于指向存放变量数据的内存单元;,用于指向存放变量数据的内存单元;,用于指向存放变量数据的内存单元;指针变量指针变量指针变量指
9、针变量是一个是一个是一个是一个变量变量变量变量,它的值是指针,它的值是指针,它的值是指针,它的值是指针 例如:例如:例如:例如:变量变量变量变量 i i 的的的的地址地址地址地址20002000为该变量的为该变量的为该变量的为该变量的指针指针指针指针,变量,变量,变量,变量i_pointeri_pointer是是是是 用来存放用来存放用来存放用来存放 变量变量变量变量i i的指针的,它是一个的指针的,它是一个的指针的,它是一个的指针的,它是一个指针变量指针变量指针变量指针变量。10.2 10.2 变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量指针指针指针指针:它首先是一个地址,是
10、指变量在内存中的:它首先是一个地址,是指变量在内存中的:它首先是一个地址,是指变量在内存中的:它首先是一个地址,是指变量在内存中的地址地址地址地址 ;指针变量指针变量指针变量指针变量:它是一个变量,是一个专门:它是一个变量,是一个专门:它是一个变量,是一个专门:它是一个变量,是一个专门存放变量地址存放变量地址存放变量地址存放变量地址的的的的 变量变量变量变量,用来指向另一个变量。,用来指向另一个变量。,用来指向另一个变量。,用来指向另一个变量。为了表示指针变量和它所指向的变量之间的联系,为了表示指针变量和它所指向的变量之间的联系,为了表示指针变量和它所指向的变量之间的联系,为了表示指针变量和它
11、所指向的变量之间的联系,在程序中用在程序中用在程序中用在程序中用“”表示表示表示表示“指向指向指向指向”例:例:例:例:i_pointeri_pointer代表指针变量,而代表指针变量,而代表指针变量,而代表指针变量,而i_pointeri_pointer是是是是i_pointeri_pointer所指所指所指所指向的变量。如下图所示:向的变量。如下图所示:向的变量。如下图所示:向的变量。如下图所示:i_pointeri_pointer200032000i ii_pointer与与 i 是等效的,都是等效的,都表示同一变量,该变量存放表示同一变量,该变量存放地址为地址为2000。因此:。因此:
12、i3;i_pointer3两语句作用相同两语句作用相同10.2.1定义一个指针变量定义一个指针变量例例:int i,j;int pointer_1,pointer_2;第一条命令定义了两个整型变量第一条命令定义了两个整型变量 i,j;第二条命令定义了第二条命令定义了 两个指针变量两个指针变量 pointer_1,pointer_2,它们,它们指向整型变量;指向整型变量;两个整型变量两个整型变量pointer_1,pointer_2,它们与它们与 i,j为相同类型,被为相同类型,被pointer_1,pointer_2两个指针所指向;两个指针所指向;基类型基类型:指针变量的基类型是指该指针变量可
13、以指向的变量指针变量的基类型是指该指针变量可以指向的变量的类型;的类型;定义指针变量的一般形式定义指针变量的一般形式:基类型基类型 指针变量名指针变量名例:例:float pointer_3;(pointer_3是指向实型变量的指针变量)是指向实型变量的指针变量)char pointer_4;(pointer_4是指向字符型变量的指针变量)是指向字符型变量的指针变量)指针变量指向的改变:指针变量指向的改变:指针变量指向的改变:指针变量指向的改变:方法:方法:方法:方法:将一个该指针将一个该指针将一个该指针将一个该指针允许指向允许指向允许指向允许指向的变量的的变量的的变量的的变量的地址地址地址地
14、址赋给该指针;赋给该指针;赋给该指针;赋给该指针;pointer_1=&ipointer_1ipointer_1i执行赋值语句之前执行赋值语句之前执行赋值语句之后执行赋值语句之后定义指针变量时应注意的两点:定义指针变量时应注意的两点:定义指针变量时应注意的两点:定义指针变量时应注意的两点:(1 1)“”表明它后面所跟的变量类型是指针型变量;需要指表明它后面所跟的变量类型是指针型变量;需要指表明它后面所跟的变量类型是指针型变量;需要指表明它后面所跟的变量类型是指针型变量;需要指出的,出的,出的,出的,指针变量名指针变量名指针变量名指针变量名为为为为pointer_1pointer_1,而不是,而
15、不是,而不是,而不是pointer_1pointer_1,pointer_1pointer_1是一个是一个是一个是一个整型变量整型变量整型变量整型变量;(2 2)在定义指针变量时必须指定基类型。因为不同数据类型在定义指针变量时必须指定基类型。因为不同数据类型在定义指针变量时必须指定基类型。因为不同数据类型在定义指针变量时必须指定基类型。因为不同数据类型占用的内存空间大小不同,在进行指针移动和运算时,将导占用的内存空间大小不同,在进行指针移动和运算时,将导占用的内存空间大小不同,在进行指针移动和运算时,将导占用的内存空间大小不同,在进行指针移动和运算时,将导致不同的结果。如致不同的结果。如致不同
16、的结果。如致不同的结果。如“指针值指针值指针值指针值1 1”,对于基类型为,对于基类型为,对于基类型为,对于基类型为整型整型整型整型,将向,将向,将向,将向后移动后移动后移动后移动两个两个两个两个字节,对于基类型为字节,对于基类型为字节,对于基类型为字节,对于基类型为实型实型实型实型,将向后移动,将向后移动,将向后移动,将向后移动四个四个四个四个字节;字节;字节;字节;10.2.2指针变量的引用指针变量的引用WARNING:指针变量中只能存放地址(指针),不能把其它类型的数指针变量中只能存放地址(指针),不能把其它类型的数 据赋给指针变量。据赋给指针变量。例例:pointer_1为指针变量为指
17、针变量 pointer_1=100 为非法赋值,因为为非法赋值,因为100为整型变量。为整型变量。有关的两个运算符:有关的两个运算符:(1)&:取地址运算符;:取地址运算符;(2):指针运算符(或称为:指针运算符(或称为“间接访问间接访问”运算符)运算符)例:例:&a为变量为变量a的的地址地址,p为指针变量为指针变量p所指向的所指向的存储单元存储单元;二二.指针变量的引用指针变量的引用例例10.1main()int a ,b;int *p1 ,*p2;a=100;b=10;p1=&a;p2=&b;printf(“%d,%d n”,a,b);/*“直接访问直接访问”方式方式*/printf(“%
18、d,%d n”,*p1 ,*p2);/*“间接访问间接访问”方式方式*/结果结果:100,10 100,10 程序中程序中:*p1表示指针变量表示指针变量 p1所指向的变量所指向的变量,即即 a.*p2表示指针变量表示指针变量 p2所指向的变量所指向的变量,即即 b.p1 a&a&b10010p2 b *p1*p2关于关于&与与*运算符的说明运算符的说明:1:&是取地址运算符是取地址运算符.如如:&a ,&b 等等.*是指针运算符是指针运算符.用于定义时表示其后的标识用于定义时表示其后的标识符是指针变量符是指针变量.而在程序中而在程序中*p 则表示指针变量则表示指针变量 p所所指向的变量指向的
19、变量,即即目标变量目标变量。2.&,*,+,同优先级同优先级,按从按从右至左方向右至左方向结合结合.a:如如:int a,*p1,*p2;p1=&a;则则:&*p1 与与&a 等效等效 如:如:p2=&*p1;或或 p2=&a;则则:p2 也指向变量也指向变量 a.b:如如:int a,*p1;p1=&a;则则:*&a 与与*p1 等效等效,即等价于变量即等价于变量a.c:如如:int a,*p1;p1=&a;则则:(*p1)+等价于等价于 a+但注意但注意 *p1+不等价于不等价于 (*p1)+&ap1*p1*&a a 因为因为 *p1+等价于等价于*(p1+)即先得即先得 p1 所指向变所
20、指向变量的值量的值,再使指针变量再使指针变量 p1的值自增的值自增,此时此时 p1 已不在指向原已不在指向原来的变量了来的变量了.例例 10.2 void main()int *p1,*p2,*p,a,b;scanf(“%d,%d”,&a,&b);p1=&a;p2=&b;if(a b)p=p1;p1=p2;p2=p;(进行地址交换进行地址交换)printf(“a=%d,b=%d n”,a,b);printf(“max=%d,min=%d n”,*p1,*p2);如输入如输入:5,9 输出输出:a=5,b=9 max=9,min=5 (注意注意:本程序是采用交换指针变量本程序是采用交换指针变量
21、p1 和和p2 的指的指向来实现两个数的比较的向来实现两个数的比较的.且比较前后且比较前后 a,b 的值的值并未发生变化并未发生变化)&a&b59&b&a95p1p2p pp1p2aba b三三.指针变量作为函数的参数指针变量作为函数的参数 指针变量可以作函数的参数指针变量可以作函数的参数,其作用是将一个变量的其作用是将一个变量的地地址址传送到另一个函数中。传送到另一个函数中。例例 10.3 void swap(int*p1,int*p2)int p;p=*p1;*p1=*p2;*p2=p;void main()int a,b,*pointer_1 ,*pointer_2;scanf(“%d,
22、%d”,&a,&b);pointer_1=&a;pointer_2=&b;if(ab)swap(pointer_1,pointer_2);printf(“n%d,%d n”,a,b);若输入若输入:5,9 输出为输出为:9,5&a&b59abpointer_1pointer_2(a)&a&b&a&b59abp1p2pointer_1pointer_2(b)&a&a&b&b95p1pointer_1p2pointer_2ab(c)&a&b95abpointer_1pointer_2(d)本程序采用的是交换本程序采用的是交换 a 和和 b 的值的值,而而 p1和和p2 的值不变的值不变.同例同例9
23、.2相反相反.如果把如果把 swap 函数改成函数改成:swap(p1,p2)int *p1,*p2;int *p;*p=*p1;(此句有问题此句有问题)*p1=*p2;*p2=*p;又如又如:swap(int x,int y)int t ;t=x;x=y;y=t;P无确定的地址值无确定的地址值,它的,它的的值不可预见,的值不可预见,*p所指所指向的单元也是不可预见,向的单元也是不可预见,对对*p赋值可能会破坏系赋值可能会破坏系统的正常状态统的正常状态。注意参数的传递注意参数的传递类型为类型为“值传递值传递”55995995abxya bxy(a)(b)说明说明:1.不能通过改变不能通过改变形
24、参指针变量的值形参指针变量的值而使而使实参指针变实参指针变量的值量的值改变改变.2.可以通过改变形参指针变量所指向的变量可以通过改变形参指针变量所指向的变量的值来改变实参指针变量所指向的变量的值的值来改变实参指针变量所指向的变量的值.3.如想通过函数调用得到如想通过函数调用得到 n 个要改变的值个要改变的值,可以可以:(1)在主调函数中设在主调函数中设 n 个变量个变量,并用并用 n 个指针变量指个指针变量指 向它们向它们;(2)将指针变量作实参将指针变量作实参,使使 n 个变量的地址传给所调个变量的地址传给所调 用的函数形参用的函数形参;(3)通过形参指针变量通过形参指针变量,改变该改变该
25、n 个变量的值个变量的值;(4)主调函数中就可以使用这些改变了值的变量。主调函数中就可以使用这些改变了值的变量。swap(int*p1,int*p2)int *p;p=p1;p1=p2;p2=p;main()int a,b,*pointer_1 ,*pointer_2;scanf(“%d,%d”,&a,&b);pointer_1=&a;pointer_2=&b;if(a b)swap(pointer_1,pointer_2);printf(“n%d,%d n”,a,b);本函数中试图通过改变形参本函数中试图通过改变形参指针变量的值来使实参指针指针变量的值来使实参指针变量的值改变变量的值改变.&
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第三 语言 PPT 课件 讲解 10 指针
限制150内