常量指针和指向常量的指针
2015-02-15 14:17
162 查看
经常C++程序员会提到“常量指针( const pointer )”, 其实他们想表达的意思往往是“指向常量的指针(pointer to const)”。 真不幸, 这是两个完全不同的概念。
这里一定要弄清楚
C++ 中对于指针修饰符*左侧内容具有顺序无关的语法特性更是加剧了这种混淆:
以上两种方式声明指向常量的指针具有相同的效果。
出于习惯和对传统的尊重,一般我们常使用第一种方式,但是许多C++专家推荐第二种形式。 理由是第二种形式不容易被误解。 因为这种声明可以倒过来读,即
好了现在我们根据顺序无关性的语法特性,整理一下最初的代码:
这个时候只要看看
这是C语言本身的特性,而且理解起来也很直观, 因为这种转换不会带来潜在的危险,那么对于多级指针呢?
这种转化是错误的, 为什么呢?
假如我们将char* 和 const char* 分别看成一个整体,
顺便提一下下面这种转换也是不对的:
大家看到第一个const 显然修饰 T, 第二个const 修饰的对象是*, 这样
使用引用比使用一个常量指针更简单更直观,应该尽量避免使用常量指针,而应该使用引用替代。
好了最后让我们看一看如何用引用取代指向常量的常量指针
T* pt = new T; const T* pct = pt; //一个指向常量的指针 T* const cpt = pt; //一个常量指针
这里一定要弄清楚
const修饰符修饰的对象是 基础类型还是指针修饰符*.
C++ 中对于指针修饰符*左侧内容具有顺序无关的语法特性更是加剧了这种混淆:
const T *p1; T const *p2;
以上两种方式声明指向常量的指针具有相同的效果。
出于习惯和对传统的尊重,一般我们常使用第一种方式,但是许多C++专家推荐第二种形式。 理由是第二种形式不容易被误解。 因为这种声明可以倒过来读,即
const修饰的是基础类型
T,也即指向常量
T的指针。
好了现在我们根据顺序无关性的语法特性,整理一下最初的代码:
T* pt = new T; T const* pct =pt; T* const cpt = pt;
这个时候只要看看
const前面是
T还是
*就知道
const修饰的对象了。
指向非常量的指针可以转换为指向常量的指针
上面我们看到T* pt是一个普通的指向非常量的指针,它可以自动转换为指向常量的指针
T const* pct = pt;
pointer | Base Type |
---|---|
pt | T |
pct | const T |
“指向非常量的指针“的指针和“指向常量的指针”的指针
二级指针的情形比较复杂,读起来也比较拗口。 考虑如下情形:char* chr[MAX]; //chr 退化为一个“指向非常量的指针”的指针 const char **ppct = chr; //ppct是一个“指向常量的指针”的指针
这种转化是错误的, 为什么呢?
pointer | Base Type |
---|---|
chr | char* |
ppct | const char* |
typedef char* A; typedef const char* B; A* a = 0; B* b = a; //这种转换是两个不相关的指针的转换,是不对的
顺便提一下下面这种转换也是不对的:
Circle* c = new Circle; Shape* s = c; //上行转换没问题 Circle ** cc =&c; Shape **ss = cc; //这就错了
指向常量的常量指针:
const T* const cpct = pt;
大家看到第一个const 显然修饰 T, 第二个const 修饰的对象是*, 这样
cpct既是一个指向常量的指针又是一个指针常量。
常量指针和引用的关系
既然我们都知道, 常量指针指向哪里不可以改变, 这一点和引用的三大特性之一:引用所指向的对象不可以改变, 是一致的。 由此我们可以解开一个迷惑,那就是为什么C++ 代码中很少使用常量指针,而经常使用指向常量的指针。原因就是使用引用比使用一个常量指针更简单更直观。使用引用比使用一个常量指针更简单更直观,应该尽量避免使用常量指针,而应该使用引用替代。
好了最后让我们看一看如何用引用取代指向常量的常量指针
const T* const cpct = pt; const T& rct = *pt;
相关文章推荐
- 指向常量的指针和指针常量
- 深入探讨常量、指向常量的指针,常量与变量的区别
- const常量、指向常量的指针和常量指针
- 指针常量和指向常量的指针
- 指向常量的指针
- 指针常量,常指针,指向常量的常指针
- 关于指针的浅析---------多级指针,常量指针,指针常量,指向指针常量的常量指针
- 常量指针、指针常量、指向常量的指针常量
- 常量指针和指向常量的指针
- C语言中指向常量的指针和指针常量
- const常量、指向常量的指针和常量指针
- 常指针和指向常量的指针和指向常量的常指针
- 指向常量的指针常量
- 由“一个关于指针的小问题”想到的:常量指针与指向常量的指针
- (1)指向常量的指针是指一个指向常量的指针变量
- 指向常量的指针 与 常量指针
- 指向常量的指针,指针常量,void类型指针
- 常量指针、指针常量、指向常量的指针常量
- LPCSTR是指向常量的字符指针,如何将一个常量转化成一个指向常量的字符指针?
- 指向常量的指针和常量指针