这是一个来自测试的问题。
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)
据我了解,双方p并q都指向一个const int。
我认为当我声明指向非常量值的指针时会出现编译错误,但它工作正常;这是为什么?
我认为当我将 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)
这是完全有道理的,否则你可以很容易地修改一个常量。