c++ - 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();
}
结果:
第二个代码:
#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();
}
结果:
为什么a
两个代码之间变量的地址会发生变化?
解决方案
在第一种情况下,您永远不会获取 的地址pointer
,因此pointer
可以存储在寄存器中,甚至根本不存储。(现代编译器非常聪明,现代机器有很多寄存器。)
例如,gcc 11 将值保存在寄存器中而不进行优化,并且直接-O2
插入地址a
。(在这里组装,好奇的人。)
在第二种情况下,您确实获取了 的地址pointer
,因此它必须存储在内存中的某个位置。
这意味着a
可能会将其存储在不同的地方以便为其腾出空间。
此外,一些平台会随机化存储位置以降低程序的可破解性,因此假设事物在不同的“运行”中具有相同的地址通常不是一个好主意。
推荐阅读
- javascript - 无法检查签名板是否为空
- python - 如何为我的分形树项目存储正确的角度?
- c# - 我需要了解为什么当我向标签添加值时我得到空值?
- linux - Ping 监视 Bash 中逗号分隔的文件?
- javascript - JavaScript 中的队列和“超时”异步函数调用
- c - 如何设置alsa播放缓冲区大小?
- r - 在没有包的循环中根据前一行计算一行
- php - cakephp3中的关系
- amp-html - 从 Google AMP Cache url 提供时,AMP-video-docking 在 iOS 上不起作用
- amazon-redshift - 使用动态 SQL 编写存储过程