- 1、本文档共60页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C程序设计指针和引用
C++程序设计
第8章 指针和引用
在程序运行时变量和函数都存放在内存中,通过变量名来访问数据、通过函数名来调用函数都是直接访问方式。还有另一种间接访问方式就是用指针。指针的本质是内存地址。指针往往用于说明函数的形参,使实参能通过指针传递,以提高函数调用的效率。利用指针能动态地使用内存,以提高内存使用效率。指针也能用来表示数据关联,以构成复杂的数据结构。指针是C程序中最常见的类型。引用是C++扩展的新概念,主要用于函数形参和返回类型。本章将详细介绍指针和引用的概念及应用。
8.1 指针及指针变量
指针(pointer)的本质是内存地址。指针变量就是专门存储地址的一种变量。通过指针变量所存储的地址来访问数据是一种间接寻址方式。由于处理器的机器语言能支持间接寻址,所以使用指针可以达到较高的计算性能。
8.1.1 地址的概念
C++编译器对不同对象或变量按其数据类型分配合适大小的存储空间。例如为char或bool型变量分配1个字节(bytes)的存储空间,short分配2字节,int和float分配4个字节,为double型变量分配8个字节的存储空间。当程序执行时,代码和变量都加载到内存中。计算机内存被分成若干个存储单元,存储单元以字节为单位。每个存储单元都有一个固定的编号,这个编号就是内存地址。尽管一个变量可能占用多个字节空间,但都通过第一个字节的地址来访问。存放某个变量的第一个字节的地址就是该数据的首地址。
指针即内存单元的地址,而数据是内存单元中的内容(或值)。
假设在程序中说明了1个int型的变量a,其值为68。系统为变量a分配4字节的存储空间,设首地址为0X0065FDF4。通过地址0X0065FDF4就能找到变量a在内存中的存储单元,从而对变量a进行访问。0X0065FDF4就是变量a的指针。知道一个变量的地址和变量的类型就能对变量进行访问,就如同知道房间号就能找到房间,从而找到房间里的主人。
指针是一种特殊的数据类型。所有类型的变量,无论是基本类型、用户定义类型、还是这些类型的数组,在一次运行时都有确定的地址,因此它们都有指针。对于32位计算机,地址长度就是32位,因此一个指针需要4个字节,与整型int、浮点型float具有相同大小的长度。一个指针不仅有值,而且还要确定其类型,表示它能指向什么类型的数据,决定了通过它要取用多少字节作为该变量的值。
同一个变量在不同机器上执行或在不同时刻执行,其地址都不一样。这是因为在加载一个程序时,系统根据当前可用内存来确定使用哪一块内存。在编程中一个具体的地址值没有多大意义,不应该直接用一个地址常量来为一个指针赋值,这是因为在运行时你不知道这个地址中当前存放的是什么。如果你通过这个地址读取它的内容,将得到不可预知的结果。如果你改变了它的内容,就会导致不可预知的后果,甚至导致严重错误而退出。所以对指针的操作应小心谨慎。
怎样能知道一个变量在运行时刻的内存地址?把取地址运算符放在变量前面就得到它的首地址。例如b是一个变量,那么b就表示它的地址。下面例子能看到一组局部变量的首地址。
例8-1 显示一组局部变量的首地址。
#includeiostream.h
void main(){
bool b = true;
char c = c;
short s = 3;
int i = 4;
float f = 1.0f;
double d = 1.0;
coutb=bendl;
coutc=hex(int)cendl;
couts=sendl;
couti=iendl;
coutf=fendl;
coutd=dendl;
}
执行程序,输出如下:
b=0x0012FF7C
c=12ff78
s=0x0012FF74
i=0x0012FF70
f=0x0012FF6C
d=0x0012FF64
注意在不同机器上或不同时刻运行,显示的地址都不一样。但我们能看到局部变量在内存中的一些排列规律。如图8.1所示。
首先,这6个变量的地址是按递减次序排列,这是因为局部变量都存储在堆栈中,堆栈是先入后出的。先入栈的数据存放在较大地址位置,后入栈的数据存放在较小地址位置。如果这些变量改为全局变量,它们的排列次序就会颠倒过来。
其次,尽管变量s只占2字节,变量c只占1字节,但却分别占用4字节空间。这是因为按字对齐(32位数据)能提高CPU访问内存的效率,而且一次压栈和出栈操作也是以32位数据为单位,代价是浪费一些内存。如果这些变量改为全局变量,它们将按实际大小存储。
如果一个指针变量存放的是某个对象或值的地址,就说这个指针变量指向该对象或值。在C++程序设计中,指针变量只有确定了指向才有意义。
8.1.2 指针变量
指针变量就是专门存放地址的一种特殊变量。指针变量中存放的是地址值。一
您可能关注的文档
- +VisualBasic程序设计春期末复习资料.doc
- +供应链管理春期末复习资料.doc
- (高等数学)导数与微分.doc
- (高考备战冲刺指导)概念方法题型易误点及应试技巧总结函数.doc
- ,听力中常考的大场景词归纳.doc
- (江苏卷)已知双曲线中心在原点且个焦点为F(.doc
- +随机变量及其分布习题解答.doc
- )中考数学数据的集中与离散.doc
- ,,,月线性代数(经管类).doc
- ,建造师工程经济.doc
- 北师大版小学数学三年级上册《寄书》教学设计.docx
- 统编版(部编版)语文二年级上册《雪孩子》教学设计.docx
- 统编版(部编版)语文二年级上册《八角楼上》教学设计.docx
- 北师大版小学数学三年级上册《长方形周长》教学设计.docx
- 北师大版小学数学三年级上册《丰收了》教学设计.docx
- 统编版(部编版)语文二年级上册《夜宿山寺》教学设计.docx
- 统编版(部编版)语文二年级上册《风娃娃》教学设计.docx
- 统编版(部编版)语文二年级上册《朱德的扁担》教学设计.docx
- 统编版(部编版)语文二年级上册《难忘的泼水节》教学设计.docx
- 统编版(部编版)语文二年级上册《纸船和风筝》教学设计.docx
文档评论(0)