“对于
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位空间.是不是这样的???
望高手指点.
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位空间.是不是这样的???
望高手指点.
int a;
int b;
都会开辟新的空间用于存放a和b
int a=3;
代表a分配空间,并且把3复制到a
其实局部变量是在椎中分配的,每一个位置都是不同的
CPlusPlusFans
我想问你一下,希望抽空解答
声明了一个变量a后,就会在内存中开辟了一个空间给a.
你说给a赋值后就会把值复制到了a这个空间中,照这样说a就代表着这个空间的代号,是这个意思吗!?
如果不是,那a里面的值会变成什么?是a3吗?
还是说用3来替换a?如果替换了那这个空间是否就属于3了,那就和a无关了吗?
请指教哈!
a,b同时指向一块内存是对的
只是如果修改其中一个并不会影响另一个,因为当给其中一个,例如b赋值的时候,会在栈内存中查找是否存在这个值,如果没有,则新开辟一块内存来保存这个新值,如果有,则将b指向这个地址。
int a,int b都会开辟新的栈内存来存储
准确的应该说是预分配吧
是这样的
对于一个函数内部定义的局部变量,以及参数,是在椎中预留空间的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的地址指向处,是在椎中,也是一个地址,指向一个对象不知我是否解释清楚了,开始用的“分配”确实不准确,请原谅
他存放的是值而不是地址
int a =3;
int b =3;
是声明了两个int型的变量,a和b都是独立的..不会存在a去引用b的地址