刚从 C++ 开始,我想知道是否有人可以解释一下。
我相信您可以通过以下方式初始化 char 数组
char arr[] = "Hello"
这将创建一个带有 values 的 Char 数组'H', 'e', 'l', 'l', 'o', '\0'
。
但如果我确实创建了这个:
char* cp = "Hello";
这会创建一个数组以及指向该数组的指针吗?
例如:cp
将指向('H')
内存中的第一个元素,以及数组的附加元素?
字符串文字本身具有数组类型。因此,在您给出的第一个示例中,实际上涉及两个数组。第一个是包含字符串文字的数组,第二个是arr
您要声明的数组。字符串文字中的字符被复制到arr
. C++11 的措辞是:
char
数组(无论是普通的char
、signed char
还是unsigned 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 现在是 a const int *
。