第6章指针和引用.ppt

上传人:s****8 文档编号:68704166 上传时间:2022-12-29 格式:PPT 页数:47 大小:257.50KB
返回 下载 相关 举报
第6章指针和引用.ppt_第1页
第1页 / 共47页
第6章指针和引用.ppt_第2页
第2页 / 共47页
点击查看更多>>
资源描述

《第6章指针和引用.ppt》由会员分享,可在线阅读,更多相关《第6章指针和引用.ppt(47页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、第六章第六章 指针和引用指针和引用1教学目标l(1)了解指针类型及引用类型的概念及二者的关系了解指针类型及引用类型的概念及二者的关系与区别与区别;l(2)了解指针与引用变量的使用与操作方法了解指针与引用变量的使用与操作方法;l(3)了解用指针访问变量、数组、字符串的方法了解用指针访问变量、数组、字符串的方法。2基本内容 l6.1 指针指针l6.2 指针与数组指针与数组l6.3 引用引用36.1 指针l6.1.1 地址地址l6.1.2 指针的定义指针的定义l6.1.3 指针的初始化指针的初始化l6.1.4 指针的使用指针的使用l6.1.5 函数的传址调用方式函数的传址调用方式46.1.1 地址计

2、算机的内存储器就象一个一维数组,每个计算机的内存储器就象一个一维数组,每个数组元素就是一个存储单元。数组元素就是一个存储单元。地址是存放信息数据的内存单元的编号。地址是存放信息数据的内存单元的编号。程序中定义的任何变量、数组或函数等,在程序中定义的任何变量、数组或函数等,在编译时都会在内存中分配一个确定的地址单编译时都会在内存中分配一个确定的地址单元。元。5如何表示地址?如何表示地址?凡是存放在内存中的程序和数据都有一个地址,凡是存放在内存中的程序和数据都有一个地址,可以用它们占用的那片存储单元中的第一个可以用它们占用的那片存储单元中的第一个存储单元的地址表示。存储单元的地址表示。C+规定:规

3、定:l变量的地址变量的地址:可以用取地址运算符可以用取地址运算符&来获取来获取l数组的地址数组的地址:可以用数组名表示可以用数组名表示l函数的地址函数的地址:可以用函数名表示可以用函数名表示6例6-1:取地址运算符&和指针运算符*#include using namespace std;int main()int x=100;cout 变量的值是:变量的值是:x endl;cout 变量的所在的地址是:变量的所在的地址是:&x endl;cout 该地址所存储的变量值为:该地址所存储的变量值为:*(&x)endl;return 0;76.1.2 6.1.2 指针的定义指针的定义 数据类型数据类

4、型 *指针变量名;指针变量名;例:例:int *ptr;float *array;char *s1,*s2;l说明:说明:l数据类型是指针所指向变量的类型;l*是一个说明符,它不是指针变量名的一部分,而是表示这里说明的是一个指针;l指针变量名是指针变量的名字86.1.36.1.3 指针的初始化指针的初始化l指针在定义后必须指针在定义后必须初始化初始化才能使用;否则,结果不确定。才能使用;否则,结果不确定。l指针初始化的一般格式:指针初始化的一般格式:数据类型数据类型 *指针变量名指针变量名 初始地址值;初始地址值;或或数据类型数据类型 *指针变量名;指针变量名;指针变量名指针变量名=数据对象地

5、址;数据对象地址;l其中数据对象地址可以是变量、数组、函数、结构等的其中数据对象地址可以是变量、数组、函数、结构等的地址。如:地址。如:int x=7;int*ptr=&x;/指向单个变量指向单个变量char*sp;sp=“string”;/指向字符串指向字符串int a5,*ap;ap=a;/指向数组指向数组int max(),(*fp)();fp=max;/指向函数指向函数l编程中常用的初始化方法:编程中常用的初始化方法:int*ptr=NULL;/初始化为空指针初始化为空指针96.1.4 6.1.4 指针的使用指针的使用/例例6-2:通过指针访问变量:通过指针访问变量#include u

6、sing namespace std;int main()int x=7;int *ptr;ptr=&x;coutx=xt&x=&xendl;cout*ptr=*ptrtptr=ptrendl;*ptr=9;coutx=xt&x=&xendl;cout*ptr=*ptrtptr=ptrendl;return 0;106.1.5 函数的传址调用方式函数的传址调用方式 l实参与形参有实参与形参有3种结合方式:种结合方式:l值调用、值调用、传址调用传址调用和引用调用和引用调用l传址调用赋予了函数操作传址调用赋予了函数操作“异地异地”数据的权利,数据的权利,对函数的独立性有一定影响对函数的独立性有一定

7、影响l传址调用可实现多值传递传址调用可实现多值传递l使用传址调用方式时,被调用函数的形参是指使用传址调用方式时,被调用函数的形参是指针,与之对应的实参要用地址值。针,与之对应的实参要用地址值。11例例6-3 交换两个变量的值交换两个变量的值l算算 法:法:l交换两个变量交换两个变量x和和y的值一定要用到第三个的值一定要用到第三个变量变量t作周转:作周转:t=x;x=y;y=t;12交换两个变量的值交换两个变量的值(修改前的程序修改前的程序)void swap(int x,int y)int tmp;tmp=x;x=y;y=tmp;int main()int x=2,y=3;cout“x=“x“

8、,y=“yendl;swap(x,y);coutAfter exchange x&y:”endl;cout“x=“x“,y=“yendl;return 0;13交换两个变量的值(修改后)交换两个变量的值(修改后)#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,b);swap(*a,*b);swap(&a,&b);cout After exchang

9、e:a=a ,b=b endl;return 0;运行结果:运行结果:Before exchange:a=1,b=2After exchange:a=2,b=1146.2 指针与数组l6.2.1 指针与一维数组指针与一维数组l6.2.2 指针与字符串指针与字符串156.2.1 指针与一维数组l计算机中处理数组时,实际上是将计算机中处理数组时,实际上是将ai转换成转换成*(a+下标表达式值)的形式。即下标表达式值)的形式。即 ai *ai *(a+ia+i)因为数组名可以表示该数组的首地址,所以:因为数组名可以表示该数组的首地址,所以:ai *ai *(a+ia+i)*(ptr+iptr+i)其

10、中,其中,ptr是指向是指向a的指针。的指针。l由此可见,用指针处理数组及元素是最快捷的方式由此可见,用指针处理数组及元素是最快捷的方式16例例6-4 用多种方法输出数组元素用多种方法输出数组元素#include using namespace std;int main()int a=1,2,3,4,5;/int*ptr;/ptr=a;for(int i=0;i5;i+)coutait;/一般方法:使用数组名和下标一般方法:使用数组名和下标/cout*(a+i)t;/使用数组名和指针运算使用数组名和指针运算/*cout*ptrt;/使用指针变量的方法使用指针变量的方法ptr+;*/couten

11、dl;return 0;17直接和间接使用变量186.2.2 指针与字符串l指针指针-字符数组字符数组(字符串字符串)l例题分析例题分析l设设char*string;char string14;string=string1;l有有string10=*stringstring11=*(string+1)19例例6-5:计算字符串长度:计算字符串长度#include using namespace std;int mystrlen(char*string)char*ptr=string;while(*ptr!=0)ptr+;/指针后移,直到指向字符串结束标志指针后移,直到指向字符串结束标志retu

12、rn ptr-string;int main()char str=How long am I?;coutstr 的长度是的长度是mystrlen(str)endl;return 0;206.3 引用l6.3.1引用的概念引用的概念l6.3.2 函数的引用调用方式函数的引用调用方式216.3.1引用的概念l引用是一种特殊类型的变量,可以被认为是另引用是一种特殊类型的变量,可以被认为是另一个变量的别名。一个变量的别名。l引用运算符引用运算符“&”用来说明一个引用。用来说明一个引用。数据类型数据类型&引用名引用名=已定义的变量名已定义的变量名l例:例:int a=10;int&i=a;i=i+100

13、;22*和和&l注意:注意:*和和&出现在声明语句和执行语句中出现在声明语句和执行语句中其含义不同。其含义不同。l例如例如:int*ptr;y=*ptr;int&ref;ptr=&x;*ptr=2;/说明符:声明说明符:声明ptr是一个是一个int型指针型指针/指针运算符:取指针指针运算符:取指针ptr所指向地址内存储的数值所指向地址内存储的数值/说明符:声明一个说明符:声明一个int型的引用型的引用ref/地址运算符:取变量地址运算符:取变量x的地址的地址236.3.2 函数的引用调用方式l实参与形参有实参与形参有3种结合方式:种结合方式:l值调用、传址调用和值调用、传址调用和引用调用引用调

14、用l在形参名前加上引用说明符在形参名前加上引用说明符“&”即将其声明为即将其声明为引用,实参则直接采用一般的变量名。引用,实参则直接采用一般的变量名。l在函数调用时,形参就成了实参的别名,对引在函数调用时,形参就成了实参的别名,对引用的操作就等同于直接对主调函数中原变量的用的操作就等同于直接对主调函数中原变量的操作。操作。24#include using namespace std;void swap(int&x,int&y)int tmp=x;x =y;y =tmp;int main()int a=1,b=2;cout Before exchange:a=a ,b=b endl;swap(a

15、,b);cout After exchange:a=a ,b=b endl;return 0;交换两个整形变量的值(引用调用)运行结果:运行结果:Before exchange:a=1,b=2After exchange:a=2,b=125扩展阅读l6.4 动态存储分配动态存储分配l6.5 自定义数据类型自定义数据类型l6.5.1 结构体类型l6.5.2 枚举类型266.4 动态存储分配l运算符运算符new用来申请所需的内存用来申请所需的内存指针指针=new 数据类型(初值)数据类型(初值);l运算符运算符delete用于释放先前申请到的存储块用于释放先前申请到的存储块delete 指针;指针

16、;l例:例:int*p=new int(5);delete p;l为数组申请动态内存:为数组申请动态内存:指针指针=new 数据类型数据类型数组元素个数数组元素个数;l释放数组占用的动态内存空间:释放数组占用的动态内存空间:delete 指针;指针;l例:例:int*p=new int size;delete p;27例 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+p

17、i-1;coutpi结结构体指构体指针变针变量名量名-成成员变员变量名量名 l例:例:Student stu1,stu2,*ptr=&stu2;stu1.id=20086035;ptr-id=20091001;33结构体的初始化l可采用以下任意一种方式:可采用以下任意一种方式:l先声明先声明结结构体构体变变量量,再赋初值,再赋初值Student stu1;stu1.id=20086035;strcpy(stu1.name,Zhang3);stu1.score=96;l声明时赋值声明时赋值:在声明:在声明结结构体构体变变量的同量的同时对时对其其赋赋初初值值Student stu2=2009100

18、1,Li4,85.5;l注意:不能在定注意:不能在定义结义结构体构体类类型型时给时给成成员变员变量量赋值赋值34/例例 6-9:学生信息:学生信息-结构体结构体#include#include using namespace std;struct Studentint id;/学号学号char name20;/姓名姓名float score;/成绩成绩;int main()Student stu1,stu2=20091001,Li4,85.5;stu1.id=20086035;strcpy(stu1.name,Zhang3);stu1.score=96;cout第第1个学生信息:个学生信息:s

19、tu1.idtstu1.nametstu1.scoreendl;cout第第2个学生信息:个学生信息:stu2.idtstu2.nametstu2.scoreendl;stu2=stu1;cout复制后第复制后第2个学生信息变为:个学生信息变为:endl;cout第第2个学生信息:个学生信息:stu2.idtstu2.nametstu2.scoreendl;return 0;35l如果某个数据项只可能取少数几种可能的值,则如果某个数据项只可能取少数几种可能的值,则可将该数据项定义为枚举类型数据。格式如下:可将该数据项定义为枚举类型数据。格式如下:enum 枚举类型名枚举类型名 枚举符号表枚举符

20、号表;l例例:enum SexType male,female;enum Weekday Sun,Mon,Tue,Wed,Thu,Fri,Sat;enum Game win,lose,tie;6.5.2 枚举类型36枚举变量的声明和使用l语法形式如下:语法形式如下:枚举类型名枚举类型名 枚举变量名枚举变量名;l例如:例如:Weekday today;today=Wed;l每个枚举元素实际上是一个以其所在位置顺序每个枚举元素实际上是一个以其所在位置顺序为值的常量为值的常量(0,1,2,),其取值为某一个整数值,其取值为某一个整数值,所以枚举类型无法直接输出。要想获得变量的所以枚举类型无法直接输出

21、。要想获得变量的符号值,须采用间接方法。符号值,须采用间接方法。37/例例6-10:枚:枚举类举类型的用法型的用法enum SexType male,female;struct Studentint id;/学号学号char name20;/姓名姓名SexType sex;/性性别别float score;/成成绩绩;int main()Student stu1=20086035,Zhang3,male,96;cout学生信息:学生信息:stu1.idtstu1.nametstu1.scoretstu1.sexendl;cout学生信息:学生信息:stu1.idtstu1.nametstu1.

22、scoret;switch(stu1.sex)case male:cout男男endl;break;case female:cout女女endl;break;default:break;return 0;运行结果:运行结果:学生信息:学生信息:20086035 Zhang3 96 0学生信息:学生信息:20086035 Zhang3 96 男男38上机指导l6.6 注释号在调试中的作用注释号在调试中的作用l6.7 条件编译条件编译39应用举例l例例6-12 使用指针编写一个对整型数组使用指针编写一个对整型数组进行排序的函数,排序方法使用冒泡排进行排序的函数,排序方法使用冒泡排序法。序法。l算法

23、讨论:算法讨论:l冒泡排序法是将相邻的元素进行比较,冒泡排序法是将相邻的元素进行比较,如果不符合所要求的顺序,则交换这两如果不符合所要求的顺序,则交换这两个元素,对整个数列中所有的元素都进个元素,对整个数列中所有的元素都进行这种比较,直到所有的元素都排好序行这种比较,直到所有的元素都排好序为止为止。40/例例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

24、+j-1)=*(ptr+j);*(ptr+j)=tmp;int main()int list=53,7,12,61,90,70,87;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;41应用举例l例例6-13 用指针编写一个程序,要求不仅能够用指针编写一个程序,要求不仅能够统计一个字符串中字符的个数,还能分别指统计一个字符串中字符的个数,还能分别指出其中大、小写字母、数字以及其他字符的出其中

25、大、小写字母、数字以及其他字符的个数。个数。l分析:l通过定义一个指向字符数组的指针,对字符串中每一个通过定义一个指向字符数组的指针,对字符串中每一个字符都按照字符都按照ASCII码表中的编码进行判断,确定其所属码表中的编码进行判断,确定其所属的类别并进行计数,直到整个字符串结束为止。的类别并进行计数,直到整个字符串结束为止。42#include using namespace std;int main()char str=Current:Clear,Wind:E at 6 km/h,Humidity:30%;char*ptr=str;/使指针使指针ptr指向字符数组指向字符数组strint

26、total,capital,small,numeral,others;/定义各种计数器变量定义各种计数器变量total=capital=small=numeral=others=0;/初始化所有计数器变量初始化所有计数器变量while(*ptr!=0)/如果如果*ptr=0则表示字符串结束则表示字符串结束total+;/总字符数总字符数if(*ptr=A&*ptr=a&*ptr=0&*ptr=9)numeral+;/数字计数加数字计数加1else others+;/其他字符计数加其他字符计数加1ptr+;/下一个字符下一个字符cout字符串:字符串:strendl;cout包含大写字母个数:包

27、含大写字母个数:capitalendl;cout包含小写字母个数:包含小写字母个数:smallendl;cout包含数字字符个数:包含数字字符个数:numeralendl;cout包含其它字符个数:包含其它字符个数:othersendl;cout总共含有的字符数:总共含有的字符数:totalendl;return 0;43void mystrcpy(char*destin,char*source)while(*source!=0)/若若*source=0则表示原字符串结束则表示原字符串结束*destin=*source;/复制字符复制字符source+;/source移向原字符串中的下一个字符

28、移向原字符串中的下一个字符destin+;/destin移向新字符数组的下一位置移向新字符数组的下一位置*destin=0;/在新字符串尾部添写一个结束符在新字符串尾部添写一个结束符0例例6-14 字符串复制字符串复制44应用举例l例例6-15 编写编写一个函数,用于去掉字符串前面一个函数,用于去掉字符串前面的空格,并用主函数进行验证的空格,并用主函数进行验证。l分析:l令指针指向字符串首地址令指针指向字符串首地址l逐个判断字符串前面的字符是否为空格。如是,逐个判断字符串前面的字符是否为空格。如是,则向后移动指针继续判断,直到第一个非空格则向后移动指针继续判断,直到第一个非空格的字符出现的字符

29、出现l将从该指针开始的字符串复制回原字符串将从该指针开始的字符串复制回原字符串45#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?46学好程序设计语言的唯一途径是学好程序设计语言的唯一途径是 你的编程能力与你在计算机上投入的时间成你的编程能力与你在计算机上投入的时间成 结结 束束 语语47

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

当前位置:首页 > 生活休闲 > 生活常识

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com