一、废话不多说,直接来结论
变量 含义 const int *p 指针p可以修改,*p不可修改 int const *p 指针p可以修改,*p不可修改 int *const p 指针p不可以修改,*p可以修改 const int * const p 指针p不可以修改,*p不可以修改
显然:const int *p 与int const *p一个意思。
速记结论:忽略类型(int),*代表取内容(解引用),变量名代表指针(p),从const位置开始,然后从左往右看,const 与谁最近,谁就不可以修改。如:对于const int *p,从左往右看,const 与 * 最近,所以*p就不可以修改,而对于int *const p,由于*在const左边,所以*无效,从左往右看,const 与 p最近,所以p不可以修改。
二、案例
1、const int *p 指针p可以修改,*p不可修改
#include <iostream> using namespace std; int main() { int a = 10; int b = 20; const int *p = &a; // 指针p可以修改,*p不可以修改 cout << "after const int *p = &a" << endl; cout << "a = " << a << endl; cout << "*p = " << *p << endl; // *p = 200; // 错误,*p不可以修改 // a = 200; p = &b; a = 200; // 正确,*p不可以修改,但是a可以修改 cout << "after p = &b, a = 200" << endl; cout << "a = " << a << endl; cout << "*p = " << *p << endl; return 0; }
2、int const *p 指针p可以修改,*p不可以修改
#include <iostream> using namespace std; int main() { int a = 10; int b = 20; int const *p = &a; // 指针p可以修改,*p不可以修改 cout << "after const int *p = &a" << endl; cout << "a = " << a << endl; cout << "*p = " << *p << endl; // *p = 200; // 错误,*p不可以修改 // a = 200; p = &b; a = 200; // 正确,*p不可以修改,但是a可以修改 cout << "after p = &b, a = 200" << endl; cout << "a = " << a << endl; cout << "*p = " << *p << endl; return 0; }
3、int * const p 指针p不可以修改,*p可以修改
#include <iostream> using namespace std; int main() { int a = 10; int b = 20; int *const p = &a; // 指针p不可以修改,*p可以修改 cout << "after const int *p = &a" << endl; cout << "a = " << a << endl; cout << "*p = " << *p << endl; *p = 100; // 正确,*p可以修改 // p = &b; // 错误,指针p不可以修改 cout << "after *p = 100" << endl; cout << "a = " << a << endl; cout << "*p = " << *p << endl; a = 200; // 正确,*p可以修改,但是a也可以修改 cout << "after a = 200" << endl; cout << "a = " << a << endl; cout << "*p = " << *p << endl; return 0; }
4、 const int * const p 指针p不可以修改,*p不可以修改
#include <iostream> using namespace std; int main() { int a = 10; int b = 20; const int *const p = &a; // 指针p不可以修改,*p不可以修改 cout << "after const int *p = &a" << endl; cout << "a = " << a << endl; cout << "*p = " << *p << endl; // *p = 100; // 错误,*p不可以修改 // p = &b; // 错误,指针p不可以修改 a = 200; // 正确,*p不可以修改,但是a可以修改 cout << "after a = 200" << endl; cout << "a = " << a << endl; cout << "*p = " << *p << endl; return 0; }
三、总结
速记结论:忽略类型(int),*代表取内容(解引用),变量名代表指针(p),从const位置开始,然后从左往右看,const 与谁最近,谁就不可以修改。如:对于const int *p,从左往右看,const 与 * 最近,所以*p就不可以修改,而对于int *const p,由于*在const左边,所以*无效,从左往右看,const 与 p最近,所以p不可以修改。
记住这个结论以后,再也不怕const修饰的指针了。