数据类型判断

要想弄清这些声明的含义最行之有效的办法是从右往左阅读。

《C++ Primer》如是说。

int errNumb = 0;int *const curErr = &errNumb;const double pi = 3.14;const double *const pip = π

int *const curErr = &errNumb;

离curErr最近的为const,表示curErr是一个常量对象;
接着是解引用操作符,表示curErr是常量指针;
剩下的int表示指向int类型的常量指针;

所以curErr是一个指向int类型的常量指针
pip是一个指向const double类型的常量指针

顶层const与底层const

//底层const-指针所指的对象是一个常量//顶层const-指针本身是个常量int i =0;int *const p1 =&i;//顶层const int ci =42;//顶层const int *p2 =&ci;//底层const int *const p3 =p2;//顶层const int &r =ci;//底层

一般的,顶层const可以表示任意的对象是常量。
简单理解就是只要一个变量的类型是常变量,就可以理解为顶层
(如const int a = 20)
顶层const能表示的不止是指针,底层const与指针和引用等复合类型有关

区分底层与顶层const

int *const p1 =&i;//顶层

p1是一个常量指针,指向int类型的对象,即指针本身是个常量

const int *p2 =&ci;//底层

p2是一个指针,指向int类型的常量对象,即指针指向的对象是个常量

为何会有顶层与底层的区分

我们来看下面这段代码

    int i =0;    int *const p1 =&i;//顶层    const int ci =42;//顶层    const int *p2 =&ci;//底层    i = 20;    cout << i << ' ' << *p1 << endl;//ture    *p1 = 20;    cout << i << ' ' << *p1 << endl;//true    *p2 = 50;    cout << ci << ' ' << *p2 <<endl;//err

i是一个变量,p1是个常量指针,我们对i进行重新赋值时,p1的值也跟着变化;
ci是个常变量,p2是个指针,对p2解引用重新赋值后,报错
当我们对顶层const执行拷贝操作时,基本上不会出现问题;
但底层const 的限制比较大。
熟练的区分底层与顶层const能让我们知道哪些变量可以重新赋值,哪些不能。
(☆▽☆)

©著作权归作者所有:来自51CTO博客作者小兮侑的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. 2021-03-23:给定一个正整数组成的无序数组arr,给定一个正整数值K,找
  2. Golang笔记之基本组成元素
  3. 一个Java对象究竟占用多大内存? --Java性能优化基础
  4. 排序算法——快速排序
  5. C数组实现静态链表及常用操作(模拟无指针编程语言数组实现链表)
  6. C语言——结构体和指针学习
  7. 线性表之链式存储(二)
  8. const
  9. 关于指针

随机推荐

  1. 3.Spinner
  2. Android RecyclerView 设置显示滚动条属
  3. Android 8.1 zygote创建新应用进程
  4. 关于android的广播机制里面的网络状态监
  5. Android Button字母自动全部大写的问题
  6. Android 2.2.2到Android 4.2.2源码下载地
  7. android之layout_toLeftOf和layout_toRig
  8. Android之Relative布局的相关属性解析
  9. 相关约束参数的含义
  10. Hive中的case when 的写法