我被困在字符串和数组中

时间:2016-04-01 16:52:17

标签: c++ c arrays string

我遇到过c ++代码:

char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
cout << "Greeting message: ";
cout << greeting << endl;

输出:Hello

由于问候语是一个大小为6的数组,因此显示问候语应仅显示&#34; H&#34;因为greeting[0]中的cout,因为它显示的是数组的第一个地址。我不知道我错在哪里。

4 个答案:

答案 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可以理解它。