需要帮助来理解我书中的错误示例的含义

Pap*_*ane 5 c compiler-errors

所以这是代码:

#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 版(问题发布时的最新版本),以防您需要参考。

And*_*zel 5

在行

\n
str1 = "Adieu";\n
Run Code Online (Sandbox Code Playgroud)\n

该数组str衰减为指向数组第一个元素的指针,该元素是右值(不是左),因此无法修改。

\n

此行为在ISO C11 标准的 \xc2\xa76.3.2.1 \xc2\xb63中指定:

\n
\n

除非它是 sizeof 运算符、_Alignof 运算符或一元 & 运算符的操作数,或者是用于初始化数组的字符串文字,否则类型为 \'\'array of type\'\' 的表达式将被转换指向类型为“指向类型”的指针的表达式,该类型指向数组对象的初始元素并且不是左值。[...]

\n
\n

请注意,在上面的引用中,“初始化数组”意味着在声明内对其进行初始化,而不是在声明外为其赋值(这将是“赋值”,而不是“初始化”)。

\n

因此,您书中的错误消息

\n
str1 = "Adieu";\n
Run Code Online (Sandbox Code Playgroud)\n

是正确的。右值无法修改,因此将其描述为“常量”并没有错。

\n

但是,来自编译器的错误消息

\n
error, constant pointer cannot change\n
Run Code Online (Sandbox Code Playgroud)\n

也是正确的并且可能更有用。

\n