刚开始使用C ++,我想知道是否有人可以解释一下。
我相信你可以用以下方式初始化一个char数组
char arr[] = "Hello"
这将创建一个值为'H', 'e', 'l', 'l', 'o', '\0'
的Char数组。
但如果我确实创造了这个:
char* cp = "Hello";
是否会创建一个数组,以及指向该数组的指针?
例如:cp
将指向内存中的第一个元素('H')
,以及数组的其他元素?
答案 0 :(得分:3)
字符串文字本身具有数组类型。所以在你给出的第一个例子中,实际上涉及两个数组。第一个是包含字符串文字的数组,第二个是您要声明的数组arr
。字符串文字中的字符将复制到arr
中。 C ++ 11的措辞是:
char
数组(无论是普通char
,signed char
还是unsigned char
),char16_t
数组,char32_t
数组还是{{ 1}}数组可以分别由窄字符文字wchar_t
字符串文字,char16_t
字符串文字或宽字符串文字初始化,或者由括在括号中的适当类型的字符串文字初始化。字符串文字值的连续字符初始化数组的元素。
在第二个示例中,您将让字符串文字数组进行数组到指针转换,以获取指向其第一个元素的指针。所以你的指针指向字符串文字数组的第一个元素。
但是,请注意,您的第二个示例使用的是C ++ 03中不推荐使用的功能,并在C ++ 11中删除,允许从字符串文字转换为char32_t
。对于有效的C ++ 11,它必须是:
char*
如果在C ++ 03或C中使用转换为const char* cp = "Hello";
,则必须确保不要尝试修改字符,否则您将有未定义的行为。
答案 1 :(得分:0)
数组基本上是一个常量指针,指向数组的开头。指针只是一个指针,指向任何内存位置。因此,给定指针p
,p[3]
将指向p+3
,这会产生分段错误,除非您已将其声明为具有至少4个元素的“数组”({{1 }})。这与int *p = new int[4];
完全相同,只是p现在是int p[4];
。