变量在哪里?他们的价值在哪里?

时间:2015-04-30 07:29:38

标签: c++ c

我知道变量是与关联的符号名称配对的存储位置,现在我写下这个

int a=8;

我的问题是:

8在哪里? 8的地址是否与a的地址相同?

7 个答案:

答案 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;

enter image description here

答案 1 :(得分:2)

该语句是变量a定义初始化。如果我们用简单的术语来分解过程,它看起来像是

int a=8;
  • 声明名为a的{​​{1}}
  • 变量
  • 定义它(分配内存)
  • 使用值int初始化变量。 [FWIW,此处88字面意思]

此后没有单独的int8保留值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 ++来假设你也可以使用板载工具来使它可见。打开注册,汇编和调试视图

  • 调试 - &gt; Windows - &gt;寄存器
  • 调试 - &gt; Windows - &gt; Dissassembly
  • 调试 - &gt; Windows - &gt;记忆 - &gt;存储器1。

通过在反汇编视图中单步执行调用,您实际上可以看到内存中发生了什么。

我使用了一个稍微扩展的代码行示例来强制显示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;

enter image description here