我知道变量是与关联的符号名称配对的存储位置,现在我写下这个
int a=8;
我的问题是:
8
在哪里? 8
的地址是否与a
的地址相同?
答案 0 :(得分:9)
变量在内存中命名为location。换句话说,变量只是值的占位符。当你宣布
时int a = 8;
8
存储在名为a
的内存位置。可以使用a
从该内存位置访问此整数文字。
0x12345 <--- Memory address
+-------------+
| |
| 8 |
| |
+-------------+
a <--- Name used to access value stored at location 0x12345
您可以将其视为将值分配到带有变量名称的框中。
int a = 1;
答案 1 :(得分:2)
该语句是变量a
的定义和初始化。如果我们用简单的术语来分解过程,它看起来像是
int a=8;
a
的{{1}} int
初始化变量。 [FWIW,此处8
为8
字面意思] 此后没有单独的int
。 8
保留值a
,这就是全部。
答案 2 :(得分:2)
在二进制可执行文件空间中
当您在全局范围内说int a=8;
时,8
可能会进入数据部分,稍后将用于在加载可执行文件时初始化a
。< / p>
当您在本地范围内说int a=8;
时,8
可能会进入代码部分,稍后将用于初始化变量a
(可能位于当程序流到达这行代码时,进程的堆栈段 *
。
有关详细信息,您可以研究如何打包二进制可执行文件(例如ELF)以及不同部分。
在流程空间
没有文字或8
,变量a
有一个地址,8
存储在该地址。这就是你不能接受文字地址的原因。 (&8
例如是错误的,因为它没有地址,它是匿名存储在某个位置的,或者是可以解决的变量别名)
*
假设实现使用堆栈作为局部变量,对于我见过的所有实现都是如此。
答案 3 :(得分:0)
a
是地点的名称
8
是应该存储在该位置的值。
从int a = 8
生成的代码通常是指示&#34;将数字8存储在位置xxxx&#34;,其中&#34; xxxx&#34;是为a
存储选择的位置
因此8
通常会存储在代码中并复制到应该使用的地方。
(有些平台没有这样做,实际上是从特定的内存位置复制了小数字。在这种情况下,你可以说这个号码有一个位置,但这是一段很长的时间前。)
答案 4 :(得分:0)
a
是一个变量。程序运行时,它位于计算机的RAM /内存中,并且有一个地址,就像RAM中的每个值都有一个地址一样。
当你的程序运行时,8
被复制到a
,因此a
位于计算机内存中({1}}记忆地址)。 a
地址指出的内存位置现在包含8
的值。
现在,当你的程序运行时,变量的名称就不再重要了。它已被编译器转换为指向某个相对内存位置。因此在运行时我们会与地址交谈,尽管我们(人类,而不是计算机)通过使用变量名来表示内存中的位置(地址)来节省脑力。
答案 5 :(得分:0)
让我们试着看一些连续变量的低级细节。
int a = 8;
char b[4] = "ABC";
int c = 4;
a
是一个变量。因此,它在内存中有一个位置0x1012
。假设没有意外的优化移动到这里是如何组织一个小端32位系统的内存
0x1012 8 // lowest byte of a
0x1013 0
0x1014 0
0x1015 0 // highest byte of a
0x1016 65 // (or 0x41 ) ASCII for A first byte of b array
0x1017 66
0x1018 67
0x1019 0 // terminating null
0x101A 4 // lowest byte for c
0x101B 0
0x101C 0
0x101D 0 // highest byte for c
你可以在这里看到变量a,b和c如何在内存中有地址,以及为什么8,4和“abc”是驻留在变量中的值。
如果稍后你有a=20
,记忆会改变:
0x1012 4 // lowest byte of a
0x1013 1
0x1014 0 // remaining unchanged ...
这里20再没有位置
答案 6 :(得分:0)
当您声明变量int a并将其设置为8时,您的计算机实际上将在您的内存中保留一个位置,它放置了8.您可以通过分配地址来获取实际位置(内存地址)到这样的另一个变量:
int* b = &a;
这会将存储(8)的地址分配给新变量b。
如果你正在使用Visual-Studio,它通过你的标签visual c ++来假设你也可以使用板载工具来使它可见。打开注册,汇编和调试视图
通过在反汇编视图中单步执行调用,您实际上可以看到内存中发生了什么。
我使用了一个稍微扩展的代码行示例来强制显示Visual Studio以显示有趣的事件:
int a = 8;
//increment the value in a by 1 and assign it to 1
a = a + 1;
//Get the memory address where the 8 has been
//stored and set it to b
int* b = &a;