C/C++判断数据类型与顶层const与底层const的区分
16lz
2021-03-24
数据类型判断
要想弄清这些声明的含义最行之有效的办法是从右往左阅读。
《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能让我们知道哪些变量可以重新赋值,哪些不能。
(☆▽☆)
更多相关文章
- 2021-03-23:给定一个正整数组成的无序数组arr,给定一个正整数值K,找
- Golang笔记之基本组成元素
- 一个Java对象究竟占用多大内存? --Java性能优化基础
- 排序算法——快速排序
- C数组实现静态链表及常用操作(模拟无指针编程语言数组实现链表)
- C语言——结构体和指针学习
- 线性表之链式存储(二)
- const
- 关于指针