1

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

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

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

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

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

4

4 回答 4

4

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

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

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

于 2012-06-20T09:10:51.763 回答
3

将指针变成数字需要重新解释:

add = reinterpret_cast<int>(str1);

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

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

如果您需要一个可以保存指针整数的变量,最好使用联合。

于 2012-06-20T09:11:54.867 回答
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 ] );
于 2012-06-20T09:12:03.367 回答
1

根据您对乔恩接受的答案的评论:

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 的建议或您自己的(可能是编译时检查)逻辑找到一个足够大的整数类型。

于 2012-06-20T09:55:55.467 回答