关键要看const修饰的是谁:
首先一点:int const与const int的写法是一样的.
从左向右,看const离谁( 究竟是‘*’, 还是‘指针变量名’)比较近就是修饰谁的,比如
const * p :表示*p是常量,也就是*p 不可变 (暗示p可变,const没有修饰p)
* const p :表示p是常量,也就是p不可变 (暗示*p可变,const没有修饰‘*“ )
再如:
int a;
int * const p = &a //指针常量,*p可以修改*p = 8;(OK)
p不可以修改 p++(ERROR)
(本质上是个指针型的常量,此常量类型为int* const)
int a,b;
const int *p = &a;//常量指针 *p不可修改 *p = 8;(ERROR)
p 可以修改 p = &b (OK)
(本质上是个指针,它指向常量罢了)
还有一种
const int * const p = &a; // *p 和 p均不可改变了
/*常量指针的用法实例*/ |
/*指针常量的用法*/ int i1=30; |
pi的值是可以被修改的。即它可以重新指向另一个地址的,const 修饰的是整个*pi(注意,我写的是*pi而不是pi)。所以*pi是常量,是不能被赋值的.
pi值是不能重新赋值修改了,它只能永远指向初始化时的内存地址了. pi因为有了const 的修饰,所以只是一个指针常量(指向固定值),
最后总结两句:
1) 如果const 修饰在*pi前则不能改的是*pi(即不能类似这样:*pi=50;赋值)而不是指pi.
2) 如果const 是直接写在pi前则pi不能改(即不能类似这样:pi=&i;赋值)。
补充三种情况。
这里,我再补充以下三种情况。其实只要上面的语义搞清楚了,这三种情况也就已经被包含了。不过作为三种具体的形式,我还是简单提一下吧!
情况一:int * pi指针指向const int i常量的情况
//**********begin***************** |
情况二:const int * pi指针指向const int i1的情况
//*********begin**************** |
情况三:用const int * const pi申明的指针
//***********begin**************** |