网上很多人已经写过关于指针用法文章,对于指针,我结合一些具体的实例,写一点自己的看法。
第一篇:const int * p和int * const p
这个问题是老生常谈的问题,但我还是有很多人到真正使用的时候就犯迷糊,希望看过如下的解释,能够彻底明白。
首先,我们要牢记一点:const在*前是修饰指针所指向的变量,const在*之后是修饰定义的指针本身。
const本身起到的修饰作用是“常量”。例如const int *p,const修饰的是*p,也就是指针p所指向的值必须是个常量;而int * const p,const修饰的是指针p本身,也就是指针p必须是个常量。请看例子example01和example02:
- /*VC++6.0 IDE*/
- //example01
- int main(int argc, char* argv[])
- {
- int a = 12;
- const int * p = &a;
- *p = 0; //将指针p指向的值修改为0,编译会报错:error C2166: l-value specifies const object
- return 0;
- }
-
- //example02
- int main(int argc, char* argv[])
- {
- int a = 12;
- int b = 10;
- int * const p = &a;
- *p = 0; //正确
- p = &b; //将指针p本身的值修改为&b,编译会报错: error C2166: l-value specifies const object
- return 0;
- }
通过上面的例子,可以看到const修饰的作用。但是是不是const int *p定义的指针p指向的值永远不能改变?否!请看下面例子:
- /*VC++6.0 IDE*/
- //example03
- int main(int argc, char* argv[])
- {
- int a = 12;
- const int * p = &a;
- //*p = 0; //将指针p指向的值修改为0,编译会报错:error C2166: l-value specifies const object
- a = 0; //不能通过*p = 0来修改p指向的值,但是可以通过这样的方法进行修改
- cout << *p << endl; //打印出0
- return 0;
- }
- 而int * const p定义的指针p本身的值也不可以改变呢?是的。一旦初始化赋予a的址值,此时int * const p中的指针p本身值就再也不能改变了。
- 经过上面一番周折,现在可以很容易理解const int * const p的意思了吧。它定义的是一个指向常量值的常量指针。我想我也不必多费口舌了。