指向const的指针和const指针

1 int i = 0;
2 const int *p1 = &i;
3 int const *p2 = &i;
4 int *const p3 = &i;

上述代码中的p1和p2都是指向const的指针,表示指针指向的地址里的内容不可修改,*p1 = 1;会编译不过;p3则是const指针,表示p3指向的地址不可修改,p3 = NULL;会编译不过。

1 int i = 0;
2 typedef int *PINT;
3 const PINT pInt = &i;
4 *pInt = 1;

上述代码中的pInt变量是const指针,而非指向const的指针,使用PINT类型是声明不出指向int类型的const指针的。

1 int i = 0;
2 PINT const pInt = &i;
3 vector<int*> vecInt;
4 vecInt.push_back(pInt);
5 const int *pInt2 = &i;
6 vecInt.push_back(pInt2);

以上代码的第6行编译不过,原因如下:

stl中的vector的push_back方法的原型是“void push_back(const _Ty& _X)”,但是VC给出该函数的原型提示是void push_back(const int * &_X);这两个其实是不同的类型,此时的_Ty其实就是typedef int *_Ty;所以push_back的参数类型是int*类型的const引用,期待的是一个指针或const指针,便是pInt2则是指向const的指针,指向const的指针不会隐式转换为const指针或指针,所以编译出错。

 

1 const int **p = (const int**)0x40000000;
2 *p = (int*)3;
3 **p = 3;

上述代码的第三行编译不过,可见const修饰的是最内层指针指向的内容。

如果写成 

1 typedef int *PINT;
2 const PINT *p = (PINT*)0x40000000;
3 **p = 4;
4 *p = (PINT)3;

则是第4行编译不过了,读者可以验证一下。

posted on 2013-02-17 21:33  莫贰  阅读(193)  评论(0编辑  收藏  举报

导航