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

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.xdnf.cn/news/742177.html

相关文章:

  • 【设计模式-4.6】行为型——状态模式
  • [蓝桥杯]拉马车
  • L56.【LeetCode题解】 电话号码的字母组合
  • 触发器与存储过程详解
  • Mybatis-Plus简单介绍
  • 鸿蒙HarmonyOS (React Native)的实战教程
  • Java后端技术栈问题排查实战:Spring Boot启动慢、Redis缓存击穿与Kafka消费堆积
  • 【Java学习笔记】内部类(重点)
  • 数据结构:时间复杂度(Time Complexity)和空间复杂度(Space Complexity)
  • Typescript学习教程,从入门到精通,TypeScript 配置管理与编译器详解(19)
  • Rust 配置解析`serde` + `toml`
  • 华为OD机试真题——找出两个整数数组中同时出现的整数(2025A卷:100分)Java/python/JavaScript/C++/C语言/GO六种最佳实现
  • 【HTML】基础学习【数据分析全栈攻略:爬虫+处理+可视化+报告】
  • MySQL事务与锁机制详解:确保数据一致性的关键【MySQL系列】
  • 005 flutter基础,初始文件讲解(4)
  • leetcode付费题 353. 贪吃蛇游戏解题思路
  • 实现MPC钱包
  • [蓝桥杯]阶乘求值【省模拟赛】
  • Thinkphp6实现websocket
  • Spring Boot养老院管理系统源码分享
  • MacOS安装Docker Desktop并汉化
  • 2.5 TypeScript 中的 instanceof 运算符
  • C++中全局变量和局部变量的区别
  • 华为OD机试真题——最小的调整次数/特异性双端队列(2025A卷:100分)Java/python/JavaScript/C++/C语言/GO六种最佳实现
  • 【Netty系列】实现HTTP文件服务器
  • Redis:功能特性和应用场景
  • 学术合作交流
  • 生成https 证书步骤
  • 3D Gaussian splatting 04: 代码阅读-提取相机位姿和稀疏点云
  • 计算机网络物理层基础练习