- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
指针和数组
通过空间的标识符来处理该空间数据的方式称为直接引用。处理简单的数据时,直接引用的形式简单、容易实现,但用来处理大量数据却不简单。例如,存储1万个整数需要1万个名称,传递1万个数据需要1万次赋值,这都是既繁琐又低效的操作。而且1万个整数一般还会是一个序列,数据之间具有逻辑上的前后顺序,那么按逻辑上的顺序去处理这些数据就需要先按逻辑的顺序存储这些数据。既要表示数据,又要表示数据之间的关系,这是直接引用方式难以实现的。br 为了解决这个问题,我们参考机器语言中的要素——地址。机器指令由操作码和操作数组成,操作数一般是数据的地址。在机器语言程序中,地址是处理和数据之间的媒介。在机器语言程序设计中,一个重要的步骤是为数组安排空间,以确定它们的地址。空间相邻,地址就容易计算。按照这种逻辑可以得出一个很自然的设计方案:一组类型相同、逻辑上具有前后关系的数据存储在一组前后相邻的空间,这样可以通过一个数据的地址简单地计算出其余数据空间的地址,然后通过空间地址(而不是名称)去处理数据,我们称这种访问方式为间接引用。br 要实现这种设计,就需要把这组相邻的数据空间作为一个整体以及相应的地址都引入C语言类型。br br 1指针常量br br 1.1指针的类型br 变量的名称经过编译之后就在系统内部“消失”了,留下了地址和类型,地址是该变量空间的起始地址,类型是该变量的类型(见图1中的表)。类型将指示编译器怎样操作特定地址上的内存区域:该区域包含多少连续的字节,数据存储的格式,以及可以实施哪些基本操作,我们把这个类型称为地址的基类型。通过地址来操作数据空间的方式称为间接引用。以表1为例,地址0x12ff78的基类型为整型,通过该地址去间接引用时,系统将连续4个字节0x12ff78 ~0x12ff7b当作整型变量空间。地址0x12ff70的基类型是双浮点型,编译器将0x12ff70~0x12ff77的8个字节视为双浮点型空间。br 同样的地址,由于地址的基类型不同,编译器对该地址上的空间的解释也不同,或者说编译器将其看作不同类型的数据空间。例如,上面的地址0x12ff78,如果地址的基类型是单浮点型,那么间接引用的结果是,0x12ff78 ~0x12ff7b为单浮点型空间。br 为了实现我们的设计,需要首先把地址这个硬件操作机制中的数据引入C语言。而在C语言中,数据要有类型。类型是数据的“身份”,决定着数据存储空间的大小、存储格式和对数据可以实施的基本操作。从存储空间的大小和存储格式来说,地址相当于无符号整型数,即按无符号整型格式存储,而且在32位操作系统中需要占用4个字节。但是地址的操作与无符号整型数的不同,它与间接引用的数据有关,因此,为把地址这个数据引入C,需要为它定义新类型。新类型应该具有什么样的标识符?这就要分析地址的特点。地址关联着两个存储空间,以图1的地址0x12ff7c为例:一个是地址本身作为常量存储的空间;另一个是通过该地址间接引用的数据空间,即我们形象地用箭头指向的整型变量n的空间。根据这个处理特点,把地址本身的类型称为指针类型或指针型,指针指向的数据的类型称为指针的数据类型或指针型的基类型或指针的基类型。因此,指针是一个复合类型。br br 图1 变量与地址br br 当我们说一个指针是某种类型或某种类型的指针,指的是该指针的基类型,或该指针指向的数据的类型。例如一个指针是整型的,或一个整型指针,是指该指针的基类型是整型的,或指针指向的数据是整型的。br 指针是一个复合类型,因此它的标识符也是复合的,由表示指针类型的符号*和表示指针基类型的符号联合组成。例如,整型指针用int*表示,双浮点型指针用double*表示。*代表指针类型,int或double表示指针的基类型。例如图1的地址0x12ff78,地址的基类型为整型,被引入C语言之后,用字面值常量来表示便是(int*)0x12ff78,我们称之为指针型字面值常量或指针字面值常量。br 1.2指针的基本操作br 现在我们需要把地址的间接引用操作引入C语言作为指针型的基本操作:在指针前加间接引用运算符,也称解引用运算符*,所得表达式作为该指针指向的空间的标识符,这种由指针运算构成的数据空间表达式称为间接引用表达式或解引用表达式。图1的表代表了下面的等价式:br x=*(double*)0x12ff70br m=*(int*)0x12ff78br n=*(int*)0x12ff7cbr 我们可以做个实验来证实这个等价式。首先通过输出语句确定变量的地址:br printf(%x,%x,%x\n,n,m,x);//输出变量n、m和x的地址br 假设输出结果是12ff7c,12f
文档评论(0)