C++将地址转换为字符串
一 概述
需要在C++中将地址转换为字符串。
二 方法
可以通过以下方法实现:
1 使用 std::ostringstream(推荐)
直接利用流输出指针,自动格式化为十六进制并包含 `0x` 前缀。vs2015并不包含`0x` 前缀。
#include <sstream>
#include <iostream>
int main() {
int x = 42;
void* p = &x;
std::ostringstream oss;
oss << p; // 自动转换为十六进制字符串,如 "0x7ffd4353d934"
std::string address = oss.str();
std::cout << "Address: " << address << '\n';
return 0;
}
2 使用 snprintf和 `%p` 格式符
通过C风格函数将指针格式化为字符串,需显式转换为 void*。
#include <cstdio>
#include <iostream>
int main() {
int x = 42;
int* p = &x;
char buffer[20];
// 转换为 void* 确保类型正确
std::snprintf(buffer, sizeof(buffer), "%p", (void*)p);
std::string address(buffer);
std::cout << "Address: " << address << '\n';
return 0;
}
3 转换为整数并自定义格式
若需不带0x前缀,可将指针转换为 uintptr_t后输出为十六进制。
#include <sstream>
#include <cstdint>
#include <iostream>
int main() {
int x = 42;
int* p = &x;
std::ostringstream oss;
oss << std::hex << reinterpret_cast<uintptr_t>(p); // 纯十六进制数字
std::string address = oss.str();
std::cout << "Address: " << address << '\n';
return 0;
}
三 注意事项
1 默认格式:方法一和方法二生成的字符串通常包含 0x前缀。
2 类型安全:推荐使用 std::ostringstream,避免手动管理缓冲区和类型转换。
3 无前缀处理:需要纯十六进制数字时,使用方法三,但需确保 uintptr_t可用(C++11及以上)。
根据需求选择最合适的方法,确保代码可读性和安全性。