C++程序设计 教学课件 ppt 作者 冯博琴 C++第6章

上传人:E**** 文档编号:89423307 上传时间:2019-05-25 格式:PPT 页数:84 大小:206.50KB
返回 下载 相关 举报
C++程序设计 教学课件 ppt 作者 冯博琴 C++第6章_第1页
第1页 / 共84页
C++程序设计 教学课件 ppt 作者 冯博琴 C++第6章_第2页
第2页 / 共84页
C++程序设计 教学课件 ppt 作者 冯博琴 C++第6章_第3页
第3页 / 共84页
C++程序设计 教学课件 ppt 作者 冯博琴 C++第6章_第4页
第4页 / 共84页
C++程序设计 教学课件 ppt 作者 冯博琴 C++第6章_第5页
第5页 / 共84页
点击查看更多>>
资源描述

《C++程序设计 教学课件 ppt 作者 冯博琴 C++第6章》由会员分享,可在线阅读,更多相关《C++程序设计 教学课件 ppt 作者 冯博琴 C++第6章(84页珍藏版)》请在金锄头文库上搜索。

1、1,第6章 指针,中国铁道出版社,2,6.1 指针和指针变量的概念,1内存单元的地址 内存的逻辑结构由以字节为单位的连续存储单元构成 每个单元都有一个惟一的编号称为内存单元的地址 2变量的地址 定义一个变量后,编译系统根据变量的类型为其分配若干个字节的连续内存空间。 在变量分配到的连续内存单元中,第一个内存单元的地址称为变量的地址,3,变量i的地址是2000 变量j的地址是2004,4,3变量的指针和指针变量,变量的地址称为变量的指针 专门用来存放指针即地址的变量称为指针变量 指针变量的值=指针(即另一个变量的地址) 当一个指针变量p保存的是某个变量i的地址时,就称变量p指向了变量i。,5,4

2、变量的直接存取和间接存取,直接存取或直接访问方式: 对变量进行的存取是直接按变量的名称进行存取 例如:cini; k=i; 间接存取方式: 通过指向某个变量的指针变量间访问变量a的值,6,5与指针运算有关的运算符,(1)取地址运算符“ / 作为位与运算符,7,(2)指向运算符“*”,指向运算符“*”又称为间接访问运算符,结果是取出地址中保存的数据。 例如: 已知指针变量p指向变量i,则通过p实现对变量i的间接赋值: *p=4; 这与 i=4;的效果是一样的。,8,6.2 指针变量,使用指针变量的三个步骤: (1)定义指针变量; (2)对指针变量进行赋值,就是使其指向某个变量; (3)间接访问(

3、引用)该指针变量指向的变量的值。,9,6.2.1 指针变量的定义,1指针变量的定义格式 格式: 类型标识符 * 指针变量名 例如: int *x, *y; 指针变量的使用说明: (1)一个指针变量只能指向一种类型的变量; (2)指针变量必须指向一个变量后,才能对其指向的对象进行操作。,10,【例6-1】指针变量的定义和使用,#include using namespace std; void main() int a=100,*p; / 指针变量的定义 p= / 使用指针变量进行间接访问 ,11,2指针变量的基类型,指针变量所指向的变量类型称为“基类型” 例如,定义:int *i1, *i2;

4、 char *c1, *c2; float *f1, *f2; 变量i1、i2的基类型是整型(int),变量c1、c2的基类型是字符型(char),变量f1、f2的基类型则是浮点型(float)。 通过指针变量的值可以知道连续单元的起始地址 通过基类型可以知道从起始地址开始连续多少个单元为该指针变量所指向的变量的单元。,12,6.2.2 指针变量可以进行的运算,1赋值运算 (1)通过求地址运算符&,例如: p=&a; (2)通过其它指针变量获得,例如:p=q; 要求这两个变量具有相同的基类型 (3) 通过运算符获得,例如: p=new int100; 其中new是动态申请存储空间的运算符 (4

5、)给指针变量赋空值,例如: p=NULL;,13,2算术运算,设px和py是具有相同基类型的指针变量,n为整数。 (1)px+n和px-n 结果为指针,px当前位置的前方或后方n 个数据位置。 pxn的实际地址: pxn数据长度(字节) (2)px+或+px :使px指向下一个数据位置 (3)px-或-px :使px指向上一个数据位置 (4)px-py 结果是两个指针变量所指向的地址间相隔的数据个数。,14,3关系运算,两个指针变量间的关系运算是比较其指向的内存地址位置之间的前后关系,结果为逻辑值0或1。 例如:如果pxpy成立,则表示px所指的单元的位置在py所指单元位置之前。,15,6.2

6、.3 动态存储空间的分配,动态存储分配方式 在程序运行期间,根据用户输入的信息决定分配空间的大小,该空间不再使用时,可以由用户进行释放 申请空间和释放空间分别通过运算符new和delete实现 1动态申请存储空间 格式: 指针变量= new数据类型(初值); 在申请空间时,如果没有足够的内存单元,返回空指针NULL,表示动态申请空间操作失败。,16,(1)动态申请空间,【例6-2】动态申请空间,空间大小为整型数据所占的空间 #include using namespace std; void main() int *p1; p1=new int; / 申请int类型的变量空间,并使p指向它 *

7、p1=5; / 间接引用所申请的空间 coutp1endl*p1endlsizeof(p1); 说明:前2条语句可以合成一条: int *p1=new int; 前3条语句可以合并为一条:int *p1=new int (5);,17,(2)动态申请数组,使用new对数组进行动态分配,数组长度可以变化: 指针变量= new数据类型 元素个数; 元素个数可以是常量、变量或表达式 例如: cinn; int *p=new intn;,18,【例6-3】动态申请数组,#include using namespace std; void main() int n,i; coutn; int *p1=n

8、ew int n; /元素个数用的是变量 for(i=0;in;i+) p1i=i; for(i=0;in;i+) coutp1i“ “; ,19,2动态释放内存空间,由new申请的空间必须由delete释放。 释放变量: delete 指针; 释放数组: delete 指针; new和delete总是配合使用 例如: delete p1; delete p1;,20,6.3 指针和函数,函数的指针 函数名代表该函数在编译时分配的连续内存单元的入口地址 指向函数的指针变量 用来存放函数指针的变量 通过这样的指针变量可以间接地调用一个函数。,21,6.3.1 用指针变量调用函数,(1)定义指针变

9、量 格式: 类型名 (*指针变量名)(形参表列); 例如: int (*p)(int,int); (2)为指针变量赋值 格式:指针变量函数名 ; 例如: p=max; (3)用指针变量调用函数 格式:(*指针变量名)(实参表列) 或 指针变量名(实参表列) 例如:直接调用max:c=max(a,b); 间接调用max:c=(*p)(a,b); 或 c=p(a,b);,22,【例6-4】使用指针变量调用函数,#include using namespace std; int add(int x,int y) return x+y; void main() int a=10,b=20,c; int

10、 (*f)(int,int); / 定义指向函数的指针变量 f=add; / 指针变量f指向函数add c=(*f)(a,b); / 使用f间接调用add couta“+“b“=“c; ,23,【例6-5】使用指针变量分别调用不同的函数,#include using namespace std; void add(int x,int y) cout“sum=“x+yendl; void sub(int x,int y) cout“difference=“x-yendl; void process(int x,int y,void (*fun)(int,int) (*fun)(x,y); voi

11、d main() int a=5,b=4; process(a,b,add); process(a,b,sub); ,24,6.3.2函数调用时的地址传递,地址传递时,实参可以是指针变量或某个变量的地址(例如&a),形参则是指针变量。 如果实参是指针变量,这时,实参与形参指向同一个变量,在被调函数中,可以通过形参变量间接改变其指向的主调函数中变量的值。 如果实参是地址,在被调函数中,可以对形参所指向的变量进行操作,25,【例6-6】在被调函数中交换主调函数中变量的值,在函数swap中实现交换主调函数中两个整型变量的值,并在主调函数中显示交换的结果 #include using namespac

12、e std; void swap(int *,int *); void main() int a=5,b=10; cout“a=“a“,b=“bendl; swap( ,26,【例6-6】(续),void swap(int *m,int *n) / 形参为指针变量用来接收实参的地址 int t=*m; *m=*n; *n=t; ,27,【例6-7】使用地址传递在被调函数中改变主调函数变量的值,#include using namespace std; void fun(int x,int y,int *sum,int *dif) *sum=x+y; *dif=x-y; void main()

13、int a,b,c,d; cinab; fun(a,b, ,28,实参是数组名、形参是指针变量,将一维数组名或数组首元素的地址作为函数实参传递给被调函数的形参指针变量时,该指针变量就指向了这个一维数组,确切地说,是指向了一维数组的第0个元素,在被调函数中对形参指向的对象的操作就是对一维数组元素的操作。,29,【例6-8】将数组元素反序存放,将数组a中n 个整数按相反顺序存放,在主函数中对数组进行初始化,在被调函数中实现反序,最后在主调函数中显示反序的结果。 进行反序时,将a0和an-1交换,a1和an-2交换,设两个指针变量i和j,首先让其分别指向a0和an-1,交换后,再让它们分别指向a1和

14、an-2,可用i+和j实现,经过(n-1)/2次循环后,反序完成:,30,【例6-8】(续),#include using namespace std; void inv(int *x,int n) int t,*i,*j; i =x; j=x+n-1; for(;ij;i+,j-) t=*i; *i=*j; *j=t; ,31,【例6-8】(续),void main() int i,a10=3,7,9,11,0,6,7,5,4,2; cout“the original array:“; for (i=0;i10;i+) coutai“ “; coutendl; inv(a,10); cout

15、“the inverted array:“; for (i=0;i10;i+) coutai“ “; coutendl; ,32,6.4 数组和指针,将数组名赋给指针变量,让该变量指向某个数组,然后通过该指针变量来间接访问数组中的每个元素。,33,6.4.1 一维数组的地址和数组元素的引用,1数组元素的地址 数组元素的地址是元素在内存中存放的地址 表示方法: &数组名下标 或 数组名+下标。 例如:a2的地址可以表示成&a2或 a+2 ai的地址可以表示成&ai或 a+i,34,【例6-9】引用一维数组元素的3种方法,#include using namespace std; void main() int a10=1,2,3,4,5,6,7,8,9,10,*p,i; for(i=0;i10;i+) coutai“ “; / 使用数组名和下标 coutendl;,35,【例6-9】(续),for(i=0;i10;i+) p= / 使用指针变量间接访问元素 ,36,2一维数组的首地址,首地址是数组元素所在内存单元的起始地址,可以用数组名a表示,也可以用&a0 表示。 用数组名引用数组中的元素有以下两种方法: 下标法: 数组名下标 指针法: *(数组名+下标),

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号