我遇到过c ++代码:
char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
cout << "Greeting message: ";
cout << greeting << endl;
输出:Hello
由于问候语是一个大小为6的数组,因此显示问候语应仅显示&#34; H&#34;因为greeting[0]
中的cout
,因为它显示的是数组的第一个地址。我不知道我错在哪里。
答案 0 :(得分:6)
除非它是sizeof
或一元&
运算符的操作数,否则表达式类型为“N
- 元素数组{{1} “将被转换(”衰减“)到”指向T
的指针“类型的表达式,表达式的值将是数组的第一个元素的地址。
这意味着在声明中
T
表达式cout << greeting << endl;
从类型greeting
的表达式转换为类型char [6]
的表达式,表达式的值是第一个元素的地址。
定义流运算符char *
,如果它接收到<<
类型的参数,它将写出从该地址开始的字符的序列,直到它看到0终结者;这是一个如何运作的简单例子:
char *
真正的运算符定义会更复杂,但这是基本的想法。
如果您只打印std::ostream& operator<<( std::ostream& s, char *p )
{
while (*p)
s.put( *p++ );
return s;
}
的第一个字符,则必须明确索引或取消引用它:
greeting
或
cout << greeting[0] << endl;
答案 1 :(得分:2)
greeting
decays to a pointer本身。但如果听起来很复杂,你可以把它看作是了解cout
做什么的指针。
cout
方法打印从greeting[0]
开始直到\0
的字符。
答案 2 :(得分:1)
如果要查看地址值写入
char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
cout << "Greeting message: ";
cout << (void*)greeting << endl;
// ^^^^^^^
std::ostream& std::operator<<(std::ostream&, T type);
提供const char*
,const char[]
和char
类型的专精。
答案 3 :(得分:0)
是问候这里是一个指向数组中第一个元素的指针,所以如果你这样做的话: cout&lt;&lt; *问候; 输出将是H. 但实际上当你把它传递给cout对象时,它足够聪明地知道问候语不仅仅是一个指针,而是根据操作符重载处理的内部实现,它更像是一个字符串。 所以这不是问题,只是cout可以理解它。