设为首页 加入收藏

TOP

7.1 地址是什么
2013-10-07 01:12:36 来源: 作者: 【 】 浏览:73
Tags:7.1 地址 什么

第7章  指针

指针是一个内存单元的地址。该地址是另一个变量数据的存储位置。利用它可以直接处理内存地址,有效地表示各种复杂的数据结构,如链表、树等。指针的学习是C/C++(www.cppentry.com)中的难点,也是编写高效程序必需的重点。本章将向读者详细地讲解指针的奥秘,本章包括以下内容:

指针的概念;

指针的运算;

特殊指针;

指针的使用;

特殊指针;

指针的命名。

通过本章的学习,读者可以掌握C++(www.cppentry.com)开发中的难点--指针。只有充分掌握指针,才能成为一个好的C++(www.cppentry.com)程序员。

7.1  地址是什么

地址是内存单元的索引。内存以字节为单位进行划分,字节是数据存储的基本单位。每个存储单元都被分配了不同的编号,每个编号唯一对应一个存储单元。这个编号就是存储单元的地址,使用这些单元时只需按编号定位即可。如图7.1即为内存中的地址和存储单元的对应关系。

图7-1中,1001、1001、1002等即为内存的地址,每个地址对应一个存储单元,每个存储单元占一个字节。对存储单元的访问都通过这些地址来实现。数据存储到内存中时,按照数据类型要求的单元数,分配相应的连续单元。该连续单元的首地址,即第一个单元的地址就是该变量的存储地址。

【示例7-1】 定义3个变量,它们在内存中的实际存放如图7-2所示。

  1. int iVal=25185;  
  2. short sVal=97;  
  3. char cVal='b'
 
图7-1  地址和
存储单元关系图
 
图7-2  数据存储

分析:其中,iVal是整型数,占4个字节,故1000~1003这4个字节的内存单元配给了它。25185的二进制表示为01100010 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。

【责任编辑:云霞 TEL:(010)68476606】

回书目   上一节   下一节

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇7.3 指针的种类 下一篇7.6 指针的指针

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: