问一句话,大家帮我想想看对不对(50分)

  • 主题发起人 waterspace
  • 开始时间
W

waterspace

Unregistered / Unconfirmed
GUEST, unregistred user!
大家想想看下面这句话对不。如果觉得不对给段代码或函数证明一下。
“地址是数据的存储位置,一旦常量和变量被定义,它的地址就固定了”
 
参考《delphi技术手册》
 
变量只是一个句柄,放在堆中,它包含两种信息,一个是句柄的地址,一个是指向的值的地址,前者是不变的,后者则可能是变化的。
它指向的值才是真正的数据的存储位置,放在栈中。
 
一句话用得着吗?大家觉得对不对都给个回复,要是没人有异议就结帖。
 
to happycyp:
你所说的变量代表什么?就是标识符吗?照你所说的那种变量,我想也应该是在栈中吧?它指向的值有可能在堆中也可能在栈中。
 
如果大家觉得对也给个回复啊
 
procedure TForm1.Button1Click(Sender: TObject);
var
p : Pointer;
i : Integer;
begin
p := @i;
i := 100;
ShowMessage(IntToStr(Integer(p^)));
end;
 
“地址是数据的存储位置,一旦常量和变量被定义,它的地址就固定了”

内存地址是数据的存储位置 这话应该就没错啦,

后面那句,肯定是错的。

首先来说常量,常量很可能因为编译器的优化而根本不存在地址的概念。因为它已经成为OPCODE的操作数的一部分了。
其次是变量,变量有很多种吧。就拿全局变量和局部变量来说, 通常来说全局变量在一个程序中的储存位置是不变的(之所以说通常, 是因为在不同的操作系统极有可能不同)。但是局部变量就不同,因为程序的堆栈每一时刻都可能不同,所以局部变量的地址当然也就不同了。

具体代码就没了。还有我上面的说话有些地方不知有没记错,不过总的来说是对的就是了[:D]
 
太深。。。
 
去研究下指针吧
 
“首先来说常量,常量很可能因为编译器的优化而根本不存在地址的概念。因为它已经成为OPCODE的操作数的一部分了。”
如果常量不存地址,那么常量怎么放在内存中?
"但是局部变量就不同,因为程序的堆栈每一时刻都可能不同,所以局部变量的地址当然也就不同了。"
这句话是什么意思?局部变量在每一次进入函数时,应该算是重新被定义吧?每次进入函数可能会不同,但是在函数内部,在它的生存期内难道地址不是保持不变的吗?
 
to tianliangle2003:
认为你应该去研究下指针的地址
 
>> 如果常量不存地址,那么常量怎么放在内存中?
原因已经说得很明白
--常量很可能因为编译器的优化而根本不存在地址的概念。因为它已经成为OPCODE的操作数
--的一部分了。”
如果也不明白我也没办法(因为要证明起码你要会汇编),下面我我试验给我看吧。
const int c1= 1;
const int c2= 9999;

char golvar=0;

int _tmain(int argc, _TCHAR* argv[])
{
argc= argc+c1;
argc= argc+c2;

argc*= golvar;

return argc;
}

00401000 >/$ 8B4424 04 mov eax, [esp+4]
00401004 |. 0FBE0D C07240>movsx ecx, byte ptr [golvar]
0040100B |. 05 10270000 add eax, 2710 //2710即10000
//经编译器优化你已经找不到常量
//的踪影了吧。
00401010 |. 0FAFC1 imul eax, ecx
00401013 /. C3 retn


>> 这句话是什么意思?局部变量在每一次进入函数时,应该算是重新被定义吧?每次进入
>>函数可能会不同,但是在函数内部,在它的生存期内难道地址不是保持不变的吗?
函数地址是不变的,但是函数的局部变量是 保存 在函数的外部的一个叫 堆栈 的地方的。
如果函数的局部变量保存在函数内部,那么多线程的情况下,几个线程同时调用某个函数,那不是会出现问题了吗? 事实上是不会的,因为 线程都有自己的堆栈空间。 而变量就保存在哪。

注:本人水平有限, 对于一些名字相似的名词可能记错,比如堆栈,或者堆、栈。请见谅。毕竟我只是业余的程序爱好者。
 
多人接受答案了。
 
顶部