参诸文籍, 带你深入理解常(量)指针, 指针常量, 常(量)指针常量的声明.
⭐️本文参考了一些文章, 已置于页脚.🌟
⭐️同时推荐我的另一篇博客《参诸文籍, 带你深入理解C/C++复杂指针声明》🌟
⭐️我的微信公众号:Noah Miller
, 希望关注支持一波! 🌟
文章目录
1. 引言
- 一般来说, 大家都能理解
const
应用在变量上可致变量值不可改,但是如果这个变量是指针的话, 究竟是指针的指向不可改还是, 所指地址上的值不可改? - 大家有没有被
常(量)指针
,指针常量
,常(量)指针常量
(后文简称`“三兄弟”)的声明语法迷惑到?
⭐️Motivation | 创作动机
🌟: 我发现, 网上很多相关文章都只是讲解了三兄弟
的概念和记忆口诀, 我感觉仅仅这样不是很好理解这种声明语法的逻辑.
⭐️Aim | 创作目的
🌟:本文旨在通过分享, 我阅读相关文章后对声明语法的理解, 为大家讲清楚这个声明语法究竟是怎么回事?
2. 关于 三兄弟
🌟认真看代码!!!🌟
// 声明一个演示用的变量
int for_demo = 520;
// 1. 常量指针 (两种形式)
// p = &for_demo; -> 可 | *p = for_demo; -> 不可
const int * p;
int const * p;
// 指针常量 (一种形式)
// p = &for_demo; -> 不可 | *p = for_demo; -> 可
int * const p;
// 常指针常量 (两种形式)
// p = &for_demo; -> 不可 | *p = for_demo; -> 不可
const int * const p;
int const * const p;
常量指针
: 指针本身是一个常量, 指向的地址的值是变量, 其指向不可变, 指向的地址上的值可以改.指正常量
: 指针本身是一个变量, 指向的地址的值是常量, 其指向可变, 指向的地址上的值不可变.常量指针常量
: 指针本身是一个常量, 指向的地址的值也是常量, 其指向不可变, 指向的地址上的值不可变.
3. 理解方式
1) 关于 const
const
在默认情况下应用在左方最近元素,int * const p
这里的const
就是应用在了*
上.- But, 如果
const
左方没有元素, 就把const
应用在右方最近元素,const int * p;
这里的const
就应用在了int
上.
2) *和 type_name 的意义
Note
: 为了方便理解, 我们认为在三兄弟的声明语法中,*
和typename
是具有特殊意义的.
*
在这里我们可以理解为指针的指向.type_name
可以理解为指针指向地址上的值.
4. 学费了, 应用一下
看完上面的理解方式, 我们可以很容易看出来.
const int * p;
和int const *p;
中的const
都是应用在了int
上, 即,常量指针
.int * const p;
中的const
应用在了*
上, 即指针常量
.const int * const p;
和int const * const p;
中, 第一个const
应用在了int
上, 第二个const
应用在了*
上, 即常量指针常量
5. 相关资料
- 《The C++ ‘const’ Declaration: Why & How》By Andrew Hardwick
- 《How to interpret complex C/C++ declarations》By
Vikram A Punathambekar