【问题标题】: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
  • 问候不是代表数组的第一个值吗?

标签: c++ c arrays string


【解决方案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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-04-30
          • 1970-01-01
          • 2020-04-24
          • 1970-01-01
          • 2017-09-26
          • 1970-01-01
          • 2012-05-18
          相关资源
          最近更新 更多