“对于
int a =3;
int b =3;
编译器先处理int a = 3;首先它会在栈中创建一个变量为a的引用,然后查找有没有字面值为3的地址,没找到,就开辟一个存放3这个字面值的地址,然后将a指向3的地址。接着处理int b = 3;在创建完b的引用变量后,由于在栈中已经有3这个字面值,便将b直接指向3的地址。这样,就出现了a与b同时均指向3的情况。” 上面是我今天在网上看到一篇文章里的解释.有些疑问,如果照上面的说法,a,b变量都是存放3的地址,那是不是还要在栈中开辟一个内存空间来存放a变量?也就是说栈中的分配是这样的:
   栈:           
 |||||||3||||....
        |\
 |||||||a|b|||....
a,b都指向3.
3占32位空间,变量a,b占32位空间.是不是这样的???
望高手指点.

解决方案 »

  1.   

    你的想法是错误的,他们不会都引用3。
    int a;
    int b;
    都会开辟新的空间用于存放a和b
    int a=3;
    代表a分配空间,并且把3复制到a
    其实局部变量是在椎中分配的,每一个位置都是不同的
      

  2.   

    int也是引用吗,记得直接是值的
      

  3.   

    好像有哪里不对
    CPlusPlusFans
    我想问你一下,希望抽空解答
    声明了一个变量a后,就会在内存中开辟了一个空间给a.
    你说给a赋值后就会把值复制到了a这个空间中,照这样说a就代表着这个空间的代号,是这个意思吗!?
    如果不是,那a里面的值会变成什么?是a3吗?
    还是说用3来替换a?如果替换了那这个空间是否就属于3了,那就和a无关了吗?
    请指教哈! 
      

  4.   

    句柄应该是存在栈内存中的,基本数据类型也是存在栈内存中的
    a,b同时指向一块内存是对的
    只是如果修改其中一个并不会影响另一个,因为当给其中一个,例如b赋值的时候,会在栈内存中查找是否存在这个值,如果没有,则新开辟一块内存来保存这个新值,如果有,则将b指向这个地址。
    int a,int b都会开辟新的栈内存来存储
      

  5.   

    呵呵,其实说“分配”确实有些欠妥
    准确的应该说是预分配吧
    是这样的
    对于一个函数内部定义的局部变量,以及参数,是在椎中预留空间的void print (int a,int b)
    {
         int c;
    }在编译此函数时,椎的地址会加3*4=12,即给三个变量留上空间。当然,有可能不是一个整型4个字节
    a,b,c其本身意义是地址,但这些地址不是存在堆中或椎中的,而是在代码段里存的,
    用一种特殊的寻址方式,如相对SP寄存器寻址
    例如上面a的地址可能是0,b的地址可能是4,c的地址可能是8
    总的来说,定义即预分配空间,而且是在编译时确定的,符号代表地址,而地址存在代码中再来说说
    a=3;有两中可能,其一,3是立即数寻址,这样的话3是在代码段中,类似move [0],3,其中0是A的地址,硬编码在代码中
    基二,3可能在只读内存中,比如地址是3306,则mov ax,[3306],mov [0],ax再者,虽然a,b本身有地址的意义,但这个地址是不可引用的,我们通过代码永远得不出这个值,原因这个地址已经编码到代码中
    指针或引用是这样存储的,Object a;a本身也是一样,代表一个地址,这个地址也在代码段中,不可引用,但a的地址指向处,是在椎中,也是一个地址,指向一个对象不知我是否解释清楚了,开始用的“分配”确实不准确,请原谅
      

  6.   

    int类型不是引用型
      他存放的是值而不是地址
    int a =3;
    int b =3;
    是声明了两个int型的变量,a和b都是独立的..不会存在a去引用b的地址
      

  7.   

    被一个《java栈与堆》的帖子害的。
      

  8.   

    连我这个菜鸟都知道  它们只是基础数据int类型的,所以只在栈空间内分配内存。跟堆内存完全没关系。