zoukankan      html  css  js  c++  java
  • 【C++Primer笔记】顶层const、常量指针

    之前对到底怎样写是常量指针(顶层const),怎样写不是,怎样写又是语法错误很糊涂,现在做个笔记。

    《C++ Primer》原文:很多程序员容易迷惑于基本数据类型和类型修饰符的关系,其实后者不过是声明符的一部分罢了。

    个人理解:int是基本数据类型,*是类型修饰符,*p是声明符。

    先总结一下各种情况:

     1 int const *p1;//正确,是指向常量的指针
     2 
     3 const int *p1;//正确,是指向常量的指针
     4 
     5 int *const p1;//错误,常量指针必须初始化
     6 
     7 *const int p1;//语法错误
     8 
     9 *int const p1;//语法错误
    10 
    11 const* int p1;//语法错误,以上是*、const和int的六种排列组合
    12 
    13  
    14 
    15 using iptr=int*;
    16 
    17 const iptr p1;//错误,常量指针必须初始化
    18 
    19 iptr const p1;//错误,常量指针必须初始化
    20 
    21  
    22 
    23 using cptr=const*;//实际上等价于using cptr=const int*;
    24 
    25 cptr p1;//正确,是指向常量的指针
    26 
    27 int cptr p1;//语法错误
    28 
    29 cptr int p1;//语法错误
    30 
    31  
    32 
    33 using cptr= *const;//语法错误
    34 
    35 using iptr= *int;//语法错误

     综上,可知const直接修饰右边的声明符:

    int const *p1;const int *p1;

    两句中的const都是修饰*p1,也就是说*p1不可变,但p1可以变,指针指向的值不可变,指针指向的内存地址可变

    int *const p1;

    这里const修饰p1,所以是常量指针

    using iptr=int*;const iptr p1;

    这里的const和上一例一样

    其实迷糊的根本就在于当初学的时候

    int *p=0;

    这一行代码没彻底弄明白

    对于*而言,*自己觉得自己就是来提醒一下p你是用来存储内存地址的,这时候*是类型修饰符

    而对于int而言,int觉得自己是修饰*p的,所以p指向的内存里面必须存储int类型的变量,这时候*是解引用符

    同样,const修饰p,就成了常量指针,修饰*p,就成了指向常量的指针。

    不管是什么const int* p还是int *const p,只要看清楚*和变量名能不能黏到一块去,或者说前面的类型说明符到底是修饰*p还是p的,就能弄清楚含义了

    今天下午开工了个如何理清楚逻辑的一点感想,对于这篇文章而言,思路清晰的关键就是要知道*在一行代码里的两种含义。

    又想到了一点:

    《C++ Primer》里面提到所谓指向常量的指针,只是指针以为自己指向的是常量,所以拒绝通过解引用的方式改变指向的对象的值,但实际上那个对象是不是常量,指针表示无所谓

    结合https://blog.csdn.net/simba228/article/details/6804083中所说:

    ”const 推出的初始目的,正是为了取代预编译指令,消除它的缺点,同时继承它的优点。“

    于是一切都豁然开朗起来:

    我define了pi是3.14,但是我在代码里面还是可以写c=3.14*d;

    我定义了一个指向常量的指针,但天知道那个指针指向的对象到底是不是常量呢~

    说不定对象的心早就变了,可怜的底层const还在以为自己指向的是常量······

    在这里我们为底层const默哀一秒,祝天下渣男渣女原地爆炸(笑)~~~~~~~

  • 相关阅读:
    HeadFirst设计模式C++实现-AbstractFactory模式
    Head First设计模式C++实现Singleton模式
    系统程序员成长计划动态数组(三)(上)
    一种OPENSSL_Uplink(100F2010,05): no OPENSSL_Applink解决方法
    系统程序员成长计划动态数组(四)
    Head First设计模式C++实现Command模式
    EJB>事务管理服务 小强斋
    EJB>事务管理服务 小强斋
    EJB>实体继承 小强斋
    EJB>事务管理服务 小强斋
  • 原文地址:https://www.cnblogs.com/MirrozSigmaMax/p/13429682.html
Copyright © 2011-2022 走看看