C++: 《三兄弟三姐妹之:指针常量、常量指针、常量指针常量》
文章目录
一.这三个玩意是个嘛(我愿称之为"常量三流氓", 因为不好区分)?
- 指针常量: 它的主语是"常量"("指针"是定语, 修饰常量), 意思就是, 它是一个常量, 这个常量数据类型是指针, 其特点是: 指针指向的值(地址)不可变, 但是指针所指向的对象的状态(比如字段的值)可变。
- 常(量)指针:它的主语是"指针"("常量"是定语, 修饰指针), 意思就是, 它是一个指针, 这个指针指向了一个常量, 其特点是: 指针指向的值(地址)可变, 但是指针所指向的对象的状态(比如字段的值不)可变。
- 常指针常量(指向常量的常量指针): 本质是一个指向常指针的常量, 指向和值都不可变。
二.让我看看这语法是这么个事儿
- 指针常量:type_name* const variable 例如: int* const p;
- 常量指针: type_name const *variable or type_name const *variable
- 例如: int const *p ; or const int *p;- 常指针常量: const type_name* const variable or const type_name const *variable
- 例如: const int const p; or int constconst p;*
三. 说了这么多, 怎么记下来啊? | How to memorize?
在这个背景下(与"int *p , int* p, int * p"这种不一样, 看靠下面"豆包", 那部分), 可以把*p理解为指针所指向的对象, p可以理解为指针本身, 然后在int* const p中, const直接修饰p, 所以指针指向不可变, 对象状态可变,它是指针常量, 而int const *p中, const 直接修饰*p所以指针的指向可变, 所指对象的状态不可变, 常量指针.
- const type_name / type_name const这个顺序不是很重要.
- 进一步来讲, 常量指针常量首先是指针常量所以它应该有个*“int* const p”, 其次它的值不变(还有一个"常量"), 所以它应该是 const int* const p, 或者是int const*const p
四.看官看这里, 来自豆包(抖音家的AI)的答案
问题(1): p表示指针?*p表示指针指向的对象?
答案:
通常情况下,可以这样理解:在 C++ 中,p
表示指针变量,它存储了一个内存地址。而*p
用于访问指针所指向的对象。例如,如果有int a = 10; int *p = &a;
,这里的p
是指向变量a
的指针,*p
就表示a
这个对象
问题(2): 我的意思是前者中无论是int* p、int * p、int *p, 只能表示指针, 但后者中*p表示指针所指向的对象(而不是指针本身), p表示指针本身吗?
答案:
您的理解在一定程度上是正确的。在int* p
、int * p
、int *p
这几种普通指针的声明中,p
表示指针本身,*p
表示指针所指向的对象。而在int* const p
中,p
是指针本身且其指向不能更改,*p
表示所指向的对象。在int const *p
中,p
是指针本身且其指向可以更改,*p
表示所指向的对象,但不能通过*p
来修改对象的值。