【问题标题】:char* and char arr[] Difference - C++/C [duplicate]char* 和 char arr[] 区别 - C++/C [重复]
【发布时间】:2013-05-16 16:24:44
【问题描述】:

刚开始使用 C++,我想知道是否有人可以解释一下。

相信你可以通过以下方式初始化一个char数组

 char arr[] = "Hello"

这将创建一个带有值 'H', 'e', 'l', 'l', 'o', '\0' 的 Char 数组。

但如果我确实创建了这个:

 char* cp = "Hello";

这会创建一个数组以及指向该数组的指针吗?

例如:cp 将指向内存中的第一个元素('H'),以及数组的其他元素?

【问题讨论】:

  • char* cp = "Hello"不正确,应该是const char* cp = "Hello"
  • 你有没有试过检查如果你跟随指针,你会在内存中找到什么?如果没有,请这样做。另外,试试 SO 上的搜索功能,你会发现很多问题,有很好的答案,解释了 C/C++ 中关于指针和数组的一切。

标签: c++ c arrays pointers char


【解决方案1】:

字符串文字本身具有数组类型。因此,在您给出的第一个示例中,实际上涉及两个数组。第一个是包含字符串文字的数组,第二个是您要声明的数组arr。字符串文字中的字符被复制到arr。 C++11 的措辞是:

char 数组(无论是普通的 charsigned char 还是 unsigned char)、char16_t 数组、char32_t 数组或 wchar_t 数组都可以通过窄字符文字进行初始化,@分别为 987654330@ 字符串文字、char32_t 字符串文字或宽字符串文字,或用括号括起来的适当类型的字符串文字。字符串字面量值的连续字符初始化数组的元素。

在第二个示例中,您让字符串字面量数组进行数组到指针的转换以获取指向其第一个元素的指针。所以你的指针指向字符串字面量数组的第一个元素。

但是,请注意,您的第二个示例使用了在 C++03 中已弃用并在 C++11 中删除的功能,允许从字符串文字转换为 char*。对于有效的 C++11,它必须改为:

const char* cp = "Hello";

如果确实在 C++03 或 C 中使用到 char* 的转换,则必须确保不要尝试修改字符,否则会出现未定义的行为。

【讨论】:

  • 该问题也被标记为 C,因此您可以在 C 中添加,char* 是完全有效的(尽管,由于尝试修改字符串文字会调用未定义的行为,使用 const char* 在以下方面也有优势C)。
  • @DanielFischer 我应该多看一下标签。谢谢。
  • 第二个示例是否允许您编辑指向数组的内容?例如:cp = "苹果"。不确定数组是否会自动生成,谢谢回复!
  • @Pillbox 但是cp = "Apple"; 不会改变数组的内容,它会改变数组的初始元素cp 指向的哪个。所以cp = "Apple"; cp = "Banana"; 没问题。 cp[0] = 'x'; 会调用未定义的行为。
  • @DanielFischer 你注意到了很多我没有注意到的事情。谢谢。
【解决方案2】:

数组基本上是一个常量指针,它指向数组的开头。指针只是一个指针,它指向任何内存位置。因此,给定指针pp[3] 将指向p+3,这将导致分段错误,除非您已将其声明为具有至少 4 个元素的“数组”(int *p = new int[4];)。这与int p[4]; 完全相同,只是p 现在是const int *

【讨论】:

    猜你喜欢
    • 2012-04-28
    • 1970-01-01
    • 2014-11-07
    • 1970-01-01
    • 2014-03-21
    • 2014-10-28
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    相关资源
    最近更新 更多