C/C++中的每个变量都指向内存中的常量地址吗?

Wal*_*r M 4 c c++

我有 3 个问题:

在 C/C++ 中,变量基本上保存一个地址,该地址指向保存该值的内存位置。

例如:

int myVar = 5;
Run Code Online (Sandbox Code Playgroud)

这里,myVar包含指向包含 5 的内存位置的地址。如果我更改变量值:

myVar = 10;
Run Code Online (Sandbox Code Playgroud)

内存地址保持不变,但值被覆盖。

  1. 是否可以更改myVar所持有的地址?(我指的不是指针*,只是普通变量)

对于对象变量怎么样:

class Box {. . .}
Box myBox;
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,myBox变量基本上保存了内存中包含该对象的位置的地址。

  1. 有人也可以更改myBox引用的地址吗?(再次强调,我指的不是指针 *,只是普通变量)。

  2. 普通变量在程序的生命周期内是否在内存中保存恒定的地址?

感谢大家的时间和理解!

dbu*_*ush 5

在 C/C++ 中,变量基本上保存一个地址,该地址指向保存该值的内存位置。

这是不正确的。变量是具有地址的对象,该地址在变量的生命周期内不会更改并保存值。

对于 C,这在C 标准的 6.2.4p2 节中进行了描述:

对象的生命周期是程序执行的一部分,在此期间保证为其保留存储空间。对象存在,具有常量地址,并在其整个生命周期中保留其最后存储的值。

因此,变量的地址不能更改,因为它在变量的整个生命周期中都是恒定的。

变量也可能根本没有地址。如果使用关键字声明register,则不允许获取此类变量的地址。虽然细节是由实现定义的,但这样的变量可以完全驻留在 CPU 寄存器中,在这种情况下它没有地址。

如果某个特定变量的地址从未被获取,编译器还可能优化该变量的地址并将其存储在寄存器中。

关于你的例子:

int myVar = 5;
Run Code Online (Sandbox Code Playgroud)

这里,变量myVar有某个地址,即&myVar,并保存值 5。

myVar = 10;
Run Code Online (Sandbox Code Playgroud)

这会将 的值更改myVar为 10。