浅谈常量指针与指针常量(一)

2014-07-19 22:53:02 · 作者: · 浏览: 210

  关键要看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 的修饰,所以只是一个指针常量(指向固定值),