C++课件第6章指针、结构体及引用chp1-6章节

上传人:E**** 文档编号:91227892 上传时间:2019-06-26 格式:PPT 页数:50 大小:877KB
返回 下载 相关 举报
C++课件第6章指针、结构体及引用chp1-6章节_第1页
第1页 / 共50页
C++课件第6章指针、结构体及引用chp1-6章节_第2页
第2页 / 共50页
C++课件第6章指针、结构体及引用chp1-6章节_第3页
第3页 / 共50页
C++课件第6章指针、结构体及引用chp1-6章节_第4页
第4页 / 共50页
C++课件第6章指针、结构体及引用chp1-6章节_第5页
第5页 / 共50页
点击查看更多>>
资源描述

《C++课件第6章指针、结构体及引用chp1-6章节》由会员分享,可在线阅读,更多相关《C++课件第6章指针、结构体及引用chp1-6章节(50页珍藏版)》请在金锄头文库上搜索。

1、1,第 6章 指针、结构体及引用,6.1 指针类型 6.2 指针变量的操作(运算) 6.3 指针运算实例 6.4 数组或指针作为函数参数 6.5 指针与内存动态分配 6.6 指针与数组 6.7 选择排序算法 6.8 按字典序排列名表 6.9 结构体类型 6.10 建立一个人员档案链表 6.11 指向函数的指针变量 6.12 返回指针值的函数 6.13 带参数的main函数 6.14 引用,2,6.1 指针类型 - 参看书p138的6.2.1小节,指针类型的变量说明格式为: * , * , . ; 例如: int i=3; int *pi; /pi为int*型变量,其取值为一个int型变量的地址

2、, /也称pi为指向int型数据的指针变量(简称指针),3,pi = ),4,读如下程序,看执行后会显示出什么结果?,#include void main() int i,j; int *pi, *pj; i = 3; j = 6; pi = ,5,程序执行后的显示结果如下: i,j=3, 6 *pi,*pj=3, 6 *pi,*pj=123, 125 i,j=123, 125,6,6.2 指针变量的操作(运算) - 参看书p140的6.2.2小节,1. 取地址运算,7,第一行的“*pi”处于变量说明处,是说明pi为“int*”型变量,并同时将该指针变量初始化为i的地址。不可将此处的“*”理解

3、为“取内容”运算,它与前面的int联合起来以说明pi为“int*”型变量。 第二行的“*pi”表示指针变量pi所指向的那一变量(即i)的内容(*理解为“取内容”运算,使用其值)。 第三行的“*pi”为左值(存储空间概念),表示要改变指针变量pi所指向的那一变量(即i)空间中的内容(使用其存储空间)。,8,2. 数组指针的算术运算,1) 若p为指针,已指向数组的某一元素,则p+i(或p-i,其中i为正整数)也为一指针,它指向当前p已指元素的后面(或前面)第i个元素。 例1: int a10; /任一数组名字a都是一个常量指针, /代表数组的首地址, 也即, a总等同于&a0,9,则,无论何时,

4、下述两种表示数组元素ai的方式总是相同的: a0 *a a1 *(a+1) . a9 *(a+9) 另,下述两种表示数组元素ai之地址的方式也总是相同的: &a0 a &a1 a+1 . &a9 a+9,10,例2: int a10; int* pa=a; /pa为变量指针,此时pa与a /均指向数组a的首元素 则,下述三种表示数组元素ai的方式是等同的: a0 *a *pa a1 *(a+1) *(pa+1) . a9 *(a+9) *(pa+9),11,另,下述三种表示数组元素ai之地址的方式也是等同的: 却都是不正确的句子! 为什么?)。,12,2) 若p,q都为同类型的指针,则p-q为

5、p与q之间的数据项数(当p,q指向同一数组时,结果有意义)。 3. 数组指针的关系运算 若p,q都为同类型的指针,则p与q间可进行6种比较运算(通常用于p,q指向同一数组的情况,靠前者其指针值小)。,13,6.3 指针运算实例,编程序,首先输入5个整数放入数组a,而后按输入的相反顺序输出这5个数。 1. 常量指针使用方式 解法一(通过数组名a,一个常量指针来实现) #include void main() int i,a5; cout“input 5 integers:“endl;,14,for(i=0; i*(a+i); /*(a+i)全同于ai, /a为数组首地址(一个常量指针) cout

6、=0; i-) cout*(a+i)“ “; coutendl; ,15,2变量指针使用方式 解法二(通过指针变量p值的变化,使其指向数组各元素并依次使用它们) #include void main() int i,a5,*p; /指针变量p cout“input 5 integers:“endl;,16,for(i=0; i*(a+i); cout=a; p-) cout=a为指针比较运算,17,6.4 数组或指针作为函数参数 6.4.1 数组作为函数参数 6.4.2 指针作为函数参数例1 6.4.3 指针作为函数参数例2,18,例:int a = 5;,定义整型变量 a 有两个值: 1、该

7、变量内容 5; 2、该变量在内存中的地址;它被表示为&a。,int *pa = ,用 * 定义的整型指针变量 pa 也有两个值: 1、内容为变量a在内存中的地址,即&a; 2、变量pa在内存中的地址;它被表示为&pa。 3、pa 是一个指向变量a 的指针。,变量a 与指针pa 的关系图,内容 地址,a 5 1000H,pa 1000 2000H,19,6.4.1 数组作为函数参数,通过指针(如数组名,或其它指针)作为函数参数,可起到如同引用参数那样的能“双向传递”数据的功能。 用法一:数组作形参,且在被调函数内使用或改变数组元素的值(已在5.7节介绍过,系统处理方法 -对形参数组元素的使用与改

8、变,就是对实参数组元素的直接使用与改变)。 读如下程序,看执行后会显示出什么结果?,20,#include void myFunc(int b, int num); void main() int a6=1,2,3,4,5,6; cout“before calling muFunc ai=“endl; for(int i=0;i6;i+) coutai“ “; coutendl; myFunc(a,6); /数组名a(一个常量指针)作实参 coutendl“after calling muFunc ai=“endl;,21,for(i=0;i6;i+) coutai“ “; /输出被myFun

9、c改变后的a数组各元素值(每一数都加了100) coutendl; /main 结束 void myFunc(int b, int num) int sum=0; for(int i=0;inum;i+) sum+=bi; coutendl“in myFunc, sum of bi=“sumendl; for(i=0;inum;i+) bi+=100; ,22,程序执行后的显示结果如下: before calling muFunc ai= 1 2 3 4 5 6 in myFunc, sum of bi=21 after calling muFunc ai= 101 102 103 104 1

10、05 106,23,6.4.2 指针作为函数参数例1 - 参看书p146的6.2.5小节的1,通过指针(如数组名,或其它指针)作为函数参数,可起到如同引用参数那样的能“双向传递”数据的功能。 用法二:指针作形参,且在被调函数内使用或改变指针所指变量的值(系统处理方法 -对形参指针所指变量值的使用与改变,就是对实参指针所指变量值的直接使用与改变) 读如下程序,看执行后会显示出什么结果?,24,#include void myFunc(int *p, int num); void main() int a6=1,2,3,4,5,6; int* pa=a; cout“before calling m

11、uFunc *(pa+i)=“endl; for(int i=0;i6;i+) cout*(pa+i)“ “; coutendl; myFunc(pa,6); /指针pa作为实参去调用自定义函数muFunc coutendl“after calling muFunc *(pa+i)=“endl;,25,for(i=0;i6;i+) cout*(pa+i)“ “; /输出被myFunc改变后以pa为首地址的 /各元素值(每一数都加了100) coutendl; void myFunc(int *p, int num) int sum=0; for(int i=0;inum;i+) sum+=*(

12、p+i); coutendl“in myFunc, sum of *(p+i)=“sumendl; for(i=0;inum;i+) *(p+i)+=100; ,26,程序执行后的显示结果如下: before calling muFunc ai= 1 2 3 4 5 6 in myFunc, sum of bi=21 after calling muFunc ai= 101 102 103 104 105 106,27,6.4.3 指针作为函数参数例2 - 参看书p146的6.2.5小节的1,读下面的程序,给出它执行后所显示的结果。,28,#include void swap1(int* p1

13、, int* p2); /指针参数 void swap12(int* p1, int* p2); /指针参数 void swap2(int,29,b1=11, b2=22; cout b1,b2 = “ b1,b2 = “ c1,c2 = “ c1,c2 = “c1“ “c2“nn“;,30,int d1=55, d2=66; cout d1,d2 = “ d1,d2 = “d1“ “d2“nn“; void swap1(int* p1, int* p2) /交换指针所指变量的值 int temp; temp = *p1; *p1 = *p2; *p2 = temp; ,31,void swa

14、p12(int* p1, int* p2) /交换二形参指针“局部空间”中的值 int* temp; temp = p1; p1 = p2; p2 = temp; void swap2(int ,32,void swap3 (int x, int y) /交换赋值参数“局部空间”中的值 int temp; temp = x; x = y; y = temp; ,33,程序执行后的显示结果如下: befor swap1 = b1,b2 = 11 22 after swap1 = b1,b2 = 22 11 befor swap12 = b1,b2 = 11 22 after swap12 = b

15、1,b2 = 11 22 befor swap2 = c1,c2 = 33 44 after swap2 = c1,c2 = 44 33 befor swap3 = d1,d2 = 55 66 after swap3 = d1,d2 = 55 66,34,6.5 指针与内存动态分配 - 参看书p148的6.3节,通过使用new与delete单目运算符来实现动态变量的分配与撤消。 1) new 使用格式: new /动态变量 new ( ) new /动态数组 功能: 生成一个(或一批)所给类型的无名动态变量,返回所生成变量的一个指针值(首地址)。,35,例: int *pi, *pj, a=10; char *pc; pi = new int; *pi = a*a; pc = new char(A); pj = new int10;,36,2) delete 使用格式: delete delete 功能: 释放通过new生成的动态变量(或动态数组),但指针变量仍存在。,37,例: int *pi, *pj; pi = new int; pj = new int10; . de

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

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

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