char*和char arr[]的区别- c++ /C

char* and char arr[] Difference - C++/C

本文关键字:char c++ 区别 arr      更新时间:2023-10-16

刚刚开始学习c++,我想知道是否有人可以解释一些东西。

我相信你可以用下面的方法初始化一个char数组

 char arr[] = "Hello"

这将创建一个值为'H', 'e', 'l', 'l', 'o', ''的Char数组。

但是如果我创建了这个:

 char* cp = "Hello";

会创建一个数组和指向该数组的指针吗?

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

字符串本身具有数组类型。在你给出的第一个例子中,实际上有两个数组。第一个是包含字符串字面值的数组,第二个是您正在声明的数组arr。将字符串字面值中的字符复制到arr中。c++ 11的措辞是:

char数组(普通的charsigned charunsigned char)、char16_t数组、char32_t数组和wchar_t数组可以分别用窄字符字面值、char16_t字符串字面值、char32_t字符串字面值或宽字符串字面值初始化,也可以用合适类型的用大括号括起来的字符串字面值初始化。字符串字面值的连续字符初始化数组的元素。

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

但是,请注意,您的第二个示例使用了一个在c++ 03中已弃用并在c++ 11中删除的特性,该特性允许从字符串文字强制转换为char*。对于有效的c++ 11,它必须改为:
const char* cp = "Hello";

如果在c++ 03或C中使用到char*的转换,你必须确保你没有试图修改字符,否则你会有未定义的行为。

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