char*和char arr[]差异-C++/C 刚刚开始C++,我想知道有没有人能解释什么。

char*和char arr[]差异-C++/C 刚刚开始C++,我想知道有没有人能解释什么。,c++,c,arrays,pointers,char,C++,C,Arrays,Pointers,Char,我相信可以用以下方法初始化字符数组 char arr[] = "Hello" 这将创建一个字符数组,其值为'H','e','l','l','o','\0' 但如果我真的创造了这个: char* cp = "Hello"; 这将创建一个数组,以及指向该数组的指针吗 例如:cp将指向内存中的第一个元素('H'),以及数组中的其他元素。数组基本上是一个常量指针,它指向数组的开头。指针就是指向任何内存位置的指针。因此,给定指针p,p[3]将指向p+3,这将导致分段错误,除非您将其声明为至少包含4

我相信可以用以下方法初始化字符数组

 char arr[] = "Hello"
这将创建一个字符数组,其值为
'H','e','l','l','o','\0'

但如果我真的创造了这个:

 char* cp = "Hello";
这将创建一个数组,以及指向该数组的指针吗


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

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

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

char
数组(无论是纯
char
char
还是
unsigned char
)、
char16\u t
数组、
char32\u t
数组或
wchar\u t
数组都可以通过窄字符文本、
char16\u t
字符串文本、
char32\u t
字符串文本进行初始化,或宽字符串文字,或使用大括号中包含的适当类型的字符串文字。字符串文本值的连续字符初始化数组的元素

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

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

const char* cp = "Hello";

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

查看此处:
char*cp=“Hello”
不正确,应该是
const char*cp=“Hello”
您是否尝试过检查如果按照指针操作,将在内存中找到什么?如果没有,就这样做。另外,尝试一下这里的搜索功能,你会发现很多问题,有很好的答案,解释了C/C++中指针和数组的一切。这个问题也被标记为C,所以你可以在C中添加,
char*
是完全有效的(虽然,由于试图修改字符串文字会调用未定义的行为,使用
const char*
在C中也有优势)。@DanielFischer我应该更多地查看标记。谢谢。第二个示例是否允许您编辑指向数组的内容?例如:cp=“Apple”。我不确定数组是否会自动生成,感谢您的响应!@Pillbox但是
cp=“Apple”
不会更改数组的内容,它会更改数组的初始元素
cp
指向哪个。因此
cp=“Apple”;cp=“Banana”
是可以的。
cp[0]='x';
会调用未定义的行为。@Danielpher您注意到了很多我没有注意到的东西。谢谢。