我被字符串和数组困住了

Posted

技术标签:

【中文标题】我被字符串和数组困住了【英文标题】:I am stuck with string and array 【发布时间】:2016-04-01 16:52:17 【问题描述】:

我遇到了一个 c++ 代码:

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

输出:Hello

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

【问题讨论】:

请说明为什么您希望它只显示“H”。您正在打印 greeting 而不是 greeting[0] greeting 衰减成一个指针 char * 并且它指向的整个字符串将被打印出来。如果您只想打印第一个字符,请使用 cout &lt;&lt; greeting[0] &lt;&lt; endl; 这是 cout 显示字符串的方式...因为 greeting 是一个字符串,这就是 cout 显示 "Hello" 但如果你写 "greeting[0]" 那么 cout 将显示 'H' 作为字符... operator &lt;&lt;char * 类型被重载以从给定地址开始并打印字符,直到找到 \0 问候不是代表数组的第一个值吗? 【参考方案1】:

除非它是sizeof 或一元&amp; 运算符的操作数,否则将转换类型为“N-元素数组T”的表达式(“decay ") 类型为“指向T”的表达式,表达式的值将是数组第一个元素的地址。

这意味着在声明中

cout << greeting << endl;

表达式greetingchar [6]类型的表达式转换为char *类型的表达式,表达式的值是第一个元素的地址。

流操作符&lt;&lt; 被定义为如果它接收到char * 类型的参数,它将写出从该地址开始的字符序列,直到它看到0 终止符;这是它如何工作的一个简单示例:

std::ostream& operator<<( std::ostream& s, char *p )

  while (*p)
    s.put( *p++ );
  return s;

真正的运算符定义会稍微复杂一些,但这是基本思想。

如果您只想打印出greeting 的第一个字符,则必须显式索引或取消引用它:

cout << greeting[0] << endl;

cout << *greeting << endl;

【讨论】:

【参考方案2】:

greeting decays to a pointer 本身。但如果听起来很复杂,您可以将其视为一个指针,以了解 cout 的作用。

cout 方法打印从greeting[0]\0 的字符。

【讨论】:

【参考方案3】:

如果要查看地址值写入

char greeting[6] = 'H', 'e', 'l', 'l', 'o', '\0';
cout << "Greeting message: ";
cout << (void*)greeting << endl;
     // ^^^^^^^ 

std::ostream&amp; std::operator&lt;&lt;(std::ostream&amp;, T type); 提供 const char*const char[]char 类型的特化。

【讨论】:

【参考方案4】:

是的,这里的问候是指向数组中第一个元素的指针,所以如果你这样做: cout

【讨论】:

以上是关于我被字符串和数组困住了的主要内容,如果未能解决你的问题,请参考以下文章

我被我的 python csv 作业困住了

我被这个错误困住了。当我按照所有步骤在heroku上部署角度应用程序时

谁能帮助我的第一个 WebView 我被这个问题困住了?不幸的是 <app name> 已停止

两个字符串中的唯一字符对

练习循环和数组

类型“”不可分配给类型“JwtConfig”