char buffer[4];
std::cout << &buffer << std::endl;
std::cout << &buffer[0] << std::endl;
Run Code Online (Sandbox Code Playgroud)
当我运行此代码时,第一行是缓冲区中第一个元素的十六进制地址.第二行是四个问号(除非我转换为空指针).
第二个陈述与第一个陈述有何不同(从语义上讲,它们是相同的?)?为什么第二行显示为问号而不是随机垃圾字符?
&buffer以适当的指针类型为您提供缓冲区的地址.那种类型是char (*)[4].
&buffer[0]给出第一个缓冲区元素(a char)的地址,所以地址是类型char*.
标准流类有一个处理a的重载char const*,但没有处理a的重载char (*)[4].然而,指针有一般的重载,接受a void*.因此,指向数组的指针被隐式转换为a void*,并传递给该重载.因此,您可以看到缓冲区的地址.
在第二种情况下,如果buffer已正确初始化,则会看到其内容已打印("c-string"重载的内容).但是,由于您没有初始化它,因此您的代码具有未定义的行为.仅仅尝试打印缓冲区没有明确定义的结果.