1 int a = 1; 2 int b = 2; 3 4 const int * p1 = &a; 5 int* p2 = &b; 6 7 p2 = p1; // 提示有错
8 p1 = p2; // 提示正确
9 cout << *p2 << endl;
我的理解如下:既然p1指向的内容是const的,那么不能改变p1指向的值?那么p1 = p2应该是不行的? p2 = p1应该是可以的?
这是规定。你上面的代码里,如果p1的值能赋值给p2,那p1的const限定就没什么意义了。
int main(char argc, char* argv) { int a = 1; int b = 2; const int * p1 = &a; int* p2 = &b; // p2 = p1; // 提示有错 // cout << *p2 << endl; p1 = p2; cout << *p1 << endl; system("pause"); return 0; }
p1 = p2 居然可以,p2 = p1不行。
我觉得既然p1指向的内容是const的,p1 = p2应该是不行的? p2 = p1应该是可以的?
@赢定: p1指向的内容是const的,但p1不是,所以p1可以被修改,如果希望p1不能被修改应该定义 int* const p1; 指针指针常量与常量指针的区别在于const限定的是哪个部分,如果定义const int* const p1,那么p1与p1所指向的内容都不可以修改。
是不是:
int* const p1 p1不能变, p1 指向的值可以变
const int *p1 p1 可以变,p1 指向的值可以变
学到了,感谢
这段代码中,因为p1指向的值是不可以改变的,p2指向的int值可以改变。
如果把p1赋值给p2,那么p1就有被改变的可能性,这和上述的性质相违背,所以不可以如此赋值。
如果p2 = p1;可以
那么p1指向的int值就可以通过p2来修改了。
附一篇帖子,effective c++ 中关于const的
http://www.cnblogs.com/danshenmaogou/p/6384546.html
常量指针和指针常量的区别:
int a;
int * const p = &a //指针常量,*p可以修改*p = 8;(OK)
p不可以修改 p++(ERROR)
int a,b;
const int *p = &a;//常量指针 *p不可修改 *p = 8;(ERROR)
p 可以修改 p = &b (OK)
还有一种
const int * const p = &a; // *p 和 p均不可改变了
Thank you so much!!
const 后面的是常量,不能更改
在拷入拷出中,可以忽视顶层const,但必须考虑底层const,如果p2 = p1合法,那么p1指向的内容存在被修改的风险,违背了底层const,参考自C++ Primer 中文第五版 第58页。
1,const int是指这个指针指向的内容不可变,int const是指这个指针自己不可改变。
2,如果这样做,因为const int和int在C++视作两种类型。
p1=p2没有错,因为p1是指针本身,可变。
p2=p1报错,因为p2指向p1而p2是可变的变量,因此这样写,p2会有被篡改的风险。
(p1是只读的,而*p2是可变的。)
3,真的要做,请使用强制类型转换。
补充:全局变量的const,即使使用强制类型转换,使得不报错,在运行时还会segmentation fault。