如何将数组的地址放入变量中?
char * str1 = "Hello";
int add = 0;
现在我想将数组的地址放入add
. 我知道我可以通过以下方式打印出数组的地址:
printf("Address = %p", str1);
但是,我想将地址存储在变量中。
如何将数组的地址放入变量中?
char * str1 = "Hello";
int add = 0;
现在我想将数组的地址放入add
. 我知道我可以通过以下方式打印出数组的地址:
printf("Address = %p", str1);
但是,我想将地址存储在变量中。
如果要将内存地址存储在变量中,正确的方法是将变量键入为std::intptr_t
or std::uintptr_t
。这是因为这些类型保证足够大以容纳任何内存地址:
char * str1 = "Hello";
uintptr_t p = (uintptr_t)str1;
除此之外,请注意 的值str1
已经是一个内存地址(它指向H
),尽管它与(指向 )的值&str1
不同str1
。
将指针变成数字需要重新解释:
add = reinterpret_cast<int>(str1);
但是这种方法存在各种问题:
如果您需要一个可以保存指针或整数的变量,最好使用联合。
使用reinterpret_cast
(见 5.2.10/p4):
4 指针可以显式转换为任何大到足以容纳它的整数类型。映射函数是实现定义的。[注意:对于那些知道底层机器的寻址结构的人来说,这并不奇怪。——尾注]
static_assert( sizeof( unsigned int ) >= sizeof( &str1[ 0 ] ), "warning: use a wider type!" );
unsigned int add = reinterpret_cast< unsigned int >( &str1[ 0 ] );
根据您对乔恩接受的答案的评论:
char str1[] = "Hello";
char* str2 = &str1[0];
uintptr_t p = (uintptr_t)str2;
std::cout << std::hex << p << std::endl;
p = (uintptr_t)&str1[1];
std::cout << std::hex << p << std::endl;
p = (uintptr_t)&str1[0];
std::cout << std::hex << p << std::endl;
这意味着您的目标是能够以可读格式流式传输指针值。该标准以实现定义的方式对此进行了如下规定:
basic_ostream<charT,traits>& operator<<(const void* p);
因此,也许您真正想要的是 C++ 风格或(简洁但较少自我记录和编译器检查的)C 风格代码:
std::cout << static_cast<void*>(str1) << '\n';
std::cout << (void*)str1 << '\n';
(但是,如果您特别想要一个数字版本,或者确保它以十六进制显示,没有前导 0x 或实现可能决定的任何其他内容,那么您将回到 Jon 的建议或您自己的(可能是编译时检查)逻辑找到一个足够大的整数类型。