C++中普通变量能否存储其他变量内存地址?指针赋值string为何报错
问题解答
1. 普通变量能否存储其他变量的内存地址
内存地址本质是一个代表内存单元编号的整数,只要普通变量的长度能够匹配当前平台的地址长度,理论上是可以存储的:
- 32位系统下地址长度为4字节,可以用
uint32_t类型变量存储 - 64位系统下地址长度为8字节,可以用
uint64_t类型变量存储
C++标准也提供了专门的uintptr_t类型用于安全存储指针转换后的整数值。但普通的int类型不一定能存下地址,比如64位系统下int通常为4字节,长度小于地址的8字节,直接赋值会出现截断问题。
2. 地址输出包含A-F字符的原因
你在控制台看到的012FF86C这类输出,是cout对指针值做了十六进制格式化后的可读展示结果,不是指针存储的原始内容:
十六进制计数规则中用A-F代表10~15的数值,所以输出中会出现F、C这类字符。指针变量本身存储的是对应这个十六进制数的二进制整数,不是由字符拼接成的字符串。
3. string c = b;报错的原因
C是强类型语言,std::string的构造/赋值函数只接受const char*、std::string实例、字符串字面值等少数匹配类型的入参。你的变量b是int*类型的指针,和std::string要求的入参类型不匹配,同时C没有定义int*到std::string的默认隐式转换规则,因此编译器会直接报错。
如果你需要把控制台展示的十六进制地址字符串存储到std::string中,可以手动做类型转换,示例代码如下:
#include <iostream> #include <string> #include <sstream> using namespace std; int main() { int a = 5; int *b = &a; stringstream ss; ss << b; // 把指针值输出到stringstream,自动转成十六进制字符串 string c = ss.str(); // 从stringstream中拿到字符串赋值给c cout << c << endl; // 输出结果和直接cout << b一致 }
内容的提问来源于stack exchange,提问作者user16661240
相关产品推荐
相关产品推荐

