所以这是代码:
#include <stdio.h>
int main() {
char str1[] ="Hello", str2[20] ="Hi";
char *p ="Hello", *s ="Hi";
str1 = "Adieu";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
现在我的书给出了这个原因
error, constant pointer cannot change
Run Code Online (Sandbox Code Playgroud)
当我运行它时,我收到错误:
error: assignment to expression with array type
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么我的书这么说?,指针从哪里来的?
这本书是Yashavant P. Kanetkar 的Let us C 第 18 版(问题发布时的最新版本),以防您需要参考。
在行
\nstr1 = "Adieu";\n
Run Code Online (Sandbox Code Playgroud)\n该数组str
将衰减为指向数组第一个元素的指针,该元素是右值(不是左值),因此无法修改。
此行为在ISO C11 标准的 \xc2\xa76.3.2.1 \xc2\xb63中指定:
\n\n\n除非它是 sizeof 运算符、_Alignof 运算符或一元 & 运算符的操作数,或者是用于初始化数组的字符串文字,否则类型为 \'\'array of type\'\' 的表达式将被转换指向类型为“指向类型”的指针的表达式,该类型指向数组对象的初始元素并且不是左值。[...]
\n
请注意,在上面的引用中,“初始化数组”意味着在声明内对其进行初始化,而不是在声明外为其赋值(这将是“赋值”,而不是“初始化”)。
\n因此,您书中的错误消息
\nstr1 = "Adieu";\n
Run Code Online (Sandbox Code Playgroud)\n是正确的。右值无法修改,因此将其描述为“常量”并没有错。
\n但是,来自编译器的错误消息
\nerror, constant pointer cannot change\n
Run Code Online (Sandbox Code Playgroud)\n也是正确的并且可能更有用。
\n