《(6.16)--补充课件第10讲-指针程序设计基础.ppt》由会员分享,可在线阅读,更多相关《(6.16)--补充课件第10讲-指针程序设计基础.ppt(145页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第十讲指针第十讲指针C语言程序设计语言程序设计 The C Programming Language2C语言程序设计语言程序设计 温州理工学院温州理工学院 2指指 针针本章要求本章要求理解指针的概念;理解指针的概念;掌握指针变量的定义和使用方法;掌握指针变量的定义和使用方法;掌握指针变量作函数参数时,数据的传递方式;掌握指针变量作函数参数时,数据的传递方式;掌握使用指针处理一维、二维数组的方法;掌握使用指针处理一维、二维数组的方法;掌握使用指针处理字符串的方法。掌握使用指针处理字符串的方法。本章重点本章重点指针变量的定义和使用指针变量的定义和使用指针变量作函数参数指针变量作函数参数使用指针处理
2、一维数组和字符串使用指针处理一维数组和字符串本章难点本章难点使用指针处理一维、二维数组使用指针处理一维、二维数组3C语言程序设计语言程序设计 温州理工学院温州理工学院 3指指 针针地址与指针概述地址与指针概述变量的指针与指向变量的指针变量变量的指针与指向变量的指针变量指针运算符与指针变量运算指针运算符与指针变量运算数组与指针数组与指针字符串与指针字符串与指针指向函数的指针指向函数的指针返回指针值的函数返回指针值的函数指针数组与指向指针的指针指针数组与指向指针的指针本章小结本章小结参考书目及网络资源参考书目及网络资源讨论时间讨论时间4C语言程序设计语言程序设计 温州理工学院温州理工学院 4指指
3、针针地址与指针概述地址与指针概述变量的指针与指向变量的指针变量变量的指针与指向变量的指针变量指针运算符与指针变量运算指针运算符与指针变量运算数组与指针数组与指针字符串与指针字符串与指针指向函数的指针指向函数的指针返回指针值的函数返回指针值的函数指针数组与指向指针的指针指针数组与指向指针的指针本章小结本章小结参考书目及网络资源参考书目及网络资源讨论时间讨论时间5C语言程序设计语言程序设计 温州理工学院温州理工学院 5地址与指针概述地址与指针概述C语言的数据是以数据类型形式出现的,语言的数据是以数据类型形式出现的,C的的数据类型如下:数据类型如下:6C语言程序设计语言程序设计 温州理工学院温州理工
4、学院 6地址与指针概述地址与指针概述指针是指针是C C语言中广泛使用的一种数据类型。运语言中广泛使用的一种数据类型。运用指针编程是用指针编程是C C语言最主要的风格之一。语言最主要的风格之一。利用指针变量可以表示各种数据结构;利用指针变量可以表示各种数据结构;能很方便地使用数组和字符串;能很方便地使用数组和字符串;并能象汇编语言一样处理内存地址,从而编出精练并能象汇编语言一样处理内存地址,从而编出精练而高效的程序。而高效的程序。7C语言程序设计语言程序设计 温州理工学院温州理工学院 7地址与指针概述地址与指针概述(contd)地址的概念地址的概念 程序是由程序是由CPU控制和运行的,在执行过程
5、中需要处控制和运行的,在执行过程中需要处理各种数据,这些数据被存放在内存中。理各种数据,这些数据被存放在内存中。为了便于管理,内存空间被划分成若干个大小相同为了便于管理,内存空间被划分成若干个大小相同(1个字节)的存储单元,里面存放着各种数据。个字节)的存储单元,里面存放着各种数据。内存中每一个存储单元也有一个编号,这个编号被内存中每一个存储单元也有一个编号,这个编号被称为称为地址地址。通过地址就可以十分方便地访问指定的。通过地址就可以十分方便地访问指定的存储单元。存储单元。如果在程序中定义了一个变量,在对程序进行编译如果在程序中定义了一个变量,在对程序进行编译时,系统就会给这个变量分配内存单
6、元。变量的地时,系统就会给这个变量分配内存单元。变量的地址是存储它的第址是存储它的第1个单元的编号。个单元的编号。8C语言程序设计语言程序设计 温州理工学院温州理工学院 8地址与指针概述地址与指针概述(contd)地地 址址 2001 20022003 3000 内存单元的内容内存单元的内容00100011 000111011100110000110011 CPUBUS9C语言程序设计语言程序设计 温州理工学院温州理工学院 9指针指针指针指针严格地说,一个指针是一个地址,是一个严格地说,一个指针是一个地址,是一个常量。而一个指针变量却可以被赋予不同的常量。而一个指针变量却可以被赋予不同的指针值
7、,是变量。但常把指针变量简称为指指针值,是变量。但常把指针变量简称为指针。针。为了避免混淆,我们中约定:为了避免混淆,我们中约定:“指针指针”是是指地址,是指地址,是常量常量,“指针变量指针变量”是指取值为是指取值为地址的地址的变量变量。定义指针的目的是为了通过指针去访问内定义指针的目的是为了通过指针去访问内存单元。存单元。10C语言程序设计语言程序设计 温州理工学院温州理工学院 10变量的存储与访问变量的存储与访问直接访问直接访问即系统直接根据变量的地址找到相应的存储空即系统直接根据变量的地址找到相应的存储空间。间。间接访问间接访问基本思想:基本思想:将要访问变量将要访问变量a的地址存放在另
8、一个变量的地址存放在另一个变量p中中当需要访问变量当需要访问变量a时,先取出变量时,先取出变量p的内容即变量的内容即变量a的地址的地址再根据此地址找到变量再根据此地址找到变量a所对应的存储空间。所对应的存储空间。能够存放其它变量地址的变量称作能够存放其它变量地址的变量称作指针变量指针变量。11C语言程序设计语言程序设计 温州理工学院温州理工学院 11直接访问直接访问按变量地址存取变量值。按变量地址存取变量值。假设程序已定义三个整型假设程序已定义三个整型变量变量i、j、k,它们分别占,它们分别占用两个字节。用两个字节。在程序中一般是通过变量在程序中一般是通过变量名来对内存单元进行存取名来对内存单
9、元进行存取操作的。事实上,编译后操作的。事实上,编译后已经将变量名转换为变量已经将变量名转换为变量的地址,对变量的存取都的地址,对变量的存取都是通过地址进行的。是通过地址进行的。变量名与地址之间的对应变量名与地址之间的对应关系在编译时确定的。关系在编译时确定的。int i,j,k;scanf(“%d”,&i);printf(“%d”,i);k=i+j12C语言程序设计语言程序设计 温州理工学院温州理工学院 12间接访问间接访问假设程序已定义了一个变量假设程序已定义了一个变量i_pointer,用来存放整型变量,用来存放整型变量的地址,它被分配为的地址,它被分配为3010、3011两个字节。两个
10、字节。语句语句i_pointer=&i;将将i的地址的地址(2000)存放到)存放到i_pointer中。中。i_pointer的值就是的值就是2000,即变,即变量量i所占用单元的起始地址。所占用单元的起始地址。存取变量存取变量i的值,先找到存放的值,先找到存放“i的地址的地址”的变量的变量i_pointer,从中取出,从中取出i的地址(的地址(2000),),然后到然后到2000、2001字节取出字节取出i的值(的值(3)。)。int i,*i_pointer;i_pointer=&i;13C语言程序设计语言程序设计 温州理工学院温州理工学院 13地址与指针概述地址与指针概述(contd)
11、图图(a)表示表示直接访问直接访问,根据变量,根据变量i的地址直接对变量的地址直接对变量i的存储的存储单元进行存取访问单元进行存取访问。图。图(b)则表示则表示间接访问间接访问,先找到存放,先找到存放变量变量i地址的变量地址的变量i_pointer,从其中得到变量,从其中得到变量i的地址,然的地址,然后找到变量后找到变量i的存储单元,对它进行存取访问。的存储单元,对它进行存取访问。14C语言程序设计语言程序设计 温州理工学院温州理工学院 14指针、指针变量指针、指针变量&指针变量的值指针变量的值一个一个变量的地址变量的地址称为该变称为该变量的量的“指针指针”。例如,地。例如,地址址2000是变
12、量是变量i的指针。的指针。如果有一个变量专门用来如果有一个变量专门用来存放另一存放另一变量的地址变量的地址(即(即指针),则它称为指针),则它称为“指针指针变量变量”。如。如i_pointer就是就是一个指针变量。一个指针变量。指针变量的值(即指针变指针变量的值(即指针变量中存放的值)是量中存放的值)是地址地址(即指针)(即指针)。15C语言程序设计语言程序设计 温州理工学院温州理工学院 15为什么要为指针变量定义类型为什么要为指针变量定义类型?既然指针变量的值是一个地址,那么这个地址不仅既然指针变量的值是一个地址,那么这个地址不仅可以是变量的地址,也可以是其它数据结构的地址。可以是变量的地址
13、,也可以是其它数据结构的地址。在一个指针变量中存放一个数组或一个函数的首地在一个指针变量中存放一个数组或一个函数的首地址有何意义呢?址有何意义呢?因为数组或函数都是连续存放的。通过访问指因为数组或函数都是连续存放的。通过访问指针变量取得了数组或函数的首地址,也就找到了针变量取得了数组或函数的首地址,也就找到了该数组或函数。这样一来,凡是出现数组,函数该数组或函数。这样一来,凡是出现数组,函数的地方都可以用一个指针变量来表示,只要该指的地方都可以用一个指针变量来表示,只要该指针变量中赋予数组或函数的首地址即可。针变量中赋予数组或函数的首地址即可。16C语言程序设计语言程序设计 温州理工学院温州理
14、工学院 16为什么要为指针变量定义类型为什么要为指针变量定义类型?在在C语言中,一种数据类型或数据结构往往都语言中,一种数据类型或数据结构往往都占有一组连续的内存单元。占有一组连续的内存单元。用用“地址地址”这个概念并不能很好地描述一这个概念并不能很好地描述一种数据类型或数据结构,种数据类型或数据结构,而而“指针指针”虽然实际上也是一个地址,但虽然实际上也是一个地址,但它却是一个数据结构的首地址,它是它却是一个数据结构的首地址,它是“指向指向”一个数据结构的,因而概念更为清楚,表一个数据结构的,因而概念更为清楚,表示更为明确。示更为明确。这也是引入这也是引入“指针指针”概念的概念的一个重要原因
15、。一个重要原因。17C语言程序设计语言程序设计 温州理工学院温州理工学院 17指指 针针地址与指针概述地址与指针概述变量的指针与指向变量的指针变量变量的指针与指向变量的指针变量指针运算符与指针变量运算指针运算符与指针变量运算数组与指针数组与指针字符串与指针字符串与指针指向函数的指针指向函数的指针返回指针值的函数返回指针值的函数指针数组与指向指针的指针指针数组与指向指针的指针本章小结本章小结参考书目及网络资源参考书目及网络资源讨论时间讨论时间18C语言程序设计语言程序设计 温州理工学院温州理工学院 18变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量变量的指针变量的指针就是变量的地址
16、。存放变量地址的就是变量的地址。存放变量地址的变量是指针变量。即在变量是指针变量。即在C语言中,允许用一个语言中,允许用一个变量来存放指针,这种变量称为变量来存放指针,这种变量称为指针变量指针变量。一个一个指针变量的值指针变量的值就是某个变量的地址或称为就是某个变量的地址或称为某变量的指针。某变量的指针。为了表示指针变量和它所指向的变量之间的关为了表示指针变量和它所指向的变量之间的关系,在程序中用系,在程序中用“*”符号表示符号表示“指向指向”。19C语言程序设计语言程序设计 温州理工学院温州理工学院 19变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量为了表示指针变量和它所指向的
17、变量之间的关为了表示指针变量和它所指向的变量之间的关系,在程序中用系,在程序中用“*”符号表示符号表示“指向指向”。例如,例如,i_pointer 代表指针变量,而代表指针变量,而*i_pointer 是是i_pointer 所指向的变量。因此,下面两个语句作用所指向的变量。因此,下面两个语句作用相同:相同:i=3;*i_pointer=3;/*将将3 赋给指针变量赋给指针变量i_pointer所指向所指向的变量。的变量。*/20C语言程序设计语言程序设计 温州理工学院温州理工学院 20指针变量的定义指针变量的定义格式格式:基类型基类型*指针变量名指针变量名 指针变量的命名规则与普通变量的命名
18、规则指针变量的命名规则与普通变量的命名规则相同。相同。*表示所定义变量的类型为指针型。表示所定义变量的类型为指针型。例例如如,int a;定定义义了了一一个个整整型型变变量量a,而而int*p;定定义了一个指向整型变量的指针型变量义了一个指向整型变量的指针型变量p。基类型为基类型为C语言的各种类型符。语言的各种类型符。如如int、float、char等。其含义为该指针变量中等。其含义为该指针变量中存放的是什么类型变量的地址。存放的是什么类型变量的地址。21C语言程序设计语言程序设计 温州理工学院温州理工学院 21指针变量的定义指针变量的定义下面都是合法的定义:下面都是合法的定义:float *
19、pointer_3;/pointer_3是是指向指向float型变量的指针变量型变量的指针变量char*pointer_4;/pointer_4是是指向字符型变量的指针变量指向字符型变量的指针变量可以用赋值语句使一个指针变可以用赋值语句使一个指针变量得到另一个变量的地址,从量得到另一个变量的地址,从而使它指向一个该变量。如:而使它指向一个该变量。如:pointer_1=&i;pointer_2=&j;22C语言程序设计语言程序设计 温州理工学院温州理工学院 22指针变量的定义指针变量的定义指针变量前面的指针变量前面的“*”,表示该变量的类型为指针,表示该变量的类型为指针型变量。型变量。例例:f
20、loat *pointer_1;指针变量名是指针变量名是pointer_1,而不是,而不是*pointer_1。在定义指针变量时必须指定基类型。在定义指针变量时必须指定基类型。指针变量的类型必须与所指向变量的地址的变量指针变量的类型必须与所指向变量的地址的变量基类型一致。下面的赋值是错误的:基类型一致。下面的赋值是错误的:float a;int *pointer_1;pointer_1=&a;/错误。不能将错误。不能将float型变量的地址放到型变量的地址放到指向整型变量的指针变量中指向整型变量的指针变量中23C语言程序设计语言程序设计 温州理工学院温州理工学院 23指针变量的引用指针变量的引
21、用指针变量的引用指针变量的引用指针变量同普通变量一样,使用之前不仅要定义说指针变量同普通变量一样,使用之前不仅要定义说明,而且必须赋予具体的值。明,而且必须赋予具体的值。未经赋值的指针变量不能使用,否则将造成系统混未经赋值的指针变量不能使用,否则将造成系统混乱,甚至死机。乱,甚至死机。指针变量的赋值只能赋予地址,指针变量的赋值只能赋予地址,决不能赋予任何决不能赋予任何其它数据,否则将引起错误。其它数据,否则将引起错误。在在C语言中,变量的地址是由编译系统分配的,对语言中,变量的地址是由编译系统分配的,对用户完全透明,用户不知道变量的具体地址。用户完全透明,用户不知道变量的具体地址。24C语言程
22、序设计语言程序设计 温州理工学院温州理工学院 24两个有关的运算符两个有关的运算符&和和*&:取地址运算符。:取地址运算符。*:指针运算符(或称:指针运算符(或称“间接访问间接访问”运算符)运算符)int a,*p1;/*定义一个整型变量定义一个整型变量a和一个指向和一个指向整型变量的指针变量整型变量的指针变量p1*/float b,*p2;/*定义一个单精度型变量定义一个单精度型变量b和一个和一个指向单精度型变量的指针变量指向单精度型变量的指针变量p2*/p1=&a;/*使使p1指向指向a,不能试图通过,不能试图通过p1=&b;使使p1指向指向b*/p2=&b;/*使使p2指向指向b,不能试
23、图通过,不能试图通过p2=&a;使使p2指向指向a*/25C语言程序设计语言程序设计 温州理工学院温州理工学院 25指针变量的访问指针变量的访问指针变量指向另一个变量指针变量指向另一个变量所谓将指针变量指向另一个变量,就是将另一个变量所谓将指针变量指向另一个变量,就是将另一个变量的地址赋值给指针变量。的地址赋值给指针变量。只能将数据类型与指针变量基类型相同的变量的地址只能将数据类型与指针变量基类型相同的变量的地址赋值给指针变量。赋值给指针变量。使用地址运算符使用地址运算符&可以获得指定变量的地址。可以获得指定变量的地址。引用指针变量引用指针变量 通通过过使使用用指指针针运运算算符符*(或或称称
24、间间接接访访问问运运算算符符)可可以以间间接访问指针变量所指向的变量接访问指针变量所指向的变量 格式格式:*指针变量指针变量26C语言程序设计语言程序设计 温州理工学院温州理工学院 26通过指针变量间接访问另一个变量通过指针变量间接访问另一个变量#include main()int a=5,b=8,*p1,*p2;p1=&a;p2=&b;printf(a=%d,b=%dn,*p1,*p2);*p1=*p1+*p2;/*相当于相当于a=a+b;*/printf(a+b=%dn,*p1);/*printf(a+b=%dn,a);*/27C语言程序设计语言程序设计 温州理工学院温州理工学院 27通过
25、指针变量访问整型变量通过指针变量访问整型变量#include main()int a,b;int*pointer_1,*pointer_2;a=100;b=10;pointer_1=&a;/*把变量把变量a的地址赋给的地址赋给pointer_1*/pointer_2=&b;/*把变量把变量b的地址赋给的地址赋给pointer_2*/printf(%d,%dn,a,b);printf(%d,%dn,*pointer_1,*pointer_2);return 0;28C语言程序设计语言程序设计 温州理工学院温州理工学院 28“&”和和“*”运算符使用说明运算符使用说明如果已执行了语句如果已执行了语
26、句pointer_1=&a;&*pointer_1的的含义是什么?含义是什么?“&”和和“*”两个运算符的优先级别相同,但按两个运算符的优先级别相同,但按自右自右而左方向而左方向结合,因此先进行结合,因此先进行*pointer_1的运算,它就的运算,它就是变量是变量a,再执行,再执行&运算。因此,运算。因此,&*pointer_1与与&a相相同同,即变量,即变量a的地址。的地址。如果已执行了语句如果已执行了语句pointer_1=&a;*&a的含义是的含义是什么?什么?先进行先进行&a运算,得运算,得a的地址,再进行的地址,再进行*运算。即运算。即&a所所指向的变量,即变量指向的变量,即变量a
27、。*&a和和*pointer_1的作用是一的作用是一样的,它们都等价于变量样的,它们都等价于变量a。即。即*&a与与a等价等价。29C语言程序设计语言程序设计 温州理工学院温州理工学院 29“&”和和“*”运算符使用说明运算符使用说明若有若有pointer_1=&a;pointer_2=&*pointer_1;它的作用是将它的作用是将&a(a的地址的地址)赋给赋给pointer_2;若若pointer_2原来指向原来指向b,经过重新赋值后它已不,经过重新赋值后它已不再指向再指向b了,而指向了了,而指向了a。30C语言程序设计语言程序设计 温州理工学院温州理工学院 30“&”和和“*”运算符使用
28、说明运算符使用说明如果已执行了语句如果已执行了语句pointer_1=&a;(*pointer_1)+相当于相当于a+。注意括号是必要的。由于注意括号是必要的。由于+和和*为同一优先级别,为同一优先级别,且结合方向为且结合方向为自右而左自右而左。#include main()int a,b,c,*pointer_1;a=5;pointer_1=&a;b=(*pointer_1)+;printf(a=%d,%dn,a,*pointer_1);a=5;pointer_1=&a;c=*pointer_1+;printf(a=%d,%dn,a,*pointer_1);return 0;31C语言程序设
29、计语言程序设计 温州理工学院温州理工学院 31变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量按先大后小的顺序输出两个整数按先大后小的顺序输出两个整数a和和b。#include main()int*p1,*p2,*p,a,b;scanf(%d,%d,&a,&b);p1=&a;p2=&b;if(ab)p=p1;p1=p2;p2=p;printf(a=%d,b=%dn,a,b);printf(%d,%dn,*p1,*p2);return 0;两个两个printf 函数作用函数作用是相同的是相同的,*p1 和和*p2 就是变量就是变量a 和和b。“p1=&a”和和“p2=&b”不能写成不
30、能写成“*p1=&a”和和“*p2=&b”。32C语言程序设计语言程序设计 温州理工学院温州理工学院 32变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量当输入当输入a=5,b=9时,由于时,由于ab,将,将p1和和p2交换。交换。交换前的情况见图交换前的情况见图(a),交换后见图,交换后见图(b)。33C语言程序设计语言程序设计 温州理工学院温州理工学院 33变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量输入输入a和和b两个整数,按先大后小的顺序输出两个整数,按先大后小的顺序输出a和和b。#include main()void swap(int*p1,int*p2)
31、;int a,b;int*pointer_1,*pointer_2;scanf(%d,%d,&a,&b);pointer_1=&a;pointer_2=&b;if(ab)swap(pointer_1,pointer_2);printf(n%d,%dn,a,b);void swap(int*p1,int*p2)int temp;temp=*p1;*p1=*p2;*p2=temp;实参实参pointer_1和和pointer_2是指针变量是指针变量,在函数调用时在函数调用时,将将实参变量的值传递给形参变实参变量的值传递给形参变量。采取的依然是量。采取的依然是“值传递值传递”方式。因此虚实结合后形参
32、方式。因此虚实结合后形参p1的值为的值为&a,p2的值为的值为&b。这时这时p1和和pointer_1指向变量指向变量a,p2和和pointer_2指向变量指向变量b。执行执行执行执行swap函数的函数函数的函数体使体使*p1和和*p2的值互换,也的值互换,也就是使就是使a 和和b 的值互换。函数的值互换。函数调用结束后,调用结束后,p1和和p2不复存不复存在在(已释放已释放)。34C语言程序设计语言程序设计 温州理工学院温州理工学院 34指针变量作为函数参数指针变量作为函数参数当输入当输入a=5,b=9时,交换过程如图所示。时,交换过程如图所示。35C语言程序设计语言程序设计 温州理工学院温
33、州理工学院 35指针变量作为函数参数指针变量作为函数参数不能通过改变指针形参的值而使指针实参的值改变。不能通过改变指针形参的值而使指针实参的值改变。#include main()void swap(int*p1,int*p2);int a,b;int*pointer_1,*pointer_2;scanf(%d,%d,&a,&b);pointer_1=&a;pointer_2=&b;if(ab)swap(pointer_1,pointer_2);printf(n%d,%dn,a,b);void swap(int*p1,int*p2)int*temp;*temp=*p1;*p1=*p2;*p2=*
34、temp;*p1就是就是a,是整型变量。,是整型变量。而而*temp是指针变量是指针变量temp所所指向的变量。但指向的变量。但temp中并无中并无确定的值确定的值(它的值是不可预见它的值是不可预见的的),因此,因此temp所指向的单元所指向的单元也是不可预见的。也是不可预见的。对对*temp赋值有可能给一个赋值有可能给一个存储着重要数据的存储单元存储着重要数据的存储单元赋值,将会破坏系统的正常赋值,将会破坏系统的正常工作状况。应该将工作状况。应该将*p1的值赋的值赋给一个整型变量,如用整型给一个整型变量,如用整型变量变量temp作为临时辅助变量作为临时辅助变量实现实现*p1与与*p2的交换。
35、的交换。36C语言程序设计语言程序设计 温州理工学院温州理工学院 36指针变量作为函数参数指针变量作为函数参数#include main()void swap(int*p1,int*p2);int a,b;int*pointer_1,*pointer_2;scanf(%d,%d,&a,&b);pointer_1=&a;pointer_2=&b;printf(n%d,%dn,*pointer_1,*pointer_2);if(ab)swap(pointer_1,pointer_2);printf(n%d,%dn,*pointer_1,*pointer_2);printf(n%d,%dn,a,b)
36、;void swap(int*p1,int*p2)int temp;temp=*p1;*p1=*p2;*p2=temp;37C语言程序设计语言程序设计 温州理工学院温州理工学院 37指针变量作为函数参数指针变量作为函数参数调用函数调用函数:swap(x,y);被调用函数:被调用函数:swap(int*a,int*b)实参实参形参形参 x y 5 9 a b x y 5 9 a b 5 9 x y 5 9 swap(x,y)swap(a,b)调用前调用前 调用时调用时 调用后调用后 a b 38C语言程序设计语言程序设计 温州理工学院温州理工学院 38小结小结指指针针变变量量作作形形参参时时,对
37、对应应实实参参为为数数据据类类型型与与该该指指针变量基类型相同的变量的地址。针变量基类型相同的变量的地址。指指针针变变量量作作形形参参时时,参参数数传传递递的的形形式式仍仍然然为为值值传传递递。调调用用函函数数时时,形形参参与与对对应应实实参参占占据据着着不不同同的的存存储储空空间间,形形参参存存储储空空间间中中存存放放的的是是对对应应实实参参的的地址。地址。在函数调用过程中,通过对实参变量的间接访问,在函数调用过程中,通过对实参变量的间接访问,改变了对应实参的值。当函数调用完毕后,形参改变了对应实参的值。当函数调用完毕后,形参的存储空间仍然被收回,但此时实参存储空间中的存储空间仍然被收回,但
38、此时实参存储空间中已经保留了改变后的值,从而解决了在被调用函已经保留了改变后的值,从而解决了在被调用函数中改变调用函数中变量的问题。数中改变调用函数中变量的问题。39C语言程序设计语言程序设计 温州理工学院温州理工学院 39指指 针针地址与指针概述地址与指针概述变量的指针与指向变量的指针变量变量的指针与指向变量的指针变量指针运算符与指针变量运算指针运算符与指针变量运算数组与指针数组与指针字符串与指针字符串与指针指向函数的指针指向函数的指针返回指针值的函数返回指针值的函数指针数组与指向指针的指针指针数组与指向指针的指针本章小结本章小结参考书目及网络资源参考书目及网络资源讨论时间讨论时间40C语言
39、程序设计语言程序设计 温州理工学院温州理工学院 40指针运算符指针运算符指针变量可以进行某些运算,指针变量可以进行某些运算,但只能但只能进行赋值进行赋值运算和部分算术运算及关系运算。运算和部分算术运算及关系运算。取地址运算符取地址运算符&取地址运算符取地址运算符&是单目运算符,其结合性为是单目运算符,其结合性为自自右至左右至左,其功能是取变量的地址,其功能是取变量的地址。取内容运算符取内容运算符*取内容运算符取内容运算符*是单目运算符,其结合性为是单目运算符,其结合性为自右自右至左至左,用来表示指针变量所指的变量。在,用来表示指针变量所指的变量。在*运算运算符之后跟的变量必须是指针变量。符之后
40、跟的变量必须是指针变量。41C语言程序设计语言程序设计 温州理工学院温州理工学院 41指针运算符指针运算符指针运算符指针运算符*和和指针变量说明中的指针说明符指针变量说明中的指针说明符*不是一回事。在指针变量说明中,不是一回事。在指针变量说明中,“*”是类是类型说明符,表示其后的变量是指针类型。而表型说明符,表示其后的变量是指针类型。而表达式中出现的达式中出现的“*”则是一个运算符用以表示则是一个运算符用以表示指针变量所指的变量。指针变量所指的变量。#include main()int a=5,*p;p=&a;/*表示指针变量表示指针变量p 取得了整型变量取得了整型变量a的地址的地址*/pri
41、ntf(%d,*p);/*表示输出变量表示输出变量a 的值的值*/42C语言程序设计语言程序设计 温州理工学院温州理工学院 42指针变量运算指针变量运算赋值运算:指针变量的赋值运算有以下几种形赋值运算:指针变量的赋值运算有以下几种形式。式。把把一个变量的地址赋予指向相同数据类型的指针变一个变量的地址赋予指向相同数据类型的指针变量。量。例如:例如:int a,*pa;pa=&a;/*把整型变量把整型变量a 的地址赋予整型的地址赋予整型指针变量指针变量pa*/把一个指针变量的值赋予指向相同类型变量的另一把一个指针变量的值赋予指向相同类型变量的另一个指针变量。个指针变量。如:如:int a,*pa=
42、&a,*pb;pb=pa;/*把把a 的地址赋予指针变的地址赋予指针变量量pb*/由于由于pa,pb 均为指向整型变量的指针变量,因此可均为指向整型变量的指针变量,因此可以相互赋值。以相互赋值。43C语言程序设计语言程序设计 温州理工学院温州理工学院 43指针变量运算指针变量运算把数组的首地址赋予指向数组的指针变量。把数组的首地址赋予指向数组的指针变量。例如:例如:int a5,*pa;pa=a;(数组名表示数组的首地址,故可数组名表示数组的首地址,故可赋予指向数组的指针变量赋予指向数组的指针变量pa)也可写为:也可写为:pa=&a0;/*数组第一个元素的地址也是整个数数组第一个元素的地址也是
43、整个数组的首地址,组的首地址,也可赋予也可赋予pa*/当然也可采取初始化赋值的方法:当然也可采取初始化赋值的方法:int a5,*pa=a;把字符串的首地址赋予指向字符类型的指针变量。把字符串的首地址赋予指向字符类型的指针变量。例如:例如:char*pc;pc=C Language;或用初始化赋值的方法写为:或用初始化赋值的方法写为:char*pc=C Language;这里应说明的是并不是把整个字符串装入指针变量,而是这里应说明的是并不是把整个字符串装入指针变量,而是把存放该字符串的字符数组的首地址装入指针变量把存放该字符串的字符数组的首地址装入指针变量。44C语言程序设计语言程序设计 温州
44、理工学院温州理工学院 44指针变量运算指针变量运算把把函数的入口地址赋予指向函数的指针变量。函数的入口地址赋予指向函数的指针变量。例如:例如:int(*pf)();pf=f;/*f为函数名为函数名*/45C语言程序设计语言程序设计 温州理工学院温州理工学院 45加减算术运算加减算术运算对于指向数组的指针变量,可以加上或减去一对于指向数组的指针变量,可以加上或减去一个整数个整数n。设设pa 是指向数组是指向数组a 的指针变量,则的指针变量,则pa+n,pa-n,pa+,+pa,pa-,-pa 运算都是合法的。指针变量运算都是合法的。指针变量加或减一个整数加或减一个整数n 的意义是把指针指向的当前
45、位置的意义是把指针指向的当前位置(指向某数组元素指向某数组元素)向前或向后移动向前或向后移动n个位置。个位置。数组指针变量向前或向后移动一个位置和地址数组指针变量向前或向后移动一个位置和地址加加1 或减或减1 在概念上是不同的。因为数组可以在概念上是不同的。因为数组可以有不同的类型,各种类型的数组元素所占的字有不同的类型,各种类型的数组元素所占的字节长度是不同的。节长度是不同的。46C语言程序设计语言程序设计 温州理工学院温州理工学院 46加减算术运算加减算术运算如指针变量加如指针变量加1,即向后移动,即向后移动1 个位置表示指针个位置表示指针变量指向下一个数据元素的首地址。而不是在变量指向下
46、一个数据元素的首地址。而不是在原地址基础上加原地址基础上加1。int a5,*pa;pa=a;/*pa 指向数组指向数组a,也是指向,也是指向a0*/pa=pa+2;/*pa 指向指向a2,即,即pa 的值为的值为&a2*/指针变量的加减运算只能对数组指针变量进行,指针变量的加减运算只能对数组指针变量进行,对指向其它类型变量的指针变量作加减运算是对指向其它类型变量的指针变量作加减运算是毫无意义的。毫无意义的。47C语言程序设计语言程序设计 温州理工学院温州理工学院 47两个指针变量之间的运算两个指针变量之间的运算只有指向同一数组的两个指针变量之间才能进只有指向同一数组的两个指针变量之间才能进行
47、运算,否则运算毫无意义。行运算,否则运算毫无意义。两指针变量相减:两指针变量相减所得之差是两指针变量相减:两指针变量相减所得之差是两个指针所指数组元素之间相差的元素个数。两个指针所指数组元素之间相差的元素个数。实际上是两个指针值实际上是两个指针值(地址地址)相减之差再除以该相减之差再除以该数组元素的长度数组元素的长度(字节数字节数)。例如例如:pf1和和pf2 是指向同一浮点数组的两个指针变是指向同一浮点数组的两个指针变量,设量,设pf1 的值为的值为2010H,pf2 的值为的值为2000H,而浮,而浮点数组每个元素占点数组每个元素占4 个字节,所以个字节,所以pf1-pf2 的结果为的结果
48、为(2010H-2000H)/4=4,表示,表示pf1 和和 pf2之间相差之间相差4 个个元素。元素。两个指针变量不能进行加法运算。如两个指针变量不能进行加法运算。如:pf1+pf2 是什是什么意思呢么意思呢?毫无实际意义。毫无实际意义。48C语言程序设计语言程序设计 温州理工学院温州理工学院 48两指针变量进行关系运算两指针变量进行关系运算指向同一数组的两指针变量进行关系运算可表指向同一数组的两指针变量进行关系运算可表示它们所指数组元素之间的关系。示它们所指数组元素之间的关系。pf1=pf2 表示表示pf1 和和pf2 指向同一数组元素;指向同一数组元素;pf1pf2 表示表示pf1 处于
49、高地址位置;处于高地址位置;pf1pf2 表示表示pf1 处于低地址位置。处于低地址位置。指针变量还可以与指针变量还可以与0 比较。比较。设设p为指针变量,则为指针变量,则 p=0 表明表明p是空指针,它不指向任何变量;是空指针,它不指向任何变量;p!=0 表示表示p 不是空指针。不是空指针。49C语言程序设计语言程序设计 温州理工学院温州理工学院 49两指针变量进行关系运算两指针变量进行关系运算空指针是由对指针变量赋予空指针是由对指针变量赋予0 值而得到的。例值而得到的。例如:如:#define NULL 0int*p=NULL;对指针变量赋对指针变量赋0 值和不赋值是不同的。指针变量未值和
50、不赋值是不同的。指针变量未赋值时,可以是任意值,是不能使用的。否则将造赋值时,可以是任意值,是不能使用的。否则将造成意外错误。而指针变量赋成意外错误。而指针变量赋0 值后,则可以使用,值后,则可以使用,只是它不指向具体的变量而已。只是它不指向具体的变量而已。50C语言程序设计语言程序设计 温州理工学院温州理工学院 50指针运算符与指针变量运算指针运算符与指针变量运算(contd)#include main()int a=10,b=20,s,t,*pa,*pb;/*说明说明pa,pb 为整型指针变为整型指针变量量*/pa=&a;/*给指针变量给指针变量pa 赋值,赋值,pa 指向变量指向变量a*