C++程序设计 大学基础教程第六章.ppt





《C++程序设计 大学基础教程第六章.ppt》由会员分享,可在线阅读,更多相关《C++程序设计 大学基础教程第六章.ppt(84页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 上课请保持安静!上课请保持安静!请关闭您的手机!请关闭您的手机!1C+大学基础教程大学基础教程第第6 6章章 指针和引用指针和引用北京科技大学北京科技大学信息基础科学系信息基础科学系2第六章第六章 指针和引用指针和引用指针指针(Pointer)Pointer)是是C+C+和和C C的一种数据类型,的一种数据类型,很多其他高级语言也有类似的数据类型;很多其他高级语言也有类似的数据类型;引用引用(Reference)Reference)则是则是C+C+所特有的一种数据类型所特有的一种数据类型本章将学习:本章将学习:n指针和引用的概念;指针和引用的概念;n指针和引用的使用;指针和引用的使用;n动态
2、内存的申请和删除。动态内存的申请和删除。3第六章第六章 指针和引用指针和引用6.1 6.1 指针的概念指针的概念 6.2 6.2 指针的运算指针的运算 6.3 6.3 指针和函数(指针和函数(6.3.26.3.2和和6.3.46.3.4不要求)不要求)6.4 6.4 指针和字符串指针和字符串 6.5 6.5 通过指针访问数组(通过指针访问数组(6.5.36.5.3和和6.5.46.5.4不要求)不要求)6.6 6.6 指针访问动态内存指针访问动态内存6.7 6.7 引用概念引用概念 4本章教学要求:掌握指针、指针变量、目标变量的基本概念;掌握指针、指针变量、目标变量的基本概念;掌握指针变量的声
3、明和初始化,指针的运算;掌握指针变量的声明和初始化,指针的运算;掌握指针作为函数的参数,指针和字符串的关掌握指针作为函数的参数,指针和字符串的关系,指针和数组的关系;系,指针和数组的关系;掌握掌握voidvoid指针的应用,并能通过使用指针作为指针的应用,并能通过使用指针作为函数的参数;函数的参数;使用指针访问字符串、一维数组和二维数组;使用指针访问字符串、一维数组和二维数组;使用指针访问动态内存;使用指针访问动态内存;掌握引用的声明和使用。掌握引用的声明和使用。5上节内容回顾内存空间的访问形式内存空间的访问形式n通过变量名直接访问通过变量名直接访问n通过地址间接访问通过地址间接访问指针、指针
4、变量、目标变量指针、指针变量、目标变量指针变量的声明和初始化指针变量的声明和初始化6关于内存地址关于内存地址内存空间的访问方式内存空间的访问方式n通过变量名直接访问通过变量名直接访问n通过地址间接访问通过地址间接访问取地址运算符:取地址运算符:&例:例:intint varvar;则则&varvar 表示变量表示变量varvar在内存中的起始地址在内存中的起始地址7声明声明例:例:int i;int*i_pointer=&i;指向整型变量的指针指向整型变量的指针概念概念指针:变量的地址指针:变量的地址 用于间接访问变量用于间接访问变量指针变量:指针变量:用于存放地址的变量用于存放地址的变量目标
5、变量:指针变量目标变量:指针变量 存放的地址对应的变量存放的地址对应的变量20003i_pointer*i_pointeri2000变量变量 i_pointer内存用户数据区内存用户数据区变量变量 i变量变量 j362000200020043010引用引用例例1:i=3;例例2:*i_pointer=3;8小结几个概念:指针,指针变量,目标变量几个概念:指针,指针变量,目标变量符号符号*:在定义中表示变量为指针变量在定义中表示变量为指针变量 int*i_pointer=&i;运算符:运算符:n&:取地址运算符取地址运算符n*:指向运算符指向运算符 *i_pointer=3;9l语法形式语法形式
6、 数据类型数据类型 *指针名初始地址;指针名初始地址;l 例:例:int a;int*pa=&a;l注意事项注意事项用变量地址作为初值时,该变量必须在指针初始化之前已用变量地址作为初值时,该变量必须在指针初始化之前已说明过,且变量类型应与指针类型一致。说明过,且变量类型应与指针类型一致。可以用一个已赋初值的指针去初始化另一可以用一个已赋初值的指针去初始化另一 个指针变量。个指针变量。l 例:例:char ch1=Y,ch2=A;char*pch1=&ch1,*pch2=&ch2;char*pch3=pch2;10#include void main()int a;int*pa=&a;a=10;
7、cout a:a endl;cout “*pa:*pa endl;cout “&a:&a endl;cout pa:pa endl;cout&pa:&pa endl;10a0012FF7Cpa0012FF780012FF7C内存用户数据区内存用户数据区11 6.2 6.2 指针的运算指针的运算126.2 指针的运算指针的运算 表表6.1 6.1 指针的运算指针的运算136.2.1 指针的赋值运算指针的赋值运算 指针变量名指针变量名=地址地址指针的赋值运算一定是地址的赋值。用来对指针变指针的赋值运算一定是地址的赋值。用来对指针变量赋值的可以是:量赋值的可以是:n同类型变量的地址;同类型变量的地址
8、;n同类型的已经初始化的指针变量;同类型的已经初始化的指针变量;n其他同类型的指针。其他同类型的指针。n此外,也可以用此外,也可以用0 0或者或者NULLNULL对指针变量赋值。使对指针变量赋值。使得变量包含的是得变量包含的是“空指针空指针”,即不指向任何的内,即不指向任何的内存物理地址。存物理地址。14指针的赋值运算指针的赋值运算“地址地址”中存放的数据类型与指针类型必须相符。中存放的数据类型与指针类型必须相符。必须注意:不同类型的指针是不可以互相赋值的。必须注意:不同类型的指针是不可以互相赋值的。在指针赋值时,不存在类型自动转换的机制。在指针赋值时,不存在类型自动转换的机制。向指针变量赋的
9、值必须是地址常量或变量,不能向指针变量赋的值必须是地址常量或变量,不能是普通整数。但可以赋值为整数是普通整数。但可以赋值为整数0 0,表示空指针。,表示空指针。15 例例6.1 6.1 观察以下指针赋值运算的结果。如果将注释去掉,结观察以下指针赋值运算的结果。如果将注释去掉,结果将如何?果将如何?#include using namespace std;void main()int va1=100,*pva1;float vf1=1.0,*pvf1,*pvf2;int*pva2=NULL;coutvalue of pva2 is pva2endl;pva1=&va1;pvf1=pvf2=&vf
10、1;coutpva1&va1endl;coutpvf1 pvf2endl;cout&pva1endl;cout&pvf1endl;cout&pvf2endl;/pvf1=pva1;pvf20012FF6Cpvf10012FF70va11000012FF7Cpva10012FF78vf11.00012FF740012FF7C内存用户数据区内存用户数据区0012FF740012FF740pva20012FF6816例例 指针的定义、赋值与使用指针的定义、赋值与使用#include#include.hvoid mainvoid main()intint*i_pointer;*i_pointer;/声
11、明声明intint型指针型指针i_pointeri_pointerintint i;i;/声明声明intint型数型数i ii_pointer=&i;i_pointer=&i;/取取i i的地址赋给的地址赋给i_pointeri_pointeri=10;i=10;/intint型数赋初值型数赋初值coutcoutOutput Output intint i=i i=iendlendl;/;/输出输出intint型数的值型数的值coutcoutOutput Output intint pointer i=*i_pointer pointer i=*i_pointerendlendl;/输出输出i
12、ntint型指针所指地址的内容型指针所指地址的内容 176.2.2 间接引用运算间接引用运算 间接引用运算符间接引用运算符“*”“*”是一种一元运算符,它是一种一元运算符,它和指针变量连用,对指针所指向的内存地址单和指针变量连用,对指针所指向的内存地址单元进行间接访问。使用的格式是:元进行间接访问。使用的格式是:*指针变量指针变量如果指针变量如果指针变量iptriptr指向整型变量指向整型变量vava,*iptriptr就就是变量是变量vava的内容的内容 18 例例6.2 6.2 对变量的直接访问和间接访问:写出以下对变量的直接访问和间接访问:写出以下程序运行结果。程序运行结果。#inclu
13、de#include using namespace std;using namespace std;void main()void main()char ch1=a,*char ch1=a,*chch;intint k1=100;k1=100;chch=&ch1;=&ch1;/指针指针chch指向变量指向变量ch1ch1 coutcout*chch=*=*chchendlendl;/间接访问间接访问 *chch=B;=B;coutcoutch1=ch1ch1=ch1endlendl;/直接访问直接访问 ch1=k1;ch1=k1;coutcout*chch=*=*chchendlendl;/
14、间接访问间接访问 运行结果运行结果:*ch=ach1=B*ch=d19 例例6.3 6.3 定义指向指针的指针变量。观察对这种指针变定义指向指针的指针变量。观察对这种指针变量间接访问的结果。量间接访问的结果。#include#include using namespace std;using namespace std;void main()void main()intint vava=100,*=100,*pvapva,*,*ppvappva;intint k1=100;k1=100;pvapva=&=&vava;coutcout*pvapva=*=*pvapvaendlendl;ppvap
15、pva=&=&pvapva;coutcout*ppvappva=*=*ppvappvaendlendl;coutcoutpvapva=pvapvaendlendl;运行结果运行结果:*pva=100*ppva=0 x0012FF7C pva=0 x0012FF7C va1000012FF7Cpva0012FF78ppva0012FF740012FF7C内存用户数据区内存用户数据区k10012FF701000012FF78206.2.2 间接引用运算间接引用运算216.2.3 指针的算术运算指针的算术运算 指针可以进行的算术运算只有加法和减法。指针可以进行的算术运算只有加法和减法。指针可以和一个
16、整数指针可以和一个整数n n做加法或者减法运算。做加法或者减法运算。指针指针p p和整数和整数n n相加相加(相相减减)的含义是指向当前的含义是指向当前指向位置指向位置p p的前方或后的前方或后方第方第n n个数据的地址。个数据的地址。22 例例6.4 6.4 通通过过指指针针的的间间接接访访问问,输输出出下下标标为为偶偶数数的的数组元素的值。数组元素的值。#include include using namespace std;using namespace std;void main()void main()intint k110=11,24,37,44,58,66,79,86,93,10
17、8,*k;k110=11,24,37,44,58,66,79,86,93,108,*k;k=&k10;k=&k10;for(for(intint i=0;i10;i=i+2)i=0;i10;i=i+2)coutcoutk1i=*(k+i);k1i=*(k+i);coutcoutendlendl;运行结果运行结果:K10=11 k12=37.数组第一个元素(下标为数组第一个元素(下标为0)的地址赋值给指针)的地址赋值给指针k 每次循环,指针加每次循环,指针加2 2236.2.3 指针的算术运算指针的算术运算指针和指针的直接加法是没有意义的,指针和指针的直接加法是没有意义的,也是不允许的。也是不允
18、许的。指针和指针的减法是可以进行的,其意指针和指针的减法是可以进行的,其意义是求出两个指针之间可以存放几个指义是求出两个指针之间可以存放几个指定类型的数据。定类型的数据。不允许用一个整数减一个指针。不允许用一个整数减一个指针。246.2.4指针的关系运算和逻辑运算指针的关系运算和逻辑运算 相同类型相同类型的指针可以进行各种关系运的指针可以进行各种关系运算。比较两个指针相等还是不相等。算。比较两个指针相等还是不相等。进行指针进行指针“大于大于”、“小于小于”的比较,的比较,只是要判定指针在内存中的相对位置。只是要判定指针在内存中的相对位置。256.2.4指针的关系运算和逻辑运算指针的关系运算和逻
19、辑运算指向不同数据类型的指针,指针和一般的整数指向不同数据类型的指针,指针和一般的整数比较是没有意义的,也是不允许的。比较是没有意义的,也是不允许的。惟一可以和指针比较的整数是惟一可以和指针比较的整数是0 0。通过指针和。通过指针和0 0的比较来判定指针本身是不是空指针。即指针的比较来判定指针本身是不是空指针。即指针可以和零之间进行等于或不等于的关系运算。可以和零之间进行等于或不等于的关系运算。例如:例如:p=0p=0或或p!=0p!=0指针可以进行指针可以进行“逻辑非逻辑非”运算运算266.2.5 void类型指针类型指针 voidvoid类型的指针就是类型的指针就是“无类型无类型”指针。声
20、明的指针。声明的方式如下:方式如下:void*void*;voidvoid类型的指针变量中存放的也是内存的地址,类型的指针变量中存放的也是内存的地址,但是不指定这个地址单元内的数据的类型。但是不指定这个地址单元内的数据的类型。27void类型指针的使用:任何其他类型的指针都可以赋值给任何其他类型的指针都可以赋值给voidvoid指针。指针。必须注意,这样赋值后的必须注意,这样赋值后的voidvoid指针的类型仍然指针的类型仍然是是voidvoid。voidvoid类型指针不可以直接赋值给任何其他类型类型指针不可以直接赋值给任何其他类型的指针。的指针。无论何时,无论何时,voidvoid指针都不
21、可以通过间接引用来指针都不可以通过间接引用来访问内存中的数据。访问内存中的数据。28void类型指针的使用:要通过要通过voidvoid类型指针访问内存的数据,必须进类型指针访问内存的数据,必须进行指针类型的强制转换,才可以通过指针间接行指针类型的强制转换,才可以通过指针间接引用访问内存数据。引用访问内存数据。voidvoid类型指针一般不会独立使用,而是作为指类型指针一般不会独立使用,而是作为指针类型转换的中介:针类型转换的中介:某种类型的指针某种类型的指针 void void指针,进行具体操作后指针,进行具体操作后强制转换强制转换29memcpy函数函数原型:函数原型:void*memcp
22、y(void*dest,const void*src,size_t count);30 例例6.5 6.5 使用使用memcpymemcpy通用复制函数复制数组。通用复制函数复制数组。#include include using namespace std;using namespace std;#include#include void main()void main()char char srcsrc10=012345678;10=012345678;char char destdest10;10;char*pc=(char*)char*pc=(char*)memcpymemcpy(des
23、tdest,srcsrc,10);,10);coutcout pc pc endlendl;intint s13=1,2,3;s13=1,2,3;intint d13;d13;intint*pi=(*pi=(intint*)*)memcpymemcpy(d1,s1,12);(d1,s1,12);coutcout*pi *(pi+1)*(pi+2)*pi *(pi+1)*(pi+2)endlendl;运行结果运行结果:0123456780123456781 2 3 复制字符数据,复制字符数据,1010个字节个字节复制整型数据,复制整型数据,1212个字节个字节316.2.5 void类型指针类型
24、指针 voidvoid类型指针还有一个具体的应用:显示字符类型指针还有一个具体的应用:显示字符指针的内容指针的内容。除了字符指针外,其他指针都可。除了字符指针外,其他指针都可以直接用以直接用coutcout语句来输出地址值。但是,用语句来输出地址值。但是,用coutcout输出字符指针时,则是输出它所指向的字输出字符指针时,则是输出它所指向的字符串。可以将字符指针强制转换为符串。可以将字符指针强制转换为voidvoid指针,指针,再用再用coutcout语句输出,就可以看到地址值。如:语句输出,就可以看到地址值。如:char*char*pchpch=Hello C+;=Hello C+;cou
25、tcoutpchpchendlendl;coutcout(void*)(void*)pchpchendlendl;int a3=1,2,3;cout a endl;cout *a endl;char c=“hello”;cout c endl;cout *c endl;cout c+1 endl;cout(void*)c endl;326.3 6.3 指针和函数指针和函数 336.3 指针和函数指针和函数在程序设计中,指针有很多应用。其中在程序设计中,指针有很多应用。其中之一就是用指针作为函数的参数,从而之一就是用指针作为函数的参数,从而形成了形成了C+C+函数调用中的另一种调用方式:函数调用
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+程序设计 大学基础教程第六章 C+ 程序设计 大学 基础教程 第六

限制150内