为什么不重新分配指向 const int 的指针会导致编译错误?

Val*_*hok 0 c pointers

这是一个来自测试的问题。

int main() {
  const int i=1;
  const int *p=&i;
  int j=2;
  const int *q=&j;
  j=3;
  printf("%d", *p+*q);
  int k = 0;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

据我了解,双方pq都指向一个const int

我认为当我声明指向非常量值的指针时会出现编译错误,但它工作正常;这是为什么?

klu*_*utt 5

我认为当我将 q 指针声明为非常量值时会出现编译错误,但它工作正常;这是为什么??

制作这个无效的代码真的没有意义。如果用普通指针指向,则可以读写。使用 const 您只能读取,但它是相同的底层类型,因此如果您通过常规指针或指向 const 的指针读取变量,实际上不会出现任何问题。这就像无法从您以只读方式安装的文件系统中读取文件,仅仅因为文件本身没有写保护。

使用指向 const 的指针指向非常量变量有效地创建了一个只读接口,这是有意义的。它通常用于将指针作为参数的函数,但您想表明该函数不会更改内容。例如

char *strcpy(char *dest, const char *src);
Run Code Online (Sandbox Code Playgroud)

此库函数读取src和写入dest.

但是,相反会给出警告:

const int i=2;
int *p = &i;
Run Code Online (Sandbox Code Playgroud)

这产生了:

warning: initialization discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]
Run Code Online (Sandbox Code Playgroud)

这是完全有道理的,否则你可以很容易地修改一个常量。