如果我声明一个字符数组 ( char str[]
),我可以更改其中的任何字符。但是,如果我这样声明该数组 -char* str="abcd";
就不可能更改内部的任何字符。这是为什么?他们不应该是同一件事吗?
4 回答
当你声明一个字符数组时
char myarr[5] = "abcd";
这是你的阵列。abcd 字母被复制到您的本地数组中,您可以随意使用它。c++ 中的字符串文字(“”中的字符串)的类型为const char[N]
. 您可以存储指向它的指针
const char* p = "abcd"
现在,因为 p 是 const,所以您不能修改字符串文字,这很好。不幸的是,由于历史原因,存在从字符串文字到char*
char * p = "abcd"
在这种情况下,不幸的是,您可以修改字符串文字,但这样做会产生未定义的行为。幸运的是,这种转换已被弃用。
请注意,这是字符串文字的一个独特问题,因为它是唯一的左值文字类型。所有其他文字都是右值,因此没有修改它们的概念。
在前一种情况下,您将数组声明为,
char str[SIZE];
分配的内存属于你的程序,可以修改。
在后一种情况下,
char* str="abcd" ; // str is a pointer to string literal, essential makes it a const char *
您正在尝试写入只读内存位置并且行为未定义。
char*
为字符串保留空间,Read Only Memory
因此您无法更改它。而char str[]
在堆栈上。类型变量的char*
行为类似const
,因此您无法更改它。
如果您创建一个array of char
=char[]
这将在包含您放入其中的符号的堆栈上保留空间 + \0
。因为它在堆栈上,所以可以写入。
但是类似char *pc = "abcd"
在程序的只读部分中创建一个字符串“abcd”。您只有一个指向只读字符串的指针,或者更确切地说const char*
。