没画完的画

喂马 劈柴 BBQ~
posts - 37, comments - 55, trackbacks - 0, articles - 0
  C++博客 ::  :: 新随笔 :: 联系 :: 聚合  :: 管理

CONST、TYPE 和 星号 的故事

Posted on 2008-10-04 00:10 没画完的画 阅读(1728) 评论(2)  编辑 收藏 引用 所属分类: C++
void main()
{
    
/**
     * 非常量指针, 是指向常量数据的指针
     
*/

    
{
        
const char  *p1;
        
        
char a = 20;
        
char b = 20;
        p1 
= &a;
        
// *p1 = 10;   出错, 不能改变 p1 指向的内容
        p1 = &b;     //正确, 可以改变 p1 本身的内容
    }


    
/**
     * 非常量指针, 是指向常量数据的指针
     * 跟 const char  *p1; 相同
     
*/

    
{
        
char const *p2;
        
char a = 20;
        
char b = 20;
        p2 
= &a;
        
// *p2 = 10;   出错, 不能改变 p1 指向的内容
        p2 = &b;     //正确, 可以改变 p1 本身的内容
    }


    
{
        
/**
         * 常量指针, 但并非指向常量数据 的指针
         
*/

        
char a = 20;
        
char b = 20;
        
char * const p3 = &a; // 由于是常量指针, 故需要在初始化时赋值, 之后不能改变

        
// p3 = &b; // 出错, p3 是常量指针, 不能改变它的值
        *p3 = 30;   // 但 p3 指向的内容不是常量, 可以进行改变
    }


    
// [const] [类型] [星号]
    
// 123 [const] [类型] [星号]     const int *
    
// 132 [const] [星号] [类型]     const * int
    
// 213 [类型]  [const] [星号]    int const *
    
// 231 [类型]  [星号] [const]    int * const
    
// 312 [星号]  [const] [类型]    * const int
    
// 321 [星号]  [类型]  [const]   * int const
    {
//        const int * p1;     // 上面第一种 非常量指针, 是指向常量数据的指针
//        const * int p2;
//        int const * p3;     // 上面第二种 非常量指针, 是指向常量数据的指针
//        int * const p4 = 0; // 上面第三种, 常量指针, 但并非指向常量数据 的指针
//        * const int p5;
//        * int const p6;
    }


    
// 只剩下 const* int p2; 了
    {
        
// warning C4518: 'int ' : storage-class or type specifier(s) unexpected here; ignored
        
// 'int': 此处不应出现存储类或类型说明符;已被忽略
//        const* int p2;
//        int a = 20;
//        p2 = &a;
//        *p2 = 30;  // 此处会出错, 不能修改 p2  所指向的地址的值, 故是指向常量的指针
        
        
// 编译器将 const * int p2;  相当于 const int *p2   // 
    }


    
// 总结
    
// const int * p1;     // 上面第一种 非常量指针, 是指向常量数据的指针
    
// const * int p2;     // 相当于 const int *p2; 指向常量数据的指针 // 但编译器会出警告
    
// int const * p3;     // 上面第二种 非常量指针, 是指向常量数据的指针
    
// int * const p4 = 0; // 上面第三种, 常量指针, 但并非指向常量数据 的指针

    
// 将它们分类
    
// const int * p1;     // 上面第一种 非常量指针, 是指向常量数据的指针    
    
// int const * p3;     // 上面第二种 非常量指针, 是指向常量数据的指针
    
// const * int p2;     // 相当于 const int *p2; 指向常量数据的指针 // 但编译器会出警告

    
// int * const p4 = 0; // 上面第三种, 常量指针, 但并非指向常量数据 的指针

    
// 可以得出
    
// const 只要在 * 号前,无论星号在什么位置,  const 是修饰指向的数据类型,所以是 指向常量数据的指针, 但 * 号摆中间会有 C4518 警告
    
// const 只要在 * 号后,只有一种,这时, const 修改指针本身,是一个指针常量

    
{
        
// 如果是
        int * const * p = 0;

        
// 那就是指向 常量 的指针常量了 
    }


}



Feedback

# re: CONST、TYPE 和 星号 的故事   回复  更多评论   

2008-10-04 16:22 by 陈梓瀚(vczh)
unittype -> "int" '数据类型
unittype -> "const" unittype '数据是常量类型
ptrtype -> unittype
ptrtype -> ptrtype "*" '指针类型
ptrtype -> ptrtype "*" "const" '指针是常量类型

为什么需要最后一项呢?其实根据表达式的一般设计,需要优先级什么的加一个括号就行了。也就是说int*const原本可以写成const(int*)。的可惜TM函数指针又是那个鸟样,所以就搞得这么复杂了。

上面的语法安排是优先级组合的典型写法,也就是说这里前缀比后缀优先级更高。因此const int*就是(const int)*。

# re: CONST、TYPE 和 星号 的故事   回复  更多评论   

2008-10-06 10:10 by pengshan
可以这么看:以*为界,const在*前的是限定*p,在*后面的是限制p。前者限定p指向的值,后者限定指针p。

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理