从混淆到精通:C/C++常量指针与指针常量的本质差异与实战应用

news/2025/3/1 3:56:30/

一、定义与声明

  1. 常量指针(Pointer to Constant)

    • 定义:指针指向的内容为常量,不可通过该指针修改,但指针本身可改变指向。
    • 声明方式:const int* pint const* p
      const int a = 10;
      const int* p = &a;  // p是常量指针 
      // *p = 20;         // 错误!内容不可修改 
      p = &b;             // 正确,指针指向可修改 
      
  2. 指针常量(Constant Pointer)

    • 定义:指针本身是常量,不可修改指向的地址,但可通过指针修改指向的内容。
    • 声明方式:int* const p
      int b = 20;
      int* const p = &b;  // p是指针常量 
      *p = 30;            // 正确,内容可修改 
      // p = &a;          // 错误!指针指向不可修改 
      
  3. 指针常量(Constant Pointer to Constant)

    • 定义:指针本身和指向的内容均为常量。
    • 声明方式:const int* const p
      const int c = 30;
      const int* const p = &c;  // 两者均不可修改 
      // *p = 40;               // 错误!
      // p = &a;                // 错误!
      

二、核心区别对比

特性常量指针指针常量指针常量
指针指向可变性可修改指向(p = &b不可修改指向不可修改指向
内容可变性不可通过指针修改内容可通过指针修改内容不可通过指针修改内容
初始化要求无强制初始化必须初始化必须初始化
典型应用场景函数参数保护数据固定地址操作硬件/资源完全不可变的全局配置

三、使用场景与注意事项

  1. 常量指针的典型应用

    • 函数参数保护:避免函数内部修改外部数据,如strlen(const char* s)
    • 指向字面量:如const char* str = "Hello";,防止修改字符串常量。
  2. 指针常量的典型应用

    • 硬件寄存器操作:固定地址的硬件寄存器访问,如volatile int* const reg = 0x8000;
    • 资源句柄管理:如文件指针需固定指向某个资源句柄。
  3. 常见错误

    • 混淆声明顺序:int const* pconst int* p等价,但int* const p完全不同。
    • 未初始化指针常量:int* const p;会导致编译错误。
    • 通过常量指针修改数据:需确保原始变量本身不是常量(如const int a不可修改,但int a可通过其他方式修改)。

四、示例代码解析

#include <iostream>
using namespace std;int main() {int x = 10, y = 20;// 常量指针 const int* p1 = &x;// *p1 = 15;    // 编译错误 p1 = &y;        // 合法 // 指针常量 int* const p2 = &x;*p2 = 15;       // 合法 // p2 = &y;     // 编译错误 // 常指针常量 const int* const p3 = &x;// *p3 = 20;    // 错误 // p3 = &y;     // 错误 return 0;
}

五、记忆技巧

  1. 从右向左读声明:
    • const int* p → “p是指针,指向int常量”。
    • int* const p → “p是常量,指向int”。
  2. 口诀:
    • 常量指针:内容不变,指向可变(如看门狗,只读不写)。
    • 指针常量:指向不变,内容可变(如固定管家,可改内容)。

http://www.ppmy.cn/news/1575675.html

相关文章

RawShaderMaterial 与 ShaderMaterial

目录 自动添加的 Uniforms 和 Attributes ShaderMaterial RawShaderMaterial GLSL 预处理 ShaderMaterial RawShaderMaterial 使用场景 ShaderMaterial RawShaderMaterial 代码示例对比 使用 ShaderMaterial 使用 RawShaderMaterial 常见问题与注意事项 总结 在 Th…

视频编解码技术-3: H.264和VP9压缩效率和编码时延

一、引言 在前作《H.264和VP9视频编码质量评估》中&#xff0c;我们通过PSNR、SSIM等指标分析了二者在固定码率下的质量差异。本文聚焦实时应用场景的核心矛盾&#xff1a;在相同主观质量下&#xff0c;如何权衡压缩效率与编码延迟&#xff1f; 为此&#xff0c;本文采用“恒…

Imagination GPU 3D Graphics Wrokload

本次分享Imagination GPU 的3D 图像处理负载流程。 总的分为两个阶段 第一阶段&#xff1a;Geometry Processing Phase&#xff08;几何处理阶段&#xff09;是渲染管线中的一个关键环节&#xff0c;主要负责对三维几何数据进行处理和变换&#xff0c;以便后续在屏幕上进行显…

nodejs将pdf转换成图片并提取图片内容

pdf2pic 安装方法 安装文档地址&#xff1a;https://github.com/yakovmeister/pdf2image/blob/HEAD/docs/gm-installation.md Windows下载下面两个文件&#xff0c;安装时没有自动设置环境变量&#xff0c;要分别设置到环境变量 Download Ghostscript Windows: https://gith…

Maven+SSM+SpringBoot+Mybatis-Plus

SSM技术栈&#xff1a;spring6、springmvc、mybatis、springboot3、mybatis-plus、druid&#xff1b; 前端: node、npm、vue 快速掌握&#xff1a;全新SSMSpring BootMyBatis-Plus实战精讲

mapbox基础,使用geojson加载heatmap热力图层

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️heatmap热力图层样式二、🍀使用geojs…

C高级——shell(3)

一、shell的选择结构 1.回顾&#xff1a;C语言的选择结构:if , if else if ,if else,switch &#xff08;switch的执行速度最快&#xff09; 2.shell的选择结构&#xff1a; 单分支if 双分支 if else 多分支if elif case..in 1.1 shell的选择结构的格式 --------C语言的格式--…

一个非常好用便捷的web自动化爬虫工具Playwright

相比于selenium&#xff0c;Playwright不需要在本地安装浏览器和对应版本的chromedriver&#xff0c;之前一度苦恼谷歌浏览器经常自动更新&#xff0c;需要更换旧的浏览器才有对应的driver&#xff0c;现在不需要考虑浏览器&#xff0c;这点非常nice&#xff0c;以及Playwright…