首页 > 解决方案 > C++中的指针和地址

问题描述

我用指针弄乱了一点。请查看以下结果(地址)。

第一个代码:

#include <iostream>

int main(){
    int a = 5;
    void* pointer = &a;
    std::cout << a << std::endl << &a << std::endl;
    std::cout << pointer << std::endl ;
    std::cin.get();
}  

结果:

结果1

第二个代码:

#include <iostream>

int main(){
    int a = 5;
    void* pointer = &a;
    std::cout << a << std::endl << &a << std::endl;
    std::cout << &pointer << std::endl ;
    std::cin.get();
}  

结果:

结果2

为什么a两个代码之间变量的地址会发生变化?

标签: c++pointersmemory-address

解决方案


在第一种情况下,您永远不会获取 的地址pointer,因此pointer可以存储在寄存器中,甚至根本不存储。(现代编译器非常聪明,现代机器有很多寄存器。)

例如,gcc 11 将值保存在寄存器中而不进行优化,并且直接-O2插入地址a(在这里组装,好奇的人。)

在第二种情况下,您确实获取了 的地址pointer,因此它必须存储在内存中的某个位置。
这意味着a可能会将其存储在不同的地方以便为其腾出空间。

此外,一些平台会随机化存储位置以降低程序的可破解性,因此假设事物在不同的“运行”中具有相同的地址通常不是一个好主意。


推荐阅读