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

C++中指针常量和常量指针的区别

C++中指针常量和常量指针的区别

前言

在 C/C++ 编程中,指针是一个非常重要的概念,而指针常量和常量指针又是指针的两种特殊形式,它们在实际开发中有着不同的应用场景和语义,理解它们的区别对于编写高质量的代码至关重要。本文将详细介绍指针常量和常量指针的区别,帮助大家更好地掌握这一知识点。

定义

  • 指针常量:指针常量是一个指向某个地址的指针,但这个指针本身不能被修改指向其他地址,即指针的值(地址)是常量。它的定义形式为:数据类型 *const 指针名。例如:int *const ptr = &a;,这里ptr是一个指针常量,它指向变量a的地址,ptr的值不能被修改。
  • 常量指针:常量指针是一个指向常量的指针,即它指向的地址中的值不能被修改,但指针本身可以指向其他地址。它的定义形式为:const 数据类型 *指针名。例如:const int *ptr = &a;,这里ptr是一个常量指针,它指向变量a,但不能通过ptr修改a的值,不过ptr可以被重新赋值指向其他变量。

区别

修饰对象不同

  • 指针常量:修饰的是指针本身,即指针的值(地址)是常量,不能被修改。
  • 常量指针:修饰的是指针所指向的内容,即指针所指向的地址中的值是常量,不能被修改。

使用场景不同

  • 指针常量:当需要一个固定的指针,指向某个地址,且不希望这个指针被修改指向其他地址时,使用指针常量。例如,在函数中需要传递一个指针参数,但不希望这个指针在函数内部被修改指向其他地址,可以使用指针常量作为参数类型。
  • 常量指针:当需要保护指针所指向的数据,防止通过指针修改数据时,使用常量指针。例如,在函数中需要传递一个只读的指针参数,但允许这个指针在函数内部指向其他地址,可以使用常量指针作为参数类型。

示例代码

#include <stdio.h>int main() {int a = 10;int b = 20;// 指针常量int *const ptr1 = &a;// ptr1 = &b; // 错误,指针常量的值不能被修改printf("a = %d\n", *ptr1);// 常量指针const int *ptr2 = &a;printf("a = %d\n", *ptr2);ptr2 = &b; // 正确,常量指针的值可以被修改// *ptr2 = 30; // 错误,不能通过常量指针修改数据printf("b = %d\n", *ptr2);return 0;
}

总结

指针常量和常量指针在定义、修饰对象和使用场景上都有明显的区别。指针常量修饰的是指针本身,常量指针修饰的是指针所指向的内容。在实际编程中,根据具体需求选择合适的指针类型,可以更好地保护数据和防止错误。希望本文的介绍能够帮助大家更好地理解和使用指针常量和常量指针。

http://www.lryc.cn/news/2394994.html

相关文章:

  • 深入解析向量数据库:基本原理与主流实现
  • VectorNet:自动驾驶中的向量魔法
  • PostgreSQL性能监控双雄:深入解析pg_stat_statements与pg_statsinfo
  • 【Linux系列】Linux/Unix 系统中的 CPU 使用率
  • C++语法系列之模板进阶
  • 基于图神经网络的自然语言处理:融合LangGraph与大型概念模型的情感分析实践
  • R 语言科研绘图 --- 热力图-汇总
  • 基于DFT码本的波束方向图生成MATLAB实现
  • vBulletin未认证API方法调用漏洞(CVE-2025-48827)
  • 解决访问网站提示“405 很抱歉,由于您访问的URL有可能对网站造成安全威胁,您的访问被阻断”问题
  • FeignClient发送https请求时的证书验证原理分析
  • UDP组播套接字与URI/URL/URN技术详解
  • 机器学习中的关键术语及其含义
  • 点云识别模型汇总整理
  • 项目更改权限后都被git标记为改变,怎么去除
  • 网络编程1_网络编程引入
  • 【Day38】
  • HTML Day04
  • 佳能 Canon G3030 Series 打印机信息
  • 云原生安全基石:Kubernetes 核心概念与安全实践指南
  • 图像修复的可视化demo代码
  • autodl 安装了多个conda虚拟环境 选择合适虚拟环境的语句
  • 【AI工具应用】使用 trae 实现 word 转成 html
  • ansible-playbook 进阶 接上一章内容
  • 趋势直线指标
  • 基线配置管理:为什么它对网络稳定性至关重要
  • AWS WebRTC:获取ICE服务地址(part 1)
  • Nest全栈到失业(一):Nest基础知识扫盲
  • 摩尔线程S4000国产信创计算卡性能实战——Pytorch转译,多卡P2P通信与MUSA编程
  • Tesseract OCR 安装与中文+英文识别实现