如何在2D char数组中打印[x] [y]元素的地址? (C ++)

时间:2018-04-12 12:15:35

标签: c++ arrays char

char arr[2][6] = { "hello", "foo" };

cout << arr[0] << " or " << *(arr) << endl;// prints "hello"
cout << arr[1] << " or " << *(arr + 1) << endl; // prints "foo"

cout << arr << endl; // prints an address of "hello" (and 'h')
cout << arr + 1 << endl; //prints an address of "foo" (and 'f')

cout << arr[0][1] << endl; // prints 'e'
cout << &arr[0][1] << endl; // prints "ello"

所以,我想打印一个地址,比如,&#39; e&#39; in&#34;你好&#34;。我该怎么做?

我知道如果我正在处理任何其他类型的数组,&amp; arr [0] [1] 会完成这项工作,但是所有这些 cout char(数组)超载我不确定它是否可能?

3 个答案:

答案 0 :(得分:5)

operator <<(std::ostream&, const char*)有一个重载,它打印c-string(以空字符结尾的字符串)。在这种情况下,您必须转发void*打印地址:

std::cout << static_cast<const void*>(&arr[0][1]) << std::endl;

答案 1 :(得分:4)

是的,它是可能的,但只能绕过char*的IOstream特殊处理(它假定一个C字符串并相应地格式化其输出):

cout << (void*)&arr[0][1] << endl;
//      ^^^^^^^

这与2D阵列无关。这是一个更简单的例子:

#include <iostream>

int main()
{
    const char* str = "hi";
    std::cout << &str[0]        << '\n'; // "hi"
    std::cout << (void*)&str[0] << '\n'; // some address
}

live demo

答案 2 :(得分:3)

&#39; ello&#39;的地址并且&#39; e&#39;在&#39;你好&#39;是相同的。一个数组只是一个连续的内存块,它的地址是它的第一个值的地址,这就是为什么数组&#39; ello&#39;与&#39; e&#39;具有相同的地址。