2

如果我声明一个字符数组 ( char str[]),我可以更改其中的任何字符。但是,如果我这样声明该数组 -char* str="abcd";就不可能更改内部的任何字符。这是为什么?他们不应该是同一件事吗?

4

4 回答 4

12

当你声明一个字符数组时

char myarr[5] = "abcd";

这是你的阵列。abcd 字母被复制到您的本地数组中,您可以随意使用它。c++ 中的字符串文字(“”中的字符串)的类型为const char[N]. 您可以存储指向它的指针

const char* p = "abcd"

现在,因为 p 是 const,所以您不能修改字符串文字,这很好。不幸的是,由于历史原因,存在从字符串文字到char*

char * p = "abcd"

在这种情况下,不幸的是,您可以修改字符串文字,但这样做会产生未定义的行为。幸运的是,这种转换已被弃用。

请注意,这是字符串文字的一个独特问题,因为它是唯一的左值文字类型。所有其他文字都是右值,因此没有修改它们的概念。

于 2013-03-22T12:05:53.703 回答
1

在前一种情况下,您将数组声明为,

    char str[SIZE]; 

分配的内存属于你的程序,可以修改。

在后一种情况下,

   char* str="abcd" ; // str is a pointer to string literal, essential makes it a const char * 

您正在尝试写入只读内存位置并且行为未定义。

于 2013-03-22T12:12:56.793 回答
1

char*为字符串保留空间,Read Only Memory因此您无法更改它。而char str[]在堆栈上。类型变量的char*行为类似const,因此您无法更改它。

于 2013-03-22T12:04:00.300 回答
0

如果您创建一个array of char=char[]这将在包含您放入其中的符号的堆栈上保留空间 + \0。因为它在堆栈上,所以可以写入。
但是类似char *pc = "abcd"在程序的只读部分中创建一个字符串“abcd”。您只有一个指向只读字符串的指针,或者更确切地说const char*

于 2013-03-22T12:05:46.200 回答