为什么可以在chars数组中更改字符,而使用char *则不可能?

时间:2013-03-22 12:00:45

标签: c++ arrays char

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

4 个答案:

答案 0 :(得分:12)

声明一个字符数组

char myarr[5] = "abcd";

这是你的数组。 abcd字母被复制到本地数组中,无论你想要什么,你都可以自由地使用它。 c ++中的字符串文字(“”中的字符串)的类型为const char[N]。您可以存储指向它的指针

const char* p = "abcd"

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

的隐式转换
char * p = "abcd"

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

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

答案 1 :(得分:1)

char*Read Only Memory中的字符串保留空间,因此您无法更改它。而char str[]在Stack上。 char*类型的变量表现得像const,因此您无法改变它。

答案 2 :(得分:1)

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

    char str[SIZE]; 

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

在后一种情况下,

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

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

答案 3 :(得分:0)

如果您创建array of char = char[],则会在堆栈中保留包含您放入其中的符号+ \0的空间。因为它在堆栈上,所以可以写入。
但是char *pc = "abcd"之类的东西会在程序的只读部分创建一个字符串“abcd”。你只有一个指向只读字符串的指针,而不是const char*