我有 3 个问题:
在 C/C++ 中,变量基本上保存一个地址,该地址指向保存该值的内存位置。
例如:
int myVar = 5;
Run Code Online (Sandbox Code Playgroud)
这里,myVar包含指向包含 5 的内存位置的地址。如果我更改变量值:
myVar = 10;
Run Code Online (Sandbox Code Playgroud)
内存地址保持不变,但值被覆盖。
对于对象变量怎么样:
class Box {. . .}
Box myBox;
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,myBox变量基本上保存了内存中包含该对象的位置的地址。
有人也可以更改myBox引用的地址吗?(再次强调,我指的不是指针 *,只是普通变量)。
普通变量在程序的生命周期内是否在内存中保存恒定的地址?
感谢大家的时间和理解!
在 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。