请找出下面程序中有哪些错误:
int main(){ int i = 10; int j = 1; const int *p1;//(1) int const *p2 = &i; //(2) p2 = &j;//(3) int *const p3 = &i;//(4) *p3 = 20;//(5) *p2 = 30;//(6) p3 = &j;//(7) return 0; }
const int *p1;//(1) 关键字const出现在星号左边 表示被指物是常量,而指针不是常量,可以不必须初始化 intconst*p2=&i; //(2)ok ,p2被取i的地址 p2=&j;//(3)ok,p2取j的地址 int*constp3=&i;//(4) 出现在星号右边,表示指针自身是常量,必须初始化,这里初始化为i的地址,不允许修改 *p3=20;//(5)ok,修改p3所指向的内容, *p2=30;//(6)被指物是常量 error! p3=&j;//(7) 指针自身是常量 error!
//总结看来,const在*前时,指向的内容不可变;const在*后时,指向地址不可变,且初始化时需要初始值设定项。 int a = 1, b = 2, c = 3; const int *p1 = &a; p1 = &b; *p1 = 4;//表达式必须是可修改的左值 int const *p2 = &b; p2 = &c; *p2 = 5;//表达式必须是可修改的左值 int *const p3 = &c;//p3需要初始值设定项 p3 = &a;//表达式必须是可修改的左值 *p3 = 6;
const int a; int const a; 这两个写法是等同的,表示a是一个int常量。
const int *a; 表示a是一个指针,可以任意指向int常量或者int变量,它总是把它所指向的目标当作一个int常量。也可以写成int const* a;含义相同。
int * const a; 表示a是一个指针常量,初始化的时候必须固定指向一个int变量,之后就不能再指向别的地方了。
int const * const a; const既修饰 *a 又修饰 a 因此两者都是不可改变的。也可以写成const int* const a;含义相同。
总结:遇到int const 都换成 const int ,在有指针的情况下:
1)const 紧贴指针变量前面,表示修饰该变量为常量,即指针本身为常量。