CPP考试备考:如何获取变量地址及是否存在不可取地址的变量
关于C++中无法用
&获取地址的变量 嘿,针对你备考CPP考试的这个问题,答案是肯定的——确实存在无法通过&运算符获取地址的变量,以下是C++标准明确规定的几类典型情况:
1. 用register关键字修饰的变量
register关键字的作用是提示编译器将变量优先存储在CPU寄存器中(不过现代编译器会根据优化策略自行决定是否遵循这个提示),但C++标准明确禁止对register修饰的变量使用&运算符,因为寄存器并不具备内存地址。
示例代码:
register int num = 42; // # // 编译错误:无法获取register变量的地址
2. 结构体/类中的位域成员变量
位域是将一个或多个位打包到单个内存单元中的成员,由于它不是以完整的字节(或更大的内存单元)作为存储单元,因此无法获取位域成员的地址——C++标准不允许对这类变量使用&运算符。
示例代码:
struct DeviceStatus { unsigned int power_on : 1; // 占1位的位域 unsigned int battery_low : 1; // 占1位的位域 }; DeviceStatus status; // &status.power_on; // 编译错误:无法获取位域成员的地址
3. 引用变量本身
引用是对象的别名,它并非独立的对象,因此没有自己的内存地址。当你对引用使用&运算符时,实际上获取的是它所绑定的原始对象的地址,而非引用本身的地址——换句话说,你永远无法获取引用变量自身的地址。
示例代码:
int original = 100; int& ref = original; cout << &ref; // 输出的是&original的地址,而非ref本身的地址 // 不存在“获取ref自身地址”的语法,因为引用没有独立地址
需要额外注意的是:临时对象(比如int(5)这种)不是变量,所以不在你问题的讨论范围内;而普通的局部变量、全局变量、静态变量、动态分配的变量等,都可以正常用&获取地址。
内容的提问来源于stack exchange,提问作者Derek Johnson
相关产品推荐
相关产品推荐

