如何将数组的地址放入变量?
char * str1 = "Hello";
int add = 0;
现在我想将数组的地址放入add
。
我知道我可以通过以下方式打印出阵列的地址:
printf("Address = %p", str1);
但是,我想将地址存储在变量中。
答案 0 :(得分:4)
如果要在变量中存储内存地址,正确的方法是将变量键入std::intptr_t
或std::uintptr_t
。这是因为这些类型保证足够大以容纳任何内存地址:
char * str1 = "Hello";
uintptr_t p = (uintptr_t)str1;
除此之外,请注意str1
的值已经是内存地址(它指向H
),尽管与&str1
的值不同(指向str1
{1}})。
答案 1 :(得分:3)
将指针转换为数字需要重新解释:
add = reinterpret_cast<int>(str1);
但是这种方法存在各种各样的问题:
如果你需要一个可以保存指针或整数的变量,那么最好使用一个union。
答案 2 :(得分:1)
使用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 ] );
答案 3 :(得分:1)
根据您对Jon接受的答案的评论:
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的建议或您自己的建议(可能是编译时)检查)逻辑找到足够大的整数类型。