第10章-指针课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《第10章-指针课件.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 10 指针 课件
- 资源描述:
-
1、1 1、指针变量的定义、引用、指针变量的定义、引用2 2、指针变量的初始化及运算、指针变量的初始化及运算3 3、指向数组的指针变量、指向数组的指针变量4 4、指向字符串的指针变量、指向字符串的指针变量5 5、指针数组、二级指针、指针数组、二级指针6 6、指向函数的指针、指向函数的指针10.110.1地址和指针的概念地址和指针的概念 为了说清楚什么是指针,必须弄清楚数据在内为了说清楚什么是指针,必须弄清楚数据在内存中是如何存储的,又是如何读取的。存中是如何存储的,又是如何读取的。内存区的每一个字节有一个编号,这就是内存区的每一个字节有一个编号,这就是“地地址址”。如果在程序中定义了一个变量,在对
2、程序进。如果在程序中定义了一个变量,在对程序进行编译时,系统就会给这个变量分配行编译时,系统就会给这个变量分配相应的相应的内存单内存单元。元。假设程序已定义了假设程序已定义了3 3个整型变量个整型变量i i、j j、k k,编译,编译时系统分配时系统分配20002000和和20012001两个字节给变量两个字节给变量i i,20022002,20032003字节给字节给j j,20042004,20052005给给k k。、通过变量名来对内存单元进行存取操作。、通过变量名来对内存单元进行存取操作。程序经过编译后己经将变量名转换为变程序经过编译后己经将变量名转换为变量的地址,按变量地址存取变量值
3、的方量的地址,按变量地址存取变量值的方式称为式称为“直接访问直接访问”方式方式 访问方式:访问方式:k=i+j;k=i+j;的执行是:的执行是:从从2000、2001字节取出字节取出i的值的值(3),再从,再从2002、2003字节取出字节取出j的值的值(6),将,将它们相加后再将其和它们相加后再将其和(9)送到送到k所占用的所占用的2004、2005字节单元中。字节单元中。例如:例如:printf(%d,i);printf(%d,i);的执行是:的执行是:根据变量名与地根据变量名与地址的对应关系址的对应关系(这个对应关系是在编译时确定的这个对应关系是在编译时确定的),找到变量找到变量i i的
4、地址的地址20002000,然后从由,然后从由20002000开始的两开始的两个字节中取出数据个字节中取出数据(即变量的值即变量的值3)3),把它输出。,把它输出。scanf(%d,&i);scanf(%d,&i);的执行是:的执行是:把从键盘输入把从键盘输入的值送到地址为的值送到地址为2000开始的整型存储单元中。开始的整型存储单元中。2 2、另一种存取变量值的方式称为、另一种存取变量值的方式称为“间接访问间接访问”方式。即将变量的地址存放在另一个变方式。即将变量的地址存放在另一个变量中。然后通过这个变量去访问变量量中。然后通过这个变量去访问变量i i。在语言中在语言中,可以定义一种特殊的变
5、量可以定义一种特殊的变量,它是专门用来存放其它变量地址的。这种变量它是专门用来存放其它变量地址的。这种变量称为称为“指针变量指针变量”假设我们定义了一个指针变量假设我们定义了一个指针变量i_pointeri_pointer用用来存放整型变量的地址,它被分配地址为来存放整型变量的地址,它被分配地址为(3010)(3010)、(3011)(3011)的两个字节。的两个字节。可以通过语句:可以通过语句:i i_pointer_pointer ;将将i i的地址的地址(2000)(2000)存放到存放到i_pointeri_pointer中。中。这时,这时,i_pointeri_pointer的值就是
6、的值就是(2000)(2000),即变量,即变量所占用单元的起始地址。所占用单元的起始地址。要存取变量的值,可以采用间接方式:先要存取变量的值,可以采用间接方式:先找到存放找到存放 “的地址的地址”的变量的变量 i i_pointer_pointer ,从中取出的地址从中取出的地址(2000)(2000),然后到,然后到2000 2000、20012001字节取出的值字节取出的值()。打个比方,为了开一个打个比方,为了开一个A A抽屉,有两种抽屉,有两种办法:办法:一种是将一种是将A A钥匙带在身上,需要时直接钥匙带在身上,需要时直接找出该钥匙打开抽屉,取出所需的东西。找出该钥匙打开抽屉,取出
7、所需的东西。另一种办法是:为安全起见,将该另一种办法是:为安全起见,将该A A钥钥匙放到另一抽屉匙放到另一抽屉B B中锁起来。如果需要打开中锁起来。如果需要打开A A抽屉,就需要先找出抽屉,就需要先找出B B钥匙,打开钥匙,打开B B抽屉,取抽屉,取出出A A钥匙,再打开钥匙,再打开A A抽屉,取出抽屉,取出A A抽屉中之物,抽屉中之物,这就是这就是“间接访问间接访问”。直接访问直接访问将将3送到变量送到变量i所标志的单元中。所标志的单元中。间接访问间接访问将将3送到变量送到变量i_pointeri_pointer所所“指指向向”的单元的单元(即即i所标志的单元所标志的单元)中。中。所谓所谓“
8、指向指向”就是通过地址来体现的。就是通过地址来体现的。i_pointei_pointer r中的值为中的值为20002000,它是变量,它是变量i i的地址,这样通过的地址,这样通过i_pointeri_pointer能知道能知道i i的地址,从而找到变量的地址,从而找到变量i i的内存单元。即由于通的内存单元。即由于通过地址能找到所需的变量单元,我们可以说,地址过地址能找到所需的变量单元,我们可以说,地址“指指向向”该变量单元该变量单元(如同说,房间号如同说,房间号“指向指向”某一房间一某一房间一样样)。一个变量的地址称为该变量的一个变量的地址称为该变量的“指针指针”。例如,地址例如,地址2
9、0002000是变量的指针。是变量的指针。如果有一个变量如果有一个变量专门用来存放另一变量的地址专门用来存放另一变量的地址(即指针即指针),则它称为,则它称为“指针变量指针变量”。上述的上述的i_pointeri_pointer就是一个指针变就是一个指针变量。量。指针和指针变量的定义:指针和指针变量的定义:指针变量的值指针变量的值(即指针变量中存放的值即指针变量中存放的值)是地址是地址(即指针即指针)。请区分。请区分“指针指针”和和“指针变量指针变量”这两个这两个概念。概念。例如,可以说变量例如,可以说变量i i的指针是的指针是20002000,而不能说,而不能说i i的指针变量是的指针变量是
10、20002000。10.2 10.2 变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量 变量的指针就是变量的地址。变量的指针就是变量的地址。存放变量地存放变量地址的变量是指针变量,用来指向另一个变量。址的变量是指针变量,用来指向另一个变量。为了表示指针变量和它所指向的变量之间的联为了表示指针变量和它所指向的变量之间的联系,在程序中用系,在程序中用“*”符号表示符号表示“指向指向”,例,例如:如:i_pointeri_pointer代表指针变量,而代表指针变量,而*i_pointeri_pointer是是i_pointeri_pointer所指向的变量,如下图。所指向的变量,如下图。
11、10.1 定义一个指针变量定义一个指针变量定义指针变量的一般形式为:定义指针变量的一般形式为:基类型基类型 *指针变量名;指针变量名;下面都是合法的定义:下面都是合法的定义:float float *pointer_3pointer_3;/pointer_3/pointer_3是指向是指向floatfloat型变量的指针变量型变量的指针变量 char char*pointer_4pointer_4;/pointer_4/pointer_4是指向字符型变量的指针变量是指向字符型变量的指针变量 可以用赋值语句使一个指针变量得到另一个变量可以用赋值语句使一个指针变量得到另一个变量的地址,从而使它指向
12、一个该变量。如:的地址,从而使它指向一个该变量。如:pointer_1pointer_1&i&i;pointer_2pointer_2&j&j;在定义指针变量时要注意两点:在定义指针变量时要注意两点:(1)(1)指针变量前面的指针变量前面的“*”,表示该变量的类型为指,表示该变量的类型为指针型变量。针型变量。例例:float float *pointer_1pointer_1;指针变量名是指针变量名是pointer_1pointer_1 ,而不是,而不是*pointer_1 pointer_1 。(2)(2)在定义指针变量时必须指定基类型。在定义指针变量时必须指定基类型。需要特别注意的是,只有
13、整型变量的地址才能放到需要特别注意的是,只有整型变量的地址才能放到指向整型变量的指针变量中。下面的赋值是错误的指向整型变量的指针变量中。下面的赋值是错误的 float a;float a;int int *pointer_1;pointer_1;pointer_1=&a;/pointer_1=&a;/*将将floatfloat型变量的地址放到型变量的地址放到指向整型变量的指针变量中,错误指向整型变量的指针变量中,错误 */10.指针变量的引用指针变量的引用 请牢记,指针变量中只能存放地址请牢记,指针变量中只能存放地址(指指针针),不要将一个整数,不要将一个整数(或任何其他非地址类或任何其他非地
14、址类型的数据型的数据)赋给一个指针变量。赋给一个指针变量。下面的赋值是不合法的:下面的赋值是不合法的:pointer-1=100;pointer-1=100;(pointer-1(pointer-1为指针变量,为指针变量,100100为整数为整数)有两个有关的运算符:有两个有关的运算符:(1)&(1)&:取地址运算符。:取地址运算符。(2)(2)*:指针运算符:指针运算符(或称或称“间接访问间接访问”运算符运算符)。例如:例如:&a&a为变量为变量a a的地址,的地址,*p p为指针变量为指针变量p p所指所指向的存储单元。向的存储单元。例例10.通过指针变量访问整型变量通过指针变量访问整型变
15、量#include stdio#include stdio.h.hvoidvoidmainmain()()intint a,b;a,b;int int*pointer_1,pointer_1,*pointer_2pointer_2;a=100;b=10;a=100;b=10;pointer_1=&a;pointer_1=&a;/*把变量把变量a a的地址赋给的地址赋给pointer_1 pointer_1*/pointer_2=&b;pointer_2=&b;/*把变量把变量b b的地址赋给的地址赋给pointer_2pointer_2*/printf(%d,%dna,b);printf(%d
16、,%dna,b);printf(%d,%dn,printf(%d,%dn,*pointer_1,pointer_1,*pointer_2pointer_2););表示定义两个指针变量表示定义两个指针变量pointer_1、pointer_2。表示表示pointer_1和和pointer_2所指向的变量。所指向的变量。注意区分注意区分注意注意:不应写成不应写成 *pointer_1=&a;pointer_1=&a;*pointer_2=&b;pointer_2=&b;对对“&”&”和和“*”运算符说明:运算符说明:如果已执行了语句如果已执行了语句 pointer_1=&a;pointer_1=&
17、a;(1)(1)*pointer_1pointer_1的含义是什么?的含义是什么?“”和和“*”两个运算符的优先级别相同,但两个运算符的优先级别相同,但按自右而左方向结合,因此先进行按自右而左方向结合,因此先进行*pointer_1pointer_1的运算,的运算,它就是变量它就是变量a a,再执行,再执行&运算。运算。因此,因此,&*pointer_1pointer_1与与&a&a相同,即变量相同,即变量a a的地址。的地址。如果有如果有pointer_2=&pointer_2=&*pointer_1pointer_1;它的作用是将;它的作用是将&a&a(a a的地址的地址)赋给赋给poin
18、ter_2pointer_2,如果,如果pointer_2pointer_2原来指向原来指向b b,经过重新赋值后它已不再指向经过重新赋值后它已不再指向b b了,而指向了了,而指向了a a。如下图如下图(2)(2)*&a&a的含义是什么?的含义是什么?先进行先进行&a&a运算,得运算,得a a的地址,再进行的地址,再进行*运算。运算。即即&a所指向的变量,也就是变量所指向的变量,也就是变量a a。*&a和和*pointer_pointer_的作用是一样的,它们都等价于变的作用是一样的,它们都等价于变量量a a。即。即*&a与与a a等价。等价。(3)(3)(*pointer_1)+pointe
19、r_1)+相当于相当于a+a+。注意括号是必要的,如果没有括号,就成注意括号是必要的,如果没有括号,就成为了为了*pointer_1+pointer_1+,从附录可知:,从附录可知:+和和*为同一为同一优先级别,而结合方向为自右而左。因此它相优先级别,而结合方向为自右而左。因此它相当于当于*(pointer_1+)(pointer_1+)。由于。由于+在在pointer_1pointer_1的的右侧,是右侧,是“后加后加”,因此先对,因此先对pointer_1pointer_1的原值的原值进行进行*运算,得到运算,得到a a的值,然后使的值,然后使pointer_1pointer_1的值的值改
20、变,这样改变,这样pointer_1pointer_1不再指向不再指向a a了。了。例例10.2 输入输入a和和b两个整数,按先大后小的顺序输出两个整数,按先大后小的顺序输出 a和和b。#include#include stdio.hstdio.hvoid void mainmain()()intint *p1,p1,*p2,a,b;p2,a,b;scanf(%d,%d,&a,&b);scanf(%d,%d,&a,&b);p1=&a;p2=&b;p1=&a;p2=&b;if(ab)p=p1;p1=p2;p2=p;if(ab)p=p1;p1=p2;p2=p;printf(a=%d,b=%dnn,
21、a,b);printf(a=%d,b=%dnn,a,b);printf(printf(max=%d,min=%dn,max=%d,min=%dn,*p1,p1,*p2);p2);指针变量应用例子指针变量应用例子运行情况如下:运行情况如下:5,9 a=5,b=9 max=9,min=5当输入当输入a=5,b=9时,由于时,由于ab,将,将p1和和p2交换。交换前交换。交换前的情况见图的情况见图(a),交换后见图,交换后见图(b)。注意:注意:a a和和b b并未交换,它们仍保持原值,但并未交换,它们仍保持原值,但p1p1和和p2p2的的值改变了。值改变了。p1p1的值原为的值原为&a&a,后来变
22、成,后来变成&b&b,p2p2原值为原值为&b&b,后来变成后来变成&a&a。这个问题的算法不是交换整型变量的值,而这个问题的算法不是交换整型变量的值,而是交换两个指针变量的值是交换两个指针变量的值(即即a a和和b b的地址的地址)。10.3 指针变量作为函数参数指针变量作为函数参数例例10.3 对输入的两个整数按大小顺序输出对输入的两个整数按大小顺序输出#include#include void main()void main()void swap(int void swap(int*p1,int p1,int*p2);p2);int a,b;int a,b;int int*pointer
23、_1,pointer_1,*pointer_2;pointer_2;scanf(%d,%d,&a,&b);scanf(%d,%d,&a,&b);pointer_1=&a;pointer_2=&b;pointer_1=&a;pointer_2=&b;if(ab)swap(pointer_1,pointer_2);if(ab)swap(pointer_1,pointer_2);printf(n%d,%dn,a,b);printf(n%d,%dn,a,b);void swap(int void swap(int*p1,int p1,int*p2)p2)int temp;int temp;temp=t
24、emp=*p1;p1;*p1=p1=*p2;p2;*p2=temp;p2=temp;注意:注意:本例采取的方法是,交换本例采取的方法是,交换a a和和b b的值,而的值,而p1p1和和p2p2的值不变。这恰和例的值不变。这恰和例10.210.2相反。相反。如果写成以下这样会怎样?如果写成以下这样会怎样?void swap1(void swap1(int int*p1p1,intint *p2)p2)int temp int temp;*temp=temp=*p1;p1;p1 p1=*p2;p2;p2 p2=*temp;temp;请注意交换请注意交换*p1p1和和*p2p2的值是如何实现的。的值
25、是如何实现的。*p1p1就是就是a a,是整型变量。而,是整型变量。而*temptemp是指针变量是指针变量temptemp所指向的变量。但所指向的变量。但temptemp中并无确定的地址值,它的值中并无确定的地址值,它的值是不可预见的,是不可预见的,*temptemp所指向的单元也是不可预见的。所指向的单元也是不可预见的。因此,对因此,对*temptemp赋值可能会破坏系统的正常工作状况。赋值可能会破坏系统的正常工作状况。此语句有问题此语句有问题 应该将应该将*p1p1的值的值赋给一个整型变量,赋给一个整型变量,如程序所示那样,用如程序所示那样,用整型变量整型变量temptemp作为临作为临
展开阅读全文