我正在尝试获取数组中每个字符的地址,如下所示:
#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中每个字符的地址。
答案 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'
,因此此处的行为未定义。