计算机程序设计:第11讲指针(上)_第1页
计算机程序设计:第11讲指针(上)_第2页
计算机程序设计:第11讲指针(上)_第3页
计算机程序设计:第11讲指针(上)_第4页
计算机程序设计:第11讲指针(上)_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1 第11讲 指针(上)2 本讲主要内容l指针和指针变量的概念指针和指针变量的概念l指针变量作为函数参数指针变量作为函数参数l数组的指针及其指针变量数组的指针及其指针变量学学“指针指针”虽然难,但难不过农民工生活虽然难,但难不过农民工生活!3 指针是天使与魔鬼的化身4 犀利哥故事之十二犀利哥故事之十二喜庆婚礼喜庆婚礼p话说犀利哥和天仙妹喜结良缘。举行婚礼的当天,聚集了很多祝福亲朋话说犀利哥和天仙妹喜结良缘。举行婚礼的当天,聚集了很多祝福亲朋好友。为了添加喜庆,大家要求犀利哥表演一个节目。犀利哥思索良久,好友。为了添加喜庆,大家要求犀利哥表演一个节目。犀利哥思索良久,终于想起当年夜宿桥洞时听到的

2、一个故事。故事情节是终于想起当年夜宿桥洞时听到的一个故事。故事情节是p 那是在抗击日本侵略者的年代那是在抗击日本侵略者的年代, ,特务阿宝接到上级指令,要去寻找一个特务阿宝接到上级指令,要去寻找一个密密钥钥。几经周折,线人告之。几经周折,线人告之: :密钥密钥藏在某墓地看护人所住的一栋小楼的房间藏在某墓地看护人所住的一栋小楼的房间中。一个风雨交加的夜晚,阿宝潜入了小楼,房间很多,不知该进哪一间,中。一个风雨交加的夜晚,阿宝潜入了小楼,房间很多,不知该进哪一间,正在一筹莫展之际,忽然走廊上的电话铃声响起。艺高人胆大,阿宝毫不正在一筹莫展之际,忽然走廊上的电话铃声响起。艺高人胆大,阿宝毫不迟疑,抓

3、起听筒,一个陌生人说:迟疑,抓起听筒,一个陌生人说:“去打开去打开小姐卧室小姐卧室 ,那里有线索,那里有线索”。阿金疾步上楼,打开阿金疾步上楼,打开小姐卧室小姐卧室,用电筒一照,只见桌上赫然,用电筒一照,只见桌上赫然6 6个大字:个大字:10001000房间房间。阿宝眼睛一亮,迅速找到。阿宝眼睛一亮,迅速找到10001000房间,取出重要数据房间,取出重要数据1161811618( (密密钥钥) ),完成任务,完成任务5 11.1 指针的概念l指针(pointer):是内存中某存储空间的地址(编号)l地址和指针是同义词,变量的指针就是变量的地址l指针变量:也是内存中的一个变量,只是其值存放的是

4、另一个变量地址的变量1000116181000房间房间(b) 小姐卧室小姐卧室(a)指针变量a变量b6 11.1 指针的概念l引进指针以后,变量的访问(访问是指取出其值或向它引进指针以后,变量的访问(访问是指取出其值或向它赋值)方式有两种赋值)方式有两种:(1 1)直接访问,通过变量名访问,如通过变量名)直接访问,通过变量名访问,如通过变量名i i直接访问直接访问(2 2)间接访问,通过该变量的指针(地址)来访问,如通过)间接访问,通过该变量的指针(地址)来访问,如通过2004(i_pointer)2004(i_pointer)访问变量访问变量i i4201061967120932xx喂:“教

5、C+的,干活喂:“黄永峰,干活”间接访问直接访问黄永峰教c+的7 11.2 指针变量l指针变量指针变量: :存放存放其他变量地址其他变量地址( (指针指针) )的变量的变量l指针变量有指针变量有2 2个属性:个属性: 指针变量指针变量指向指向的变量类型。如的变量类型。如i_pointeri_pointer指向的变量指向的变量i i是整型是整型 指针变量指向哪一个变量,即该指针变量的值指针变量指向哪一个变量,即该指针变量的值( (地址地址值值) )是多少。如是多少。如i_pointeri_pointer的值是的值是20002000指针变量指针变量8 11.2 指针变量l指针变量定义的一般形式:指

6、针变量定义的一般形式: 基类型基类型 * * 变量名变量名 其中:其中:“* *”表示定义指针变量表示定义指针变量 “ “变量名变量名”是指针变量名是指针变量名 “ “基类型基类型”表示该指针变量所指向的变量类型表示该指针变量所指向的变量类型l例:例:int i,j; int i,j; int int * *pointer_1, pointer_1, * *pointer_2; pointer_2; float float * *pointer_3; pointer_3; char char * *pointer_4; pointer_4; l指针变量初始化:定义同时给出初始值指针变量初始化:

7、定义同时给出初始值 例:例:int a;int a; int int * *p = &a;p = &a;为啥要定为啥要定义基类型义基类型9 v 指针变量赋值指针变量赋值例:例:int a=66; int a=66; int int * *p,p,* *q; /q; /定义定义p,qp,q为指向整型变量的指针变量为指向整型变量的指针变量 p p&a&a; /将变量将变量a a的地址赋给的地址赋给p p,见图,见图1 1 q=p; q=p; / /将将p p的值赋给的值赋给q q,见图,见图2 266 &a p a &p p变变量量的的地地址址 &a

8、mp;a a变变量量的的地地址址 图图1的的说说明明:将将a变变量量的的地地址址赋赋给给指指针针p,意意味味着着让让指指针针p指指向向a 图图1 11.2 指针变量注意:指针变量中只能存放地址,不能将一个非地址类型数据(如常数)注意:指针变量中只能存放地址,不能将一个非地址类型数据(如常数)赋给一个指针变量,如:赋给一个指针变量,如:pointer_1 = 100;10 11.2 指针变量v指针变量的引用指针变量的引用有两个运算符可以引用指针变量:有两个运算符可以引用指针变量:& &:取地址运算符。如:取地址运算符。如 pointer_1 = &i;pointer_1

9、= &i;* *:指针运算符。用于访问指针变量所:指针运算符。用于访问指针变量所指向变量指向变量如果定义:如果定义:int i,j;int i,j; int int * *pointer_1;pointer_1; pointer_1 = &i; pointer_1 = &i; 指针变量指针变量pointer_1pointer_1指向变量指向变量i i,则对变量,则对变量i i有两种访问方式有两种访问方式直接访问。如直接访问。如 i = 100;i = 100; 通过指针变量间接访问。如:通过指针变量间接访问。如:int int * *pointer_1 = &i

10、;pointer_1 = &i; * *pointer_1 pointer_1 = 100; = 100; j = j = * *pointer_1+8;pointer_1+8;p提问:变量提问:变量i i、j j的值为多少?的值为多少?11 11.2 指针变量l说明:定义指针变量时,还未规定它指向哪一个变说明:定义指针变量时,还未规定它指向哪一个变量,此时不能用量,此时不能用* *运算符访问指针运算符访问指针。只有在程序中。只有在程序中用赋值语句具体规定其指向变量后,才能用用赋值语句具体规定其指向变量后,才能用* *运算运算符访问所指向的变量符访问所指向的变量 int a; int

11、a; int int * *p; (p; (未规定指向哪个变量未规定指向哪个变量) ) * *p = 100; p = 100; 这种错误称为访问这种错误称为访问悬挂指针悬挂指针(suspended pointersuspended pointer)12 11.2 指针变量例1输入a和b两个整数,按先大后小的顺序输出a和b13 11.3 指针变量作为函数参数例2 输入a和b两整数,按先大后小顺序输出a和b。14 15 11.3 指针变量作为函数参数程序执行过程的说明程序执行过程的说明执行执行pointer_1 = &a; pointer_1 = &a; pointer_2 =

12、&bpointer_2 = &b后,后,pointer_1pointer_1和和pointer_2pointer_2分别指分别指向向a a和和b.b.调用函数调用函数swap(pointer_1,pointer_2)swap(pointer_1,pointer_2),生成两个形参,生成两个形参p1p1和和p2p2。实参。实参pointer_1pointer_1的值传送给形参的值传送给形参p1p1,因此,因此p1p1也指向也指向a a。同理,。同理,p2p2指向指向b b16 11.3 指针变量作为函数参数在在swap()swap()函数内,把函数内,把* *p1p1和和* *p

13、2p2的值进行交的值进行交换,换,* *p1p1是变量是变量a a,* *p2p2是变量是变量b b,即把,即把a a和和b b的的值进行交换值进行交换函数函数swap()swap()调用结束调用结束后,形参后,形参p1p1、p2p2被释被释放,放,mainmain中得到的中得到的a a和和b b是已经被交换的值。是已经被交换的值。17 11.3 指针变量作为函数参数int swap(int *p1, int *p2) int *p; *p = *p1; *p1 = *p2; *p2 = *p;提问:分析上述程序,哪里有问题?避免指针悬挂!避免指针悬挂!18 11.3 指针变量作为函数参数 函

14、数函数swap()swap()的形参是指针变量,有两种调用方式:的形参是指针变量,有两种调用方式:p swap(pointer_1, pointer_2);swap(pointer_1, pointer_2);p swap(&a, &b); swap(&a, &b); 均把变量均把变量a a和和b b的地址传送给形参,均能实现交换的地址传送给形参,均能实现交换a a和和b b的值的值只有函数只有函数swap()swap()知道变量知道变量a a和和b b的地址,才能改变其值(交的地址,才能改变其值(交换)。如果换)。如果swap()swap()设计为下面形式,不

15、能实现设计为下面形式,不能实现a a和和b b的值交的值交换换 int swap(int x, int y) /int swap(int x, int y) /* * 该函数交换形参的值该函数交换形参的值 * */ / int t; int t; t = x; t = x; x = y; x = y; y = t;y = t; 该函数交换形参的值该函数交换形参的值, ,不能不能实现实参值的交换实现实参值的交换, , 因为在因为在C+C+语言中,实参和形参之间使用语言中,实参和形参之间使用“传值法传值法”,数据只能单向,数据只能单向由实参传到形参。形参值的变化不影响实参由实参传到形参。形参值的变

16、化不影响实参19 11.3 指针变量作为函数的参数分析:下面的程序是否能达到交换的目的?分析:下面的程序是否能达到交换的目的?int swap(int int swap(int * *p1, int p1, int * *p2) /p2) /* * 交换形参的值交换形参的值 * */ / int *p; p = p1; p1 = p2; p2 = p; main() int a,b; int *pointer_1, *pointer_2; scanf(%d,%d,&a, &b); pointer_1 = &a; pointer_2 = &b; if (ab) s

17、wap(pointer_1, pointer_2); printf(n%d,%dn, *pointer_1, *pointer_2);p Swap()函数交换的是函数交换的是p1,p2指针变量的值,即地址。指针变量的值,即地址。没有交换没有交换a,b的值的值20 11.3 指针变量作为函数参数p小结小结指针变量作函数参数,实参和形参之间使用指针变量作函数参数,实参和形参之间使用“地址值传递法地址值传递法”,可以实现主调函数和被调函数之间的,可以实现主调函数和被调函数之间的数据双向传递(一数据双向传递(一定要理解:双向传递的本质是实参与形参空间共享)定要理解:双向传递的本质是实参与形参空间共享)

18、区分区分* *运算符在不同场合作用,编译器能根据上下文环境判运算符在不同场合作用,编译器能根据上下文环境判别别* *的作用的作用 int a,b,c, int a,b,c, * * p; p; (* *表示定义指针)表示定义指针) p = &a;p = &a; * *p = 100; p = 100; (* *表示指针运算符)表示指针运算符) c = a c = a * * b; b; (* *表示乘法运算符)表示乘法运算符)使用指针好处使用指针好处同质性:任何类型的数据都可以统一用其地址来表示同质性:任何类型的数据都可以统一用其地址来表示灵活性:指针指向某一个存储空间,可以解

19、释为字符型灵活性:指针指向某一个存储空间,可以解释为字符型、整型、数组等各种类型数据、整型、数组等各种类型数据突破作用域限定,突破作用域限定,实现跨作用域访问实现跨作用域访问21 11.3 指针变量作为函数参数例 输入a、b、c三个整数,按大小顺序输出22 23 11.4 一维数组指针及其指针变量l一维数组的指针一维数组的指针 数组的指针(数组首地址,数组名)数组的指针(数组首地址,数组名) 数组元素的指针(每个元素的地址,数组元素的指针(每个元素的地址,&ai&ai)l指针变量可以指向数组名和数组元素指针变量可以指向数组名和数组元素l当指针指向数组后,对数组元素的访问,既可以

20、使当指针指向数组后,对数组元素的访问,既可以使用用数组下标法数组下标法,也可以使用,也可以使用指针法指针法。并且用指针访。并且用指针访问数组元素,程序的效率更高问数组元素,程序的效率更高l例如例如 int a10; /int a10; /* * 元素为整型元素为整型 * */ / int int * *p; /p; /* * 可以指向数组可以指向数组a a的元素的元素 * */ / p=&a0;p=&a0;或或p=a; /p=a; /* * 把数组把数组a a的起始地址赋给的起始地址赋给p p,不是把数组的全部元素赋给,不是把数组的全部元素赋给p p * */ /24 11.4

21、 一维数组指针及其指针变量p+1p+1指向下一个元素指向下一个元素a1a1,注,注意不是将意不是将p p值简单加值简单加1 1。如果数。如果数组元素是整型,组元素是整型,p+1p+1表示表示p p的地的地址加址加2 2;如果数组元素是实型,;如果数组元素是实型,p+1p+1表示表示p p的地址加的地址加4 4;如果数;如果数组元素是字符型,组元素是字符型,p+1p+1表示表示p p的的地址加地址加1 1p+ip+i指向元素指向元素aiai。可以使用。可以使用* *(p+i)(p+i)访问元素访问元素aiail通过指针变量引用数组元素通过指针变量引用数组元素25 11.4 一维数组指针及其指针变

22、量 例例 输出整型数组的全部元素整型、访问各元素有三种方法输出整型数组的全部元素整型、访问各元素有三种方法2. 用数组名用数组名(指针法指针法)计算数组元计算数组元素的地址(效率与下标法同)素的地址(效率与下标法同)main()int a10; int i; for(i=0;i10;i+) scanf(%d, &ai); printf(n); for(i=0;i10;i+) printf(%d ,*(a+i);1.1.下标法(常用,很直观)下标法(常用,很直观)main()int a10; int i; for(i=0;i10;i+) scanf(%d, &ai); print

23、f(n); for(i=0;i10;i+) printf(%d ,ai); 26 3、用指针变量访问各元素(常用,效率高)27 11.4 一维数组指针及其指针变量l使用指针变量指向数组,应注意以下问题:使用指针变量指向数组,应注意以下问题:1.1.若指针若指针p p指向数组指向数组a a,虽然,虽然p+ip+i与与a+ia+i、* *(p+i)(p+i)与与* *(a+i)(a+i)意义相同,但仍应注意意义相同,但仍应注意p p与与a a的区别的区别(a(a代代表数组的首地址,是指针(地址)常量;表数组的首地址,是指针(地址)常量;p p是是指针变量,可以指向数组中的任何元素指针变量,可以指向

24、数组中的任何元素) ) 例:例: int a10;int a10;* *p;p;for(p=a; a(p+10); a+)for(p=a; a(p+10); a+) printf(%d, printf(%d, * *a)a);是否正确;是否正确?28 11.4 一维数组指针及其指针变量29 11.4 一维数组指针及其指针变量2. 指针变量可以指向数组中的任何元素,注意指针变量的当前值。因此:使用指针时,应特别注意避免指针访问越界例如:本例中第二次for循环,p已经越过数组的范围,但编译器不能发现该问题。避免指针访问越界是程序员自己的责任30 11.4 一维数组指针及其指针变量3.3.指针使用的

25、几个细节。设指指针使用的几个细节。设指针针p p指向数组指向数组a a(p=ap=a),则:),则: p+p+(或(或 p += 1p += 1),则:),则:* *p=p=? * *p+p+表示什么意义?表示什么意义? * *(p+p+)与)与* *(+p)(+p)的分别表的分别表示什么意义?示什么意义? ( (* *p)+p)+表示什么意义?表示什么意义?31 答案:答案: p+p+(或(或 p += 1p += 1),),p p指向下一个元素。指向下一个元素。 * *p+p+,相当于,相当于* *(p+)(p+)。因为因为,* *和和+同优先级,同优先级,+是右结合运算符是右结合运算符。

26、 * *(p+p+)与)与* *(+p)(+p)的作用不同。的作用不同。* *(p+)(p+):先取:先取* *p p,再使,再使p p加加1 1。* *(+p)(+p):先使:先使p p加加1 1,再取,再取* *p p。 ( (* *p)+p)+表示,表示,p p指向的元素值加指向的元素值加1 1。小结:如果小结:如果p p当前指向数组当前指向数组a a的第的第i i个元素,则:个元素,则:* *(p-)(p-)相当于相当于ai-ai-,先取,先取* *p p,再使,再使p p减减1 1。( (* *p)-p)-相当于相当于ai-, ai-, 先取先取* *p p,再使,再使* *p p减

27、减1 1。* *(+p)(+p)相当于相当于a+ia+i,先使,先使p p加加1 1,再取,再取* *p p。* *(-p)(-p)相当于相当于a-ia-i,先使,先使p p减减1 1,再取,再取* *p p。32 11.4 一维数组指针及其指针变量l数组名和指针变量作函数参数例 将数组a中n个元素按相反顺序存放33 l 数组名作函数参数数组名作函数参数34 l函数函数inv()inv()可以用指针变量作形参可以用指针变量作形参35 36 11.4 数组的指针变量l小结:数组作函数的参数,实参和形参之间传小结:数组作函数的参数,实参和形参之间传送数组的首地址,首地址可以用指针表示,也送数组的首

28、地址,首地址可以用指针表示,也可以用数组名表示,因此,实参和形参有以下可以用数组名表示,因此,实参和形参有以下四种组合情况。四种组合情况。 组合情况组合情况 实参实参 形参形参 1 1 数组名数组名 数组名数组名 2 2 数组名数组名 指针指针 3 3 指针指针 指针指针 4 4 指针指针 数组名数组名37 重点关注l直接访问和间接访问的含义直接访问和间接访问的含义l指针与指针变量的概念指针与指针变量的概念l注意注意P172P172倒数第倒数第2 2段段, ,仔细阅读和体会仔细阅读和体会l数组名实际是指针数组名实际是指针, ,但不是指针变量但不是指针变量l指针做函数参数传递指针做函数参数传递38 第10次课后练习2.编写程序,将两个长度各为编写程序,将两个长度各为10的整型数组数据按从小到大排序,的整型数组数据按从小到大排序,然后将两组数据合并到一个长度为然后将两组数据合并到一个长度为20的整型数组中,合并后的的整型数组中,合并后的数组仍然按照从小到大排序。数组仍然按照从小到大排序。要求:要求:假设每个数组中的元素均无重复;假设每个数组中的元素均无重复

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论