程序设计基础第8章.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《程序设计基础第8章.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序设计 基础
- 资源描述:
-
1、指针与指针变量指针与指针变量8.18.2指针与数据指针与数据8.3指针与函数指针与函数指针与字符串指针与字符串8.48.5指针数组与指向指针数组与指向指针的指针指针的指针8.1.1 8.1.1 指针的概念指针的概念 为了说清楚什么是指针,必须弄清楚数据在内存中是如何存储的,又是如何读取的。内存区的每一个字节有一个编号,这就是“地址”。如果在程序中定义了一个变量,在对程序进行编译时,系统就会给这个变量分配内存单元。按变量地址存取变量值的方式称为按变量地址存取变量值的方式称为“直接访问直接访问”方式方式(,);(,);例如:例如:8.1.1 8.1.1 指针的概念指针的概念 另一种存取变量值的方式
2、称为另一种存取变量值的方式称为“间接访问间接访问”的方式。即,的方式。即,将变量将变量的地址存放在另一个变量中的地址存放在另一个变量中8.1.1 8.1.1 指针的概念指针的概念 在语言中,指针是一种特殊的变量,它是存放地址的。假设我们定义了一个指针变量i_pointer用来存放整型变量的地址,它被分配地址为(3010)、(3011)的两个字节。可以通过语句:i_pointer;将的地址(2000)存放到i_pointer中。这时,i_pointer的值就是(2000),即变量所占用单元的起始地址。要存取变量的值,可以采用间接方式:先找到存放“的地址”的变量i_pointer,从中取出的地址(
3、2000),然后到2000、2001字节取出的值()。8.1.1 8.1.1 指针的概念指针的概念 8.1.2 8.1.2 指针的定义、初始化与应用指针的定义、初始化与应用 基本类型基本类型 *指针变量名指针变量名;定义指针变量的一般形式为:1.1.指针变量的定义指针变量的定义“先定义,后使用先定义,后使用”下面都是合法的定义:float*op3;/*定义了一个实型指针变量*/char*op4;/*定义了一个字符型指针变量*/8.1.2 8.1.2 指针的定义、初始化与应用指针的定义、初始化与应用 定义指针变量时应注意以下几点:2定义指针变量时必须指定其类型。指针数据都是地址,原本是没有区别的
4、。但不同的变量占据的内存大小不同,其适合的操作也不同,在使用指针变量进行间接访问操作时,必须知道其数据长度及适合运算,因此必须指定其类型。1指针变量前面的*表示要定义的是指针变量,而不是算术运算中的乘号,指针变量名是*后面的标识符。每定义一个指针变量,就要写一个*。8.1.2 8.1.2 指针的定义、初始化与应用指针的定义、初始化与应用 3各类型的指针变量只能指向同类型的变量。2 2.指针变量的初始化和引用指针变量的初始化和引用 C语言中有两个地址运算符,分别对应指针变量的两种运算:&:取地址运算符,运算对象为变量,运算结果为运算对象的内存地址。例如:int i,*pi;pi=&i;/*pi指
5、向i*/8.1.2 8.1.2 指针的定义、初始化与应用指针的定义、初始化与应用 *:间接访问运算符,运算对象为指针变量,在一个指针变量前加*,表示该指针所指向的内存单元的值。也就是说,指针变量保存的是一个内存的起始地址,指针变量加*后表示该地址所对应的存储单元的值。例如:*pi=5;/*间接访问pi,即以pi的内容1000为地址的存储单元的内容为5*/8.1.2 8.1.2 指针的定义、初始化与应用指针的定义、初始化与应用 定义了指针 pi 并赋值后,内存的分配情况如图所示:i(1000)i(1000)100010005 5*pipipipi 指针变量同普通变量一样,使用之前不仅要定义说明,
6、而且必须赋予具体的值。在定义指针变量时,可以给指针变量赋一个初始值,这一过程称为初始化。未经赋值的指针变量不能使用。指针变量只能赋予地址,不能赋予其它任何数据,否则将引起错误,这时就用到了指针运算符&和*。8.1.2 8.1.2 指针的定义、初始化与应用指针的定义、初始化与应用 (1)Pf 是一个指针变量,存放了变量f的指针(也就是变量f的内存地址)。*pf 表示指针所对应的内存单元的值,实际上就是变量f的值。因此,对*pf 的赋值会直接改变变量f的值。(2)*运算符的优先级比算术运算符高,因此,*pf+1.0等价于(*pf)+1.0。8.1.2 8.1.2 指针的定义、初始化与应用指针的定义
7、、初始化与应用 【例【例】输入两个整数 x 和 y,比较后降序输出。include void main()int*op1,*op2,*op,x,yscanf(%d%d,&x,&y);op1=&x;op2=&y;if(xy)op=op1;op1=op2;op2=op;/*两个指针变量交换,交换以后,op1指向存放大数的单元,op2指向存放小数的单元*/printf(x=%d,y=%dn,x,y);printf(max=%d,min=%dn,*op1,*op2);8.1.2 8.1.2 指针的定义、初始化与应用指针的定义、初始化与应用 运行结果:128365a=365,b=128Max=365,m
8、in=128128365opop1op2128365opop1op2op1op2xy8.1.3 8.1.3 指针变量作为函数参数指针变量作为函数参数 用指针变量作为函数的参数,形参和实参都应当为指针类型数据。使用指针变量作参数,在函数执行过程中能够使指针变量所指向的变量值发生变化,从而在函数调用结束后这些变化后的值得以保存,并在主调函数中使用它们。【例【例】指针作为函数参数示例。参考程序:参考程序:void Doub(float*pNum)*pNum=*pNum*2;main()float f=10.0;Doub(&f);printf(nn=%f,f);运行结果:运行结果:n=20.00000
9、08.1.3 8.1.3 指针变量作为函数参数指针变量作为函数参数 传递指针的过程是值由实参向形参的传递指针的过程是值由实参向形参的单向传递过程,形式参数的变化不会单向传递过程,形式参数的变化不会影响到实际参数的值。需要注意的是,影响到实际参数的值。需要注意的是,不能企图通过改变指针形参的值而使不能企图通过改变指针形参的值而使指针实参的值也改变指针实参的值也改变 。8.2.1 8.2.1 指针数据元素的指针指针数据元素的指针 所谓数组的指针是指数组的起始地址,数组元素的指针是所谓数组的指针是指数组的起始地址,数组元素的指针是数组元素的地址。数组元素的地址。一个数组是由连续的一块内存单元组成的,
10、数组名就是这块连续内存单元的首地址。一个数组也是由各个数组元素(下标变量)组成的,每个数组元素按其类型不同占有几个连续的内存单元。一个数组元素的首地址也是指它所占有的几个内存单元的首地址。8.2.1 8.2.1 指针数据元素的指针指针数据元素的指针&a0pa013151719:a9p9*(a+9)或*(p+9)8.2.1 8.2.1 指针数据元素的指针指针数据元素的指针 下面两个语句等价:op=&a0;op=a;在定义指针变量时可以赋给初值:int*op=&a0;它等效于:int*op;op=&a0;当然定义时也可以写成:int*op=a;数组指针变量说明的数组指针变量说明的一般形式为:一般形
11、式为:基类型基类型 *指针变量名;指针变量名;8.2.2 8.2.2 通过指针引用数据元素通过指针引用数据元素通过下标的引用通过下标的引用通过指针的引用通过指针的引用 即用ai来引用数组a的第i个元素。在前面介绍数组时都是采用这种方法。即采用*(a+i)或*(op+i)形式,用间接访问的方法来访问数组元素,其中a是数组名,op是指向数组的指针变量,其初值op=a。方法方法引用一个数组元素可以采用以下两种方法:8.2.2 8.2.2 通过指针引用数据元素通过指针引用数据元素【例例】输出数组中的全部元素(用指针变量指向元素)。参考程序:参考程序:#include void main()int a1
12、0,i,*op;op=a;for(i=0;i10;i+)*(op+i)=i;for(i=0;i10;i+)oprintf(a%d=%dn,i,*(op+i);8.2.2 8.2.2 通过指针引用数据元素通过指针引用数据元素1)指针变量可以实现本身的值的改变。如op+是合法的,而a+是错误的。因为a是数组名,它是数组的首地址,是常量。2)3)指针变量的当前值。虽然定义数组时指定它包含10个元素,但指针变量可以指到数组以后的内存单元,系统并不认为非法。对指针变量值进行改变时应注意以下几点:8.2.2 8.2.2 通过指针引用数据元素通过指针引用数据元素4)*op+,由于+和*同优先级,结合方向自右
13、而左,等价于*(op+)。6)5)(op+)与*(+op)作用不同。若op的初值为a,则*(op+)等价a0,*(+op)等价a1。(*op)+表示op所指向的元素值加1。7)如果op当前指向a数组中的第i个元素,则:*(op-)相当于ai-;*(+op)相当于a+i;*(-op)相当于a-i。8.2.3 8.2.3 数组名作为函数参数数组名作为函数参数 如果有一个实参数组,想在函数中改变此数组的元素值,则实参与形参的对应关系有以下4种:1 1.形参和实参都是数组名形参和实参都是数组名void main()int a10;f(a,10)f(int x,int n)和和指的是同一个数组。指的是同
展开阅读全文