-1

我有一个简单的程序:

char buffer[128];                      // creates an array of 128 elements
memset(&buffer, 65, sizeof(buffer));   // fills buffer with 'A' (ascii 65) letter
cout << buffer << endl;                // prints whole buffer - 128 times 'A' letter
cout << &buffer << endl;               // prints adress of a buffer (first element of it)
cout << buffer[0] << endl;             // prints first element of a buffer

直到现在一切都很好,但我不明白为什么,当我称之为:

cout << &buffer[0] << endl;          

恕我直言,上面的代码应该打印缓冲区中第一个元素的地址(与 相同&buffer),但它会打印整个缓冲区,就像cout << buffer << endl;

为什么会这样?

4

4 回答 4

5

这是因为&buffer[0]is a char*,并且存在一个std::ostream& operator<<重载,const char*它假定它是一个以 nul 结尾的字符串的第一个元素,并按原样打印它的字符。

于 2013-06-05T11:44:35.143 回答
1
&buffer[0] == buffer + 0 == buffer

并打印整个数组。

于 2013-06-05T11:43:13.567 回答
0

因为它是一样的。buffer[0] 是偏移量为 0 (*(buffer+0)) 的缓冲区的取消引用。然后你再次计算它的地址并得到缓冲区。

于 2013-06-05T11:44:34.863 回答
0

你应该试试

cout << (void*) buffer << endl
于 2013-06-05T12:06:34.533 回答