大家好,我叫徐锦桐,个人博客地址为www.xujintong.com。平时记录一下学习计算机过程中获取的知识,还有日常折腾的经验,欢迎大家来访。
指针常量和常量指针光是这名字就让人头疼了。更何况还有细节问题要理清楚。
正文
命名
其实我们不应该这么叫它们,这只是音译过来的,这么翻译让我们的理解难上加难,这里我推荐一个命名方法,这样的命名方法又好理解,又不容易懵逼。
- 指向常量的指针------const int* p
- 本身是常量的指针------int* const p
- 所指和本身都是常量的指针------const int* const p
巧记
我有一种好的记忆方法,就是先找到星号(*),然后看它的两边,右边是对指针P本身的限定,左边是对p所指向的东西的限定。
举个例子吧。
- 1-
const int* p
,星号的右边是p,说明p就是一个普通的指针,左边是const int说明指针指向的东西是const int型的(不能修改)。但是指针是普通的,所以指针指的方向可以修改。 - 2-
int* const p
,星号的右边是const p说明指针p的方向是不能变的。而左边就是普通的int,所以指向的那个数据是可以变化的。 - 3-
const int* const p
,是指针的指向和指向的东西都不可更改。
拓展
引用和指针的关系
- 引用是一个指向不可变的、被编译器自动解引用的指针,即,引用是一个被编译器自动解引用的"本身是常量的指针"。
- 就是
int &ra = a
会自动被转化为int* const ra = &a
,将ra自动转化为*ra的过程,就是上面定义中所说的"自动解引用"。 - 那么,什么是const引用(即我们说的常量引用,但我希望大家称其为const引用而不是常量引用)呢?很显然,const int &ra=a就相当于const int* const ra=&a了。