Const and Pointer - 限定符const同指针的结合使用

来源:互联网 发布:淘宝活动代报名 编辑:程序博客网 时间:2024/06/16 12:51

一、一维指针


1. 当a为变量时,const指针3种用法
    (1)const  int  *p = &a;(或写作int  const  *p = &a;)    
        *p值不能改变,a的值可以改变
    (2)int  *const  p = &a;
        p值不能改变, a的值可以改变
    (3)const  int  *const  p = &a;
        *p值和p值都不能改变,a的值可以改变 


2. 当a为常量时,const指针3种用法
    (0)const int a = 20;    //设a为常量,于是以下各句中,a的值都不能改变
    (1)int *p=&a;
        错误。左边为int*型,右边为const int*型,两边不匹配
    (2)const  int  *p = &a;(或写作int  const  *p = &a;) 
        正确。类型匹配。*p值不能改变
    (3)int  *const  p = &a;
        错误。左边为int *const型,右边为const int*型,两边不匹配
    (4)const  int  *const  p = &a;
        正确,多加了一个const,形成*const,使指针所指地址不得改变。*p值和p值都不能改变 


3. 分析方法
    一般来说,你可以在头脑里画一条垂直线穿过指针声明中的星号(*)位置:
        如果const出现在线的左边,指针指向的数据为常量;
        如果const出现在线的右边,指针本身为常量;
        如果const在线的两边都出现,二者都是常量。
e.g.:
    (1)char  *p  =  "hello";  
        非const指针, 非const数据
    (2)const  char *p   =  "hello";  
        非const指针, const数据
    (3)char * const p  =  "hello";  
        const指针, 非const数据
    (4)const char * const p =  "hello"; 
        const指针,const数据 
  
二、二维指针


    (1) const char **p;
        p[i]的值可变,而p[i][j]的值不可变。
    (2) char * const *p;
        p[i]的值不可变,而p[i][j]的值可变。
    (3) const char * const *p;
        p[i]的值不可变,p[i][j]的值也不可变。 


    由此可见,第三种对于接收参数的一方而言,是最为严厉的限制。在设计接口时,这类限制有助于减少程序中的潜在问题,但却会使使用现有接口的一些程序出现错误。许多公开的标准,特别是POSIX,往往会出于这种考虑而选择char * const *。在设计程序时,对于这种char * const *,应当作const char * const *看待,而不应abuse其p[i][j]可写的特性。 

Reference:
1. http://blog.csdn.net/rhzwan123/archive/2008/03/29/2227643.aspx
2. http://blog.delphij.net/archives/001491.html

原创粉丝点击