- 1、本文档共77页,可阅读全部内容。
- 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之指针
第7章 指 针
指针是一个内存单元的地址。该地址是另一个变量数据的存储位置。利用它可以直接处理内存地址,有效地表示各种复杂的数据结构。学习本章,读者可以掌握C++开发中的难点——指针。只有充分掌握指针,才能成为一个好的C++程序员。
7.1 我就是地址
地址是内存单元的索引。内存以字节为单位进行划分,字节是数据存储的基本单位。每个存储单元都被分配了不同的编号,每个编号唯一对应一个存储单元。这个编号就是存储单元的地址,使用这些单元时只需按编号定位即可。如图7.1即为内存中的地址和存储单元的对应关系。
图7-1中,1001、1001、1002等即为内存的地址,每个地址对应一个存储单元,每个存储单元占一个字节。对存储单元的访问都通过这些地址来实现。数据存储到内存中时,按照数据类型要求的单元数,分配相应的连续单元。该连续单元的首地址,即第一个单元的地址就是该变量的存储地址。
图7-1 地址和存储单元关系图
【示例7-1】
定义3个变量,它们在内存中的实际存放如图7-2所示。
int iVal=25185;
short sVal=97;
char cVal=b;
图7-2 数据存储
分析:其中,iVal是整型数,占4个字节,故1000~1003这4个字节的内存单元配给了它。25185的二进制表示011000012,按低字节优先,存到内存中时,即图7.1所示。sVal占两字节,被分配到1004开始的两个单元中。cVal占一个字节,分配到1006单元中。地址1000、1004和1006分别是这3个变量的首地址。
在定义这三个变量时,系统就在符号表中建立了“(变量名,首地址)”对。存取时,系统去符号表中查出变量对应的首地址,然后根据首地址去内存访问数据。最后从内存中取出数据类型要求的字节数,并根据高低字节优先顺序转换出最终结果。例如,取出sVal值的过程为:
(1)按变量名查找符号表,取出地址1004;
(2)定位到内存中地址为1004的单元处;
(3)取出short类型要求的连续2个单元的内容,此处为1004和1005两个单元的内容;
(4)最后,按照系统是高字节优先还是低字节优先转换出实际的数据。
通过上述4步就得到了变量sVal的值97。
实际上,地址本身并不是什么特殊的数据,而是一个无符号整型数,取值范围在当前系统的寻址范围内。32 位系统的寻址空间为232,共可以有232个地址。因此,保存一个地址就需要32位,即4个字节。
如果可以定义一个变量,该变量的内容是一个寻址空间范围内的无符号整型数。通过某种手段告诉系统这是某个内存块的首地址,那么就可以沿着该变量路由到一个内存块。这个无符号整型数就叫做指针,存放该无符号整型数的变量就叫做指针变量(常简称为指针),并且称该指针变量指向了该存储单元。如此,就可以通过指针来间接的访问一个内存单元。例如定义指针变量pChar,在图7.2内为它分配存储单元1007,1007内放变量cVal的地址1006。那么1006就是一个指针,变量pChar指向了内存单元1006,通过pChar就可以访问到cVal的值。
?说明:当一个长于一字节的数据保存到内存中时,有两种字节存储顺序。有体系结构设计者选择了逻辑顺序与物理顺序一致,即低字节优先。这叫little endian,如Intel x86系列。另一些设计者则选择了将字节的逻辑顺序与物理顺序相反,即高字节优先。这被称为big endian,如PowerPC。
7.2 指针的定义方式
在7.1节中讲到指针是一个32位的无符号整型数,指针变量是保存指针的变量。这一节就来看一下这个32位无符号整型数是如何被说明为指针的。
7.2.1 指针的定义
C++中没有属于指针的专用关键字,但却有自己特有的声明格式。其声明方法如下所示。
type * var;
其中,type是指针类型,表示指针指向的内存单元中存放的数据类型,该类型决定了指针操作时指向地址变化的规律,也决定了编译器将把所指向的内存块的内容按什么格式来处理。var是指针的变量名,*是指针的标识符。*可以靠近类型说明符,也可以靠近变量名,还可以处在两者中间,都表示var是一个type型指针。但如果有多个指针时,每一个指针前都必须带*号。如果不带*号,就表示是一个type型变量,而不是指针。因此为了清晰,常将*号靠近变量名。
【示例7-2】
演示6种指针的定义方式。
int * pInt; //整型指针
char * pChar; //字符指针
float * pFloat; //浮点型指针
void * pVoid; //无类型指针
short *pShort,myID //定义short型指针pShort,short型非指针变量myID
bool *
您可能关注的文档
- weekly-calendar-2016-portrait-days-vertically.doc
- Western Wedding Ceremony.pptx
- western week 10 Division 6 - Enlightenment.ppt
- What are the physical features of the Great Plains.doc
- When Silence Is Not Golden1.ppt
- William Wordsworth. TU.ppt
- williams albee.ppt
- WIRE_BOND_ASM.ppt
- WK 10 Instructions.ppt
- Word文档中的数字内容进行排序.ppt
文档评论(0)