通过声明
const int i;
很明显i
无法修改
那么为什么宣言
void f (const int *p)
正在修改p
? (我测试了它,它正在修改p
但不知道怎么做?)。
答案 0 :(得分:7)
const
在指针声明中的位置很重要。你向后看了它:
const int *p
表示“p是指向int
的指针,它是常量”int * const p
表示“p是指向int
”的常量指针const int * const p
表示“p是指向常量int
”的常量指针答案 1 :(得分:3)
由于const
指向int
p
,而p
指向int
,指向const int *p
。
p
表示const int
是指向p
的指针,*p
可以修改,int *const p
不是。
同样的方式
p
表示无法修改*p
,而const int* p
可以修改。
请注意,int const* p
与int const *p
相同。
简单的规则是声明从右向左读取:int *const p
表示“p是指向常量int的指针”,{{1}}表示“p是指向int的常量指针”。
(实际的完整规则更复杂,您可以使用http://cdecl.org/来“解码”C风格的声明。)
答案 2 :(得分:3)
因为在此表达式中,p
是指向const int
的指针。这意味着您可以更改p
指向的内容。
这也意味着,“p”本身可以修改,但“p”的内容无法修改,因此*p = 10;
将产生错误。
一个例子将清除事物:
#include <stdio.h>
void foo(const int *p)
{
int x = 10;
p = &x; //legally OK
// *p = 20; <- Results in an error, cannot assign to a read-only location.
printf("%d\n",*p);
}
int main(int argc, char *argv[])
{
const int x10 = 100;
foo(&x10);
return 0;
}
使上述程序完全不修改指针:
#include <stdio.h>
void foo(const int *const p)
{
int x = 10;
p = &x; //legally NOT OK, ERROR!
// *p = 20; <- Results in an error, cannot assign to a read-only location.
printf("%d\n",*p);
}
int main(int argc, char *argv[])
{
const int x10 = 100;
foo(&x10);
return 0;
}