request-free-img

C++中最令人头晕目眩的知识:指针常量、常量指针与指向常量的指针常量

引言

如果要我来评比C++中最令人头晕目眩的知识,那一定是指针常量和常量指针以及指向常量的指针常量。

大家看这几行C++代码,P1、P2、P3 三个指针,现在我问你,谁是指针常量,谁是常量指针,谁又是指向常量的指针常量?

给你3秒钟想一下。

答案解析

好,现在我告诉你答案:

p1是常量指针,常量指针可以改变指向(也就是p1可以重新赋值),但不能通过p1修改指向的值(也就*p1不可变)。

p2是指针常量,指针常量的指针本身不可变(也就是p2不能重新赋值),但可以通过p2修改指向的值(也就是*p2可变)。

p3是指向常量的指针常量,指向常量的指针常量结合了前两者,既不能改变指针的指向,也不能通过p3修改指向的值。

为什么容易越听越糊涂?

额?我说了半天,是不是像听绕口令一样,越听越糊涂?

英文名称让你瞬间秒懂

其实我把常量指针和指针常量以及指向常量的指针常量的英文名称说一下,你一定就秒懂了。

常量指针的英文名叫:pointer to constant,pointer是指针的意思,constant作名词是常数常量的意思,做形容词是恒定不变的,那么这里的意思就是一个指向常量的指针,是不是很好理解?

再看指针常量,它的英文名叫:constant pointer, constant这里做形容是恒定的,不变的,那么这里我们能瞬间明白它是一个不变的指针,是不是也很好理解?

再看指向常量的指针常量,它的英文名叫:constant pointer to constant, 结合以上,我们就知道它是一个不变的指针并指向一个常量。

是不是有种豁然开朗的感觉呢?

代码中如何快速区分?

那在代码中,如果我们看到这样的代码又如何快速的区分它们到底谁是谁呢?

其实很简单,你只要看const后边跟着谁,也就是看const用来修饰谁,例如p1的const后边是int,那么它表示不能修改指向的值,也就是pointer to constant。

p2中, const 后边是p2指针本身,那么它的意思是constant pointer, 也就是指针本身是常量。

p3中,第一个const后边是int, 第二个const后边是p3,那么就代表constant pointer to constant指向常量的指针常量。

结语

现在你学会了吗?


更多问题探讨,请关注公众号:程序员角