【问题标题】:How is a const array able to have only characters in each element but a char* array is able to point to strings in each element?const 数组如何能够在每个元素中仅包含字符,而 char* 数组如何能够指向每个元素中的字符串?
【发布时间】:2018-08-30 09:09:33
【问题描述】:
char characters[] = {'h','e','l','l','o'};


char* characters[] = {"h","e","l","l","o"};

后者如何能够指向单个字符串?

【问题讨论】:

  • 因为char 是一种只能包含一个自身元素的类型。 char* 是指向某个内存位置的指针,当您创建字符串文字(引号中的字符字符串)时,它实际上是一个数组,因此您可以返回一个指针,以便您可以对其执行指针运算以遍历字符串。
  • 您能解释一下为什么这让您感到惊讶吗?这与char c = 'h';char* c = "h"; 的情况完全相同。 (顺便说一下,第二个例子 - 和你的 - 不应该编译。)
  • 我喜欢这样的问题,即“为什么这两种不同类型的行为不同?”
  • 顺便说一句,缺少const -> const char* characters[]
  • @SkepticalEmpiricist 你说得对,我撤回了重复投票。

标签: c++ arrays string char


【解决方案1】:

后者如何能够指向单个字符串?

当你写这个时:

char characters[] = {'h','e','l','l','o'};

您定义了一个char 类型的数组,即您定义了一个char[5] 类型的变量。因此,您可以使用 char 类型的元素对其进行初始化。

相比之下,当你写:

char* characters[] = {"h","e","l","l","o"};

您定义了一个char* 类型的数组,即您定义了一个char*[5] 类型的变量——而char* 表示指向char 的指针,即C 风格字符串。因此,您可以使用 string literal 类型的元素对其进行初始化。

也许第二个数组应该更恰当地命名为 strings[] 而不是 characters[]

准确地说,字符串字面量(例如'h')本身就是const char[2]1 类型,它对应于const char* 的指针术语。所以应该定义一个这样的字符串数组const char* strings[] = ...而不是char* strings[] = ...


1const char[2] 而不是const char[1],因为它是空终止的,因为它是一个数组,其中包含第一个元素为'h 和第二个元素为'\0'

【讨论】:

    【解决方案2】:

    因为类型不同。在您的第一个示例中,您有一个字符数组,在第二个示例中,您有一个指向字符的指针数组(如果需要,可以使用数组数组)。 String literalsconst char[] 类型,转换为 const char*。您应该在第二个示例中使用 const 限定符:

    const char* characters[] = {"h","e","l","l","o"};
    

    碰巧你的字符串文字中有一个字符,后面跟着一个 hidden 空终止字符。所以如果你有:

    const char test[] = "h";
    

    你实际拥有的是:

    const char test[] =  {'h', '\0'};
    

    添加一个指向上述示例的指针,您就有了一个以空字符结尾的字符数组的数组。 为了使事情更清楚,您还可以:

    const char* characters[] = {"hello","world","etc"};
    

    首选std::string 而不是上述方法,因为它会为您完成所有繁重的工作。

    【讨论】:

      猜你喜欢
      • 2017-03-12
      • 2022-09-23
      • 2016-12-26
      • 2011-09-12
      • 2013-10-22
      • 1970-01-01
      • 2011-04-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多