char *和char array []差异 - C ++ / C.

时间:2013-05-21 19:21:48

标签: c++ c arrays pointers char

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

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

 char arr[] = "Hello"

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

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

 char* cp = "Hello";

是否会创建一个数组,以及指向该数组的指针?

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

2 个答案:

答案 0 :(得分:3)

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

  

char数组(无论是普通charsigned 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)

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