深入分析指针常量、常量指针



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

最后总结两句:

    1) 如果const 修饰在*pi前则不能改的是*pi(即不能类似这样:*pi=50;赋值)而不是指pi.

   2) 如果const 是直接写在pi前则pi不能改(即不能类似这样:pi=&i;赋值)。

 

补充三种情况。

       这里,我再补充以下三种情况。其实只要上面的语义搞清楚了,这三种情况也就已经被包含了。不过作为三种具体的形式,我还是简单提一下吧!

      情况一:int * pi指针指向const int i常量的情况

 //**********begin*****************
const int i1=40;//定义了一个整型常量i1
int *pi; //定义了一个指针pi
pi=&i1;//这样可以吗?不行,VC下是编译错。
     //const int 类型的i1的地址是不能赋值给指向int 类型地址的指针pi的。否则pi岂不是能修改i1的值了吗!
pi=(int* ) &i1; // 这样可以吗?强制类型转换可是C所支持的。
   //VC下编译通过,但是仍不能通过*pi=80来修改i1的值。去试试吧!看看具体的怎样。
//***********end***************



      情况二:const int * pi指针指向const int i1的情况

 //*********begin****************
const int i1=40;
const int * pi;//定义常量指针
pi=&i1;//两个类型相同,可以这样赋值。很显然,i1的值无论是通过pi还是i1都不能修改的。
//*********end*****************

       情况三:用const int * const pi申明的指针

 //***********begin****************
int i
const int * const pi=&i;//你能想象pi能够作什么操作吗?pi值不能改,也不能通过pi修改i的值。因为不管是*pi还是pi都是const的。
//************end****************

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值