由x=y;引发的思考_第1页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、由x=y;引发的思考容易而言,浮现在赋值符 = 右边的就是右值,浮现在赋值符 = 左边的就是左值。 左值:在这个上下文环境中,编译器认为x 的含义是x 所代表的地址。这个地址惟独编译器知道,在编译的时候确定,编译器在一个特定的区域保存这个地址,我们彻低不必考虑这个地址保存在哪里。 右值:在这个上下文环境中,编译器认为y 的含义是y 所代表的地址里面的内容。这个内容是什么,惟独到运行时才知道。 那你毕竟知道x,y代表什么了吗? 这就要说到变量的含义,变量是对于编译阶段的特有属性,下面来认真分析一下变量。 变量:用来标识(entify)一块内存区域,这块区域的值普通是可以更改的,这就是它 变 的由

2、来,但是我们可以通过用法如const等一些修饰符号来限定这一内存区域的操作特性(characteristic),即变量的操作特性。用const修饰的使变量不能更改的就和常量一样的变量叫做常变量。 变量名:是一个标识符(identifier),用来指代一块内存区域,即变量,用法变量使我们操作内存以区域(area),以块(block)为单位,提高了便利性。 你的机器代码中,是不会浮现变量名的;变量名是给我们程序员操作内存来用法的。 想想在汇编年月,没有变量名,我们操作内存,都是用地址来挺直操作的,还要控制区域大小;固然汇编语言已经有了容易的变量。 对于编译器,它会搜集我们的变量名,比如我们定义了一

3、个全局的int a;那么编译器都为我们做了什么呢? 它会为程序预留4个字节的空间(假设在32位平台),并把我们的变量名 a 保存进符号表,并用这个符号表的索引对应实际的空间。 假如下面浮现b = a;那么它就会按照符号表找到变量的真正的物理位置,取得它的值,赋给b。 这是写编译器需要做的,我们需要建立符号表。 但是实际在汇编层次上,操作的都是地址而已,不存在任何名称了。 除了变量名不是内存地址,其他名都是地址。对么? 所谓的其他名无非是函数名、标识符常量名、指针名、数组名、结构名、类名等等。 比如指针名、数组名、函数名就是地址,它们分离表示指针所指向元素的地址、数组的首地址和函数的入口地址。

4、变量名虽然不挺直表示地址,但可用取地址符号 来获得它所代表的变量的存放地址。由于在定义变量的同时会分配给它相应的空间。 但类和结构惟独事例化时才为它分配空间,从而不能用取地址符号 来获得类名或结构名的地址。 变量名是用来标识某个内存块的 地址就是地址啦,如是变量名的话,用取地址运算符 就可以得到它标识的内存块的地址, 而指针变量呢,它本身也是一个变量名,只不过它标识的那块内存存放的是一个地址值 变量是地址的别号.就像刚生的小孩,你只知道他在地球上的某个位置,而不能叫出他名字,给你取个名 定义int a;时,编译器分配4个字节内存,并命名该4个字节的空间名字为a(即变量名),当用到变量名a时,就

5、是在用法那4个字节的内存空间. 5是一个常数,在程序编译时存放在代码的常量区存放着它的值(就是5),当执行a=5时,程序将5这个常量拷贝到a所在的4个字节空间中,就完成了赋值操作. a是我们对那个整形变量的4个字节取的名字,是我们人为给的,事实上计算机并不存储a这个名字,只是我们编程时给那4个字节内存取个名字好用.事实上程序在编译时,全部的a都转换为了那个地址空间了.编译成机器代码后,没有a这个说法了.a这个名字只存在于我们编写的代码中.5不是被随机分配的,而总是位于程序的数据段中,可能在不同的机器上在数据段中的位置可能不全都,它的地址其实不能以我们常用到的内存地址来理解,由于牵扯到一个叫计算

6、机寻址方式的问题,所以写无数都说明不清晰,你自己找本汇编语言的书来学一下吧. c语言中变量只是标识对应存储单元内的存储内容。与地址的对应关系int a=3;a- a 一一对应啊,变量名只是一个便于记忆识别的名称,编译器会将他编译成相应的内存地址的. 变量都要占领一定的内存。通过定义该变量的指针, 类型* 指针名=你要指向的变量名那么该指针中存储的就是你的变量的内存地址。 你的变量名 这样就可以挺直猎取到你的变量地址或者定义引用 类型 引用名=变量名该引用可通过变量的地址来对变量举行修改 变量名是给编译器看的,编译器按照变量是局部还是全局分配内存地址或栈空间,所谓的变量名在内存中不存在,操作时转

7、换成地址数存放在寄存器中了。 编译器会将合法的变量名放到一个叫 符号表 的一个表中。每个符号对应一个地址。当你调用此变量时,就会按照此符号表找到对应的地址,然后举行操作。 还没有运行怎么会占用内存呢?!(这一点还要疑惑吗!?) 所谓在编译期间分配空间指的是静态分配空间(相对于用new动态申请空间),如全局变量或静态变量(包括一些复杂类型的常量),它们所需要的空间大小可以明确计算出来,并且不会再转变,因此它们可以挺直存放在可执行文件的特定的节里(而且包含初始化的值),程序运行时也是挺直将这个节加载到特定的段中,不必在程序运行期间用额外的代码来产生这些变量。 其实在运行期间再看 变量 这个概念就不

8、再具备编译期间那么多的属性了(诸如名称,类型,作用域,生存期等等),对应的只是一块内存(惟独首址和大小),所以在运行期间动态申请的空间,是需要额外的代码维护,以确保不同变量不会混用内存。比如写new表示有一块内存已经被占用了,其它变量就不能再用它了; 写delete表示这块内存自由了,可以被其它变量用法了。(通常我们都是通过变量来用法内存的,就编码而言变量是给内存块起了个名字,用以区别彼此) 内存申请和释放时机很重要,过早会走失数据,过迟会耗费内存。特定状况下编译器可以帮我们完成这项复杂的工作(增强额外的代码维护内存空间,实现申请和释放)。从这个意义上讲,局部自动变量也是由编译器负责分配空间的。进一步讲,内存管理用到了我们经常挂在嘴边的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论