如何将数组的地址放入变量中

时间:2012-06-20 09:07:28

标签: c++

如何将数组的地址放入变量?

char * str1 = "Hello";
int add = 0;

现在我想将数组的地址放入add。 我知道我可以通过以下方式打印出阵列的地址:

printf("Address = %p", str1);

但是,我想将地址存储在变量中。

4 个答案:

答案 0 :(得分:4)

如果要在变量中存储内存地址,正确的方法是将变量键入std::intptr_tstd::uintptr_t。这是因为这些类型保证足够大以容纳任何内存地址:

char * str1 = "Hello";
uintptr_t p = (uintptr_t)str1;

除此之外,请注意str1的值已经是内存地址(它指向H),尽管与&str1的值不同(指向str1 {1}})。

答案 1 :(得分:3)

将指针转换为数字需要重新解释:

add = reinterpret_cast<int>(str1);

但是这种方法存在各种各样的问题:

  • 如果sizeof(int)&lt; sizeof(char *)然后指针的一部分丢失,你将无法恢复它。
  • 由于意外的别名,某些优化可能会使您的代码无效。

如果你需要一个可以保存指针整数的变量,那么最好使用一个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的建议或您自己的建议(可能是编译时)检查)逻辑找到足够大的整数类型。