当前位置: 首页 > news >正文

const 指针

const (常量) 关键字在 C++ 中用于修饰指针时,有多种不同的用法,它们决定了是指针本身不可变,还是指针指向的数据不可变,或者两者都不可变。理解这些区别对于编写安全、可维护的 C++ 代码至关重要,尤其对于您AI分布式推理框架的研究方向,涉及到内存管理和数据一致性时,const的正确使用显得尤为重要。

我们可以将 const 修饰指针的用法分为以下三类:

1. 指向常量的指针 (Pointer to const)

英文: Pointer to const
中文意思: 指针指向的值是常量,不能通过该指针修改其指向的值。

语法:
const type* pointer_name;
或者
type const* pointer_name; (这种写法与前一种等价,但有时被认为是"East const"风格,更易理解为const修饰的是*pointer_name,即指针指向的值。)

解释:

  • const 关键字位于 * 的左边。
  • 这意味着你不能通过这个指针来修改它所指向的数据。
  • 然而,指针本身的值(即它指向的内存地址)是可以改变的,你可以让它指向另一个变量。

示例:

int value = 10;
const int* ptr_to_const = &value; // 指向常量的指针// *ptr_to_const = 20; // 错误:不能通过此指针修改指向的值
ptr_to_const = &another_value; // 正确:指针可以指向另一个地址

应用场景:
当你希望函数接收一个指针作为参数,并且保证函数内部不会修改该指针所指向的数据时,这种用法非常常见。例如,一个读取数据的函数。

2. 常量指针 (const Pointer)

英文: const Pointer
中文意思: 指针本身是常量,一旦初始化后,不能再改变它指向的内存地址。

语法:
type* const pointer_name = initial_address;

解释:

  • const 关键字位于 * 的右边。
  • 这意味着指针一旦被初始化指向某个地址,就不能再指向其他地址。
  • 然而,通过这个常量指针,你可以修改它所指向的数据(如果数据本身不是常量)。

示例:

int value = 10;
int* const const_ptr = &value; // 常量指针,必须在声明时初始化*const_ptr = 20; // 正确:可以通过此指针修改指向的值
// const_ptr = &another_value; // 错误:不能改变指针指向的地址

应用场景:
当你希望指针始终指向同一个对象,并且不希望它被意外地重新赋值指向其他地方时。例如,一个内部数据结构的固定入口点。

3. 指向常量的常量指针 (const Pointer to const)

英文: const Pointer to const
中文意思: 指针本身是常量,且指针指向的值也是常量。

语法:
const type* const pointer_name = initial_address;
或者
type const* const pointer_name = initial_address;

解释:

  • const 关键字在 * 的两边都有。
  • 这意味着你既不能通过这个指针修改它所指向的数据,也不能改变指针本身所指向的地址。

示例:

const int value = 10; // 声明一个常量整数
const int* const const_ptr_to_const = &value; // 指向常量的常量指针// *const_ptr_to_const = 20; // 错误:不能通过此指针修改指向的值
// const_ptr_to_const = &another_value; // 错误:不能改变指针指向的地址

应用场景:
当你希望一个指针完全是只读的,既不能改变它指向哪里,也不能通过它改变所指向的数据。这提供了最高级别的数据保护。

一个简单的记忆技巧是“读法从右到左”(Right-to-Left Rule),结合 const 的位置:

  • const int* ptr; (或 int const* ptr;):const* 的左边(或与类型相邻),表示const修饰的是 *ptr (指针指向的值)。指向的数据是常量。
  • int* const ptr;const* 的右边(或与 ptr 相邻),表示const修饰的是 ptr (指针变量本身)。指针本身是常量。
  • const int* const ptr;:两边都有 const,表示指针本身和指向的数据都是常量。
http://www.xdnf.cn/news/1048663.html

相关文章:

  • Adguard安卓版:全方位广告拦截与隐私保护
  • 函数指针与指针函数:本质区别与高级应用
  • Kubernetes架构解析
  • LeetCode 48. 旋转图像
  • 算法导论第六章:堆排序与优先队列的艺术
  • MySQL进阶篇
  • Redis中的set底层实现
  • LeetCode 高频 SQL 50 题(基础版)之 【子查询】· 下
  • PMP考试中的100个关键点
  • Some chunks are larger than 500 KiB after minification. Consider
  • Java中如何使用lambda表达式分类groupby
  • 面经的疑难杂症
  • 『uniapp』onThemeChange监听主题样式,动态主题不正确生效,样式被覆盖的坑
  • 如何提高电脑打字速度?
  • 前端错误捕获
  • Vue3相关知识3
  • Mysql基础入门\期末速成
  • 微信小程序 路由跳转
  • web3-区块链的技术安全/经济安全以及去杠杆螺旋(经济稳定)
  • 【Bug】--docker的wsl版本问题
  • ELK日志文件分析系统——补充(B——Beats)
  • ELK日志文件分析系统——K(Kibana)
  • Unity基础-Line Renderer
  • 【NOI 专题训练】概率期望
  • [windows工具]PDFOCR识别重命名工具1.3 版本使用教程及注意事项
  • selenium点击元素出现的obscure问题
  • Mybatis-动态SQL、 <if>、<where>
  • MySQL常用函数详解之数值函数
  • Vue3优质动画库推荐
  • 分类预测 | Matlab基于AOA-VMD-GRU故障诊断分类预测