关键要看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;
int i2=40;
const int * pi=&i1;//定义常量指针,*pi不可以改变,pi可以改变
pi=&i2; //4.注意这里,pi可以在任意时候重新赋值一个新内存地址
i2=80; //5.想想看:这里能用*pi=80;来代替吗 当然不能
printf( “%d”, *pi ) ; //6.输出是80
/*指针常量的用法*/
int i1=30;
int i2=40;
int * const pi=&i1;
//pi=&i2; 4.注意这里,pi不能再这样重新赋值了,即不能再指向另一个新地址。
i1=80; //5.想想看:这里能用*pi=80;来代替吗 可以,这里可以通过*pi修改i1的值。
printf( “%d”, *pi ) ; //6.输出是80
pi的值是可以被修改的。即它可以重新指向另一个地址的,const 修饰的是整个*pi(注意,我写的是*pi而不是pi)。所以*pi是常量,是不能被赋值的.
pi值是不能重新赋值修改了,它只能永远指向初始化时的内存地址了. pi因为有了const 的修饰,所以只是一个指针常量(指向固定值),