c++ 中const、const_cast

本文详细解析了C++中const、volatile关键字的作用,以及const_cast的用法。重点讲解了const修饰指针的区别,展示了volatile如何影响const_cast后的指针行为。适合理解内存访问控制和类型转换的开发者阅读。

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

一 const、const_cast、volatile

  int v1 = 0;
  volatile const int v2 = 0;//必须加volatile,不让后面会出现改变值后,依然cout 出原值的情况。
  int v3 = 8;
  const int* p1 = &v1;//仅*p2为const,p1仍然为非const,仍然可以赋值。见下面赋值
  p1 = &v3;
  const int*  const p5 = &v1;//p5,*p5 均为const.

  //int* p3 = &v2;//error.无法从“const int *”转换为“int *”,因为v2 是const,*p3 是非const
  int* p4 = const_cast<int*>(&v2);//const_cast 转化得到一个新的去掉了const的指针p4,指针仍然指向v2内存。v2本身const不会变。值也不会变。只能通过*p4访问变化后的值。
  *p4 = 6;
  
  std::cout << v2 << std::endl;//v2 前不加volatile的话,debug下v2 是6,cout 出来却是0.

  int* const p6 = &v1;
  //p6 = &v1;//error,“p6”: 不能给常量赋值
  *p6 = v2;//指向的内存仍然可以赋值。

  int p7 = const_cast<int&>(v2);
  p7 = 9;

  int h = v2;

  //std::cout << p7 << " " << v2 << std::endl;
   
  int* p8 = (int*)&v2;

小结:const 放最前面修饰整个表达式的时候(const int* p),说明指针指向的内存为常量,后继不可对此内存继续赋值,但是指针本身内存是可以赋值的。const 放指针前修饰的时候(int* const p),指针本身为常量,指针后续不可赋值。

const_cast<type>(expression) 可以把type转化为不带const的变量。且仍指向原内存。

特别注意,volatile 字段对const_cast 转化后的指针的影响。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烈火音视频实验室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值