第六章指针和引用.ppt

上传人:本田雅阁 文档编号:2529384 上传时间:2019-04-05 格式:PPT 页数:48 大小:939.51KB
返回 下载 相关 举报
第六章指针和引用.ppt_第1页
第1页 / 共48页
第六章指针和引用.ppt_第2页
第2页 / 共48页
第六章指针和引用.ppt_第3页
第3页 / 共48页
亲,该文档总共48页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《第六章指针和引用.ppt》由会员分享,可在线阅读,更多相关《第六章指针和引用.ppt(48页珍藏版)》请在三一文库上搜索。

1、第六章 指针和引用,3,教学目标,(1) 了解指针类型及引用类型的概念及二者的关系与区别; (2) 了解指针与引用变量的使用与操作方法; (3) 了解用指针访问变量、数组、字符串的方法。,4,基本内容,6.1 指针 6.2 指针与数组 6.3 引用,5,6.1 指针,6.1.1 地址 6.1.2 指针的定义 6.1.3 指针的初始化 6.1.4 指针的使用 6.1.5 函数的传址调用方式,6,6.1.1 地址,计算机的内存储器就象一个一维数组,每个数组元素就是一个存储单元。 地址是存放信息数据的内存单元的编号。 程序中定义的任何变量、数组或函数等,在编译时都会在内存中分配一个确定的地址单元。,

2、7,如何表示地址?,凡是存放在内存中的程序和数据都有一个地址,可以用它们占用的那片存储单元中的第一个存储单元的地址表示。 C+规定: 变量的地址: 可以用取地址运算符& 来获取 数组的地址: 可以用数组名表示 函数的地址: 可以用函数名表示,8,例6-1:取地址运算符&和指针运算符*,#include using namespace std; int main() int x = 100; cout “变量的值是:“ x endl; cout “变量的所在的地址是:“ ,9,6.1.2 指针的定义,数据类型 *指针变量名; 例:int * ptr; float *array; char *s1

3、,*s2; 说明: 数据类型是指针所指向变量的类型; *是一个说明符,它不是指针变量名的一部分,而是表示这里说明的是一个指针; 指针变量名是指针变量的名字,10,6.1.3 指针的初始化,指针在定义后必须初始化才能使用;否则,结果不确定。 指针初始化的一般格式: 数据类型 *指针变量名 初始地址值; 或 数据类型 *指针变量名; 指针变量名 = 数据对象地址; 其中数据对象地址可以是变量、数组、函数、结构等的地址。如: int x=7; int *ptr= /初始化为空指针,11,6.1.4 指针的使用,/ 例6-2:通过指针访问变量 #include using namespace std;

4、 int main() int x = 7; int *ptr; ptr = ,12,6.1.5 函数的传址调用方式,实参与形参有3种结合方式: 值调用、传址调用和引用调用 传址调用赋予了函数操作“异地”数据的权利,对函数的独立性有一定影响 传址调用可实现多值传递 使用传址调用方式时,被调用函数的形参是指针,与之对应的实参要用地址值。,13,例6-3 交换两个变量的值,算 法: 交换两个变量x和y的值一定要用到第三个变量t作周转: t = x; x = y; y = t;,14,交换两个变量的值(修改前的程序),void swap(int x,int y) int tmp; tmp = x;

5、x = y; y = tmp; int main() int x = 2, y = 3; cout“x=“x“,y=“yendl; swap(x, y); cout“After exchange x ,15,交换两个变量的值(修改后),#include using namespace std; void swap (int *xp, int *yp) int tmp; tmp = *xp; *xp = *yp; *yp = tmp; int main() int a = 2, b = 3; cout “Before exchange:a= “ a “,b= “ b endl; swap(a,

6、b); swap(*a, *b); swap( ,运行结果: Before exchange:a=1,b=2 After exchange:a=2,b=1,16,6.2 指针与数组,6.2.1 指针与一维数组 6.2.2 指针与字符串,17,6.2.1 指针与一维数组,计算机中处理数组时,实际上是将ai转换成 *(a+下标表达式值)的形式。即 ai *(a+i) 因为数组名可以表示该数组的首地址,所以: ai *(a+i) *(ptr+i) 其中,ptr是指向a的指针。 由此可见,用指针处理数组及元素是最快捷的方式,18,例6-4 用多种方法输出数组元素,#include using name

7、space std; int main() int a=1, 2, 3, 4, 5; / int *ptr; / ptr = a; for(int i=0; i5; i+) coutai“t“; /一般方法:使用数组名和下标 / cout*(a+i)“t“; /使用数组名和指针运算 /* cout*ptr“t“; /使用指针变量的方法 ptr+; */ coutendl; return 0; ,19,直接和间接使用变量,20,6.2.2 指针与字符串,指针-字符数组(字符串) 例题分析 设 char *string; char string14; string=string1; 有 strin

8、g10 = = *string string11 = = *(string+1),21,例6-5:计算字符串长度,#include using namespace std; int mystrlen(char *string) char *ptr=string; while(*ptr!= 0) ptr +; / 指针后移,直到指向字符串结束标志 return ptr-string; int main() char str = “How long am I?“; coutstr“ 的长度是“mystrlen(str)endl; return 0; ,22,6.3 引用,6.3.1引用的概念 6.

9、3.2 函数的引用调用方式,23,6.3.1引用的概念,引用是一种特殊类型的变量,可以被认为是另一个变量的别名。 引用运算符“,24,* 和 &,注意: * 和,/说明符:声明ptr是一个int型指针 /指针运算符:取指针ptr所指向地址内存储的数值 /说明符:声明一个int型的引用ref /地址运算符:取变量x的地址,25,6.3.2 函数的引用调用方式,实参与形参有3种结合方式: 值调用、传址调用和引用调用 在形参名前加上引用说明符“&”即将其声明为引用,实参则直接采用一般的变量名。 在函数调用时,形参就成了实参的别名,对引用的操作就等同于直接对主调函数中原变量的操作。,26,#inclu

10、de using namespace std; void swap (int ,交换两个整形变量的值(引用调用),运行结果: Before exchange:a=1,b=2 After exchange:a=2,b=1,27,扩展阅读,6.4 动态存储分配 6.5 自定义数据类型 6.5.1 结构体类型 6.5.2 枚举类型,28,6.4 动态存储分配,运算符new用来申请所需的内存 指针 = new 数据类型(初值); 运算符delete用于释放先前申请到的存储块 delete 指针; 例: int *p = new int (5); delete p; 为数组申请动态内存: 指针 = ne

11、w 数据类型数组元素个数; 释放数组占用的动态内存空间: delete 指针; 例: int *p = new int size; delete p;,29,例 6-8:用动态数组来求斐波那挈数列的前n项,#include using namespace std; int main() int n; coutn; int *p =new intn+1; p0=0; p1=1; coutp0tp1t; for(int i=2; i=n; i+) pi=pi-2+pi-1; coutpit; delete p; /释放数组空间 return 0; ,30,6.5 自定义数据类型,6.5.1 结构体

12、类型 6.5.2 枚举类型,31,构造类型数据 各元素是属于同一个类型的数组。 不同类型的数据组合成一个有机的整体,以便于引用。这些组合在一个整体中的数据是互相联系的。 例如,学生信息:学号、姓名、性别、各科成绩,地址等这些项都与某一学生相联系。如下图所示: 可以看到性别(sex)、年龄(age)、成绩(score)、地址(addr)都属于学号为20090531和名为“LeiFen”的学生。 如果将num、name、sex、age、score、addr分别定义为互相独立的简单变量,难以反映它们之间的内在联系。,6.5.1 结构体类型,32,结构体作为一种数据构造类型,在程序中使用时要经历定义声

13、明调用三个过程。 结构体的定义就是对结构体的结构进行描述 结构体是由不同的数据类型的数据组成的。组成结构体的每个数据称为该结构体的成员项,简称成员。,struct Student int id; / 学号 char name20; / 姓名 float score; / 成绩 ;,struct 结构体类型名 数据类型 成员变量1; 数据类型 成员变量2; 数据类型 成员变量n; ;,结构体类型的定义,33,(1)先定义结构体类型,再声明结构体变量。 例如, struct Date /定义日期类型 int da_year; int da_mon; int da_day; ; Date yeste

14、rday, today, tomorrow; /说明了3个日期类型的变量 (2)定义类型的同时声明变量。例如, struct Date int da_year; int da_mon; int da_day; yesterday, today, tomorrow; (3)直接定义结构体类型变量,不出现结构体类型名。,结构体变量的声明,34,结构体变量的使用,结构体类型变量的成员变量的引用方法为: 结构体类型变量名.成员变量名 通过指针访问结构体的成员要用箭头操作符- 结构体指针变量名-成员变量名 例: Student stu1, stu2, *ptr = ,35,结构体的初始化,可采用以下任意

15、一种方式: 先声明结构体变量,再赋初值 Student stu1; stu1.id = 20086035; strcpy(stu1.name, “Zhang3“); stu1.score = 96; 声明时赋值:在声明结构体变量的同时对其赋初值 Student stu2=20091001, “Li4“, 85.5; 注意:不能在定义结构体类型时给成员变量赋值,/ 例 6-9:学生信息-结构体 #include #include using namespace std; struct Student int id; / 学号 char name20; / 姓名 float score; / 成绩

16、 ; int main() Student stu1, stu2=20091001, “Li4“, 85.5; stu1.id=20086035; strcpy(stu1.name, “Zhang3“); stu1.score=96; cout“第1个学生信息:“stu1.id“t“stu1.name“t“stu1.scoreendl; cout“第2个学生信息:“stu2.id“t“stu2.name“t“stu2.scoreendl; stu2=stu1; cout“复制后第2个学生信息变为:“endl; cout“第2个学生信息:“stu2.id“t“stu2.name“t“stu2.s

17、coreendl; return 0; ,37,如果某个数据项只可能取少数几种可能的值,则可将该数据项定义为枚举类型数据。格式如下: enum 枚举类型名 枚举符号表 ; 例: enum SexType male, female ; enum Weekday Sun, Mon, Tue, Wed, Thu, Fri, Sat ; enum Game win, lose, tie ;,6.5.2 枚举类型,38,枚举变量的声明和使用,语法形式如下: 枚举类型名 枚举变量名; 例如: Weekday today; today = Wed; 每个枚举元素实际上是一个以其所在位置顺序为值的常量(0,

18、1, 2, ),其取值为某一个整数值,所以枚举类型无法直接输出。要想获得变量的符号值,须采用间接方法。,/ 例6-10:枚举类型的用法 enum SexType male, female ; struct Student int id; / 学号 char name20; / 姓名 SexType sex; / 性别 float score; / 成绩 ; int main() Student stu1=20086035, “Zhang3“, male, 96; cout“学生信息:“stu1.id“t“stu1.name“t“stu1.score“t“stu1.sexendl; cout“学

19、生信息:“stu1.id“t“stu1.name“t“stu1.score“t“; switch(stu1.sex) case male: cout“男“endl; break; case female: cout“女“endl; break; default: break; return 0; ,运行结果: 学生信息:20086035 Zhang3 96 0 学生信息:20086035 Zhang3 96 男,40,上机指导,6.6 注释号在调试中的作用 6.7 条件编译,41,应用举例,例6-12 使用指针编写一个对整型数组进行排序的函数,排序方法使用冒泡排序法。 算法讨论: 冒泡排序法是

20、将相邻的元素进行比较,如果不符合所要求的顺序,则交换这两个元素,对整个数列中所有的元素都进行这种比较,直到所有的元素都排好序为止。,/ 例6-12:冒泡排序程序 #include using namespace std; void bubbleup(int *ptr, int count) for(int i=0; ii; j=j-1) if(*(ptr+j-1)*(ptr+j) int tmp = *(ptr+j-1); *(ptr+j-1) = *(ptr+j); *(ptr+j) = tmp; int main() int list = 53, 7, 12, 61, 90, 70, 87

21、; int i; cout “排序前:“ ; for(i=0; i7; i+) cout listi t; bubbleup(list, 7); cout endl“排序后:“ ; for(i=0; i7; i+) cout listi t; coutendl; return 0; ,43,应用举例,例6-13 用指针编写一个程序,要求不仅能够统计一个字符串中字符的个数,还能分别指出其中大、小写字母、数字以及其他字符的个数。 分析: 通过定义一个指向字符数组的指针,对字符串中每一个字符都按照ASCII码表中的编码进行判断,确定其所属的类别并进行计数,直到整个字符串结束为止。,#include

22、using namespace std; int main() char str=“Current:Clear, Wind: E at 6 km/h, Humidity: 30%“; char *ptr=str; / 使指针ptr指向字符数组str int total, capital, small, numeral, others; / 定义各种计数器变量 total=capital=small=numeral=others=0; / 初始化所有计数器变量 while(*ptr!=0) / 如果*ptr=0则表示字符串结束 total+; / 总字符数 if(*ptr=A ,45,void

23、mystrcpy(char *destin, char *source) while(*source!=0) / 若*source=0则表示原字符串结束 *destin = *source; / 复制字符 source +; / source移向原字符串中的下一个字符 destin +; / destin移向新字符数组的下一位置 *destin = 0; / 在新字符串尾部添写一个结束符0 ,例6-14 字符串复制,46,应用举例,例6-15 编写一个函数,用于去掉字符串前面的空格,并用主函数进行验证 。 分析: 令指针指向字符串首地址 逐个判断字符串前面的字符是否为空格。如是,则向后移动指针

24、继续判断,直到第一个非空格的字符出现 将从该指针开始的字符串复制回原字符串,#include #include using namespace std; char *myltrim(char * string) char *ptr=string; while(*ptr= ) ptr+; strcpy(string, ptr); return string; int main() char str = “ Who is Buddha?“; cout “截取前的原始字符串是: “ strendl; cout “截取空格后的字符串是: “ myltrim(str)endl; return 0; ,运行结果: 截取前的原始字符串是: Who is Buddha? 截取空格后的字符串是: Who is Buddha?,48,学好程序设计语言的唯一途径是 你的编程能力与你在计算机上投入的时间成,结 束 语,上机练习,正比,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1