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