为什么此c ++代码没有返回数组中每个字符的地址?

时间:2019-03-04 10:12:58

标签: c++

我正在尝试获取数组中每个字符的地址,如下所示:

#include <bits/stdc++.h>
using namespace std;

int main() {
    char arr[] = {'a', 'b', 'c'};

    cout<<&arr[0]<<endl;
    cout<<&arr[1]<<endl;
    cout<<&arr[2]<<endl;

    return 0;
}

但是我得到的输出如下:

abc0╒@
bc0╒@
c0╒@
Press any key to continue . . .

输出看起来不像是具有十六进制数字的地址,而是一些随机字符。我在这里缺少一些概念吗?我想获取数组arr中每个字符的地址。

2 个答案:

答案 0 :(得分:7)

&arr[i]的类型是char*

cout是实例的类具有<<的重载const char*运算符。它将指针视为以NUL终止的字符串的开头,并将数据输出为文本。

您正在观察未定义行为的影响,因为未达到NUL终止符。如果你写过

char arr[] = {'a', 'b', 'c', 0};

然后将定义程序行为。

如果要输出地址,请使用cout << (const void*)&arr[0] << endl;&c。

答案 1 :(得分:2)

如果要打印出地址,可以先将它们(从char*投射到void*

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

否则,它们将被视为c-style string,并且试图打印字符串的内容。由于arr最终没有空终止符'\0',因此此处的行为未定义。