如何快速判断const修饰的内容是否可变.

本文介绍了C++中const修饰符的使用,通过分析`const`在不同位置的作用,详细讲解了如何判断const修饰的是变量的值还是指针本身,以及其对可变性的影响。总结了四种情况:值不可变、地址不可变但值可变、值和地址都不可变。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


0x00 const * ?

首先先看下面这几条语句:

  1. const int *p
  2. int const *p
  3. int *const p
  4. const int *const p

接下来我们来思考一下,这四条语句的const分别修饰那个呢?

0x01 变量类型

我们都有使用指针变量的时候,那么我们是把*放在哪呢?
比如 int *p 还是 int* p ?
虽然这两种写法都能够表示声明一个名称为pint类型的指针
我在Google-c++ 编码风格指南 上也看到*贴哪边都可以

在声明指针变量或参数时, 星号与类型或变量名紧挨都可以

	// 好, 空格前置.
	char *c;
	const string &str;

	// 好, 空格后置.
	char* c;
	const string& str;

他们就真的没什么区别吗?
其实可以这样来理解:
我们写出一个变量声明int *p
把他的左边部分当作他存放的数据的类型 也就是int右边当作这个int的代号也就是*p
那么以后我们就这样来分
类型 名称
(int) (*p)
那么*p的数据类型就是int
好另一个写法
int* p
同样来这样分
(int*) (p)
那么 p的数据类型就是int*了 也就是指针


0x02 如何区分const的修饰对象

ok 我们能够鉴别出类型之后,接下来我们就要看看前面给出的4条语句
首先是const int *pint const *p
他们两个的*都是贴变量名的 那为啥会有两种写法?
先来看看const修饰符都修饰哪个类型.
const int *p 里的const是修饰int的,也就是说这个int值不可以改变
int const *pconst是修饰*p的 , 而*p的类型是int 也就是说const修饰的是int , 那也是跟上面的一样int值不可变


地址不可改变
好我们看看int *const p 这样写我们用之前的区分类型的方法来试试
(int*) const (p) 好 我们发现 p 的类型是int* 是个指针 这个指针是一个放地址的变量
很明显 const修饰的是p 也就是修饰的类型是int* 也就是这个指针不可变 就是地址不可变
虽然地址不能改变,但是地址指向的int值是可以变的 毕竟const修饰的只是一个地址而已.


我想地址不可变, 值也不可变该如何写呢?
是的,只要const修饰谁,谁就不可变, 我们只要把这两个都给修饰了就可以了
const int *const p
这里就跟我们之前讲的有点出入了.
先进行类型分析
const (int*) const (p) 按照理论应该是这样划分的呀? 可这两个const看起来都在修饰int*类型呀.
其实这里应该这样来分
(const int) *(const p) 这样写虽然不是很正确,不过好理解 const是修饰int*(const p)int类型
const pp又是int* 也就是说 const既修饰int的值 又修饰int*地址
这就做到了地址不可变, 值也不可变


0x03 总结

  1. const int *p : 值不可变
  2. int const *p : 值不可变
  3. int *const p : 地址不可变, 那个地址的值可以变
  4. const int *const p : 地址和值都不可变
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值