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

const修饰指针用法详解

目录

一、const修饰变量

绕过const限制的问题

二、const修饰指针变量

1、无const修饰的指针

2、const放在*左边

3、const放在*右边

4、*两边都有const

三、使用建议

四、记忆技巧


一、const修饰变量

        在C语言中,变量默认是可修改的。如果我们希望某个变量不能被修改,可以使用const关键字进行修饰。

#include <stdio.h>int main()
{int m = 0;m = 20;    // m是可以修改的const int n = 0;n = 20;    // 编译错误:n不能被修改return 0;
}

    const修饰的变量n本质仍然是变量,但在语法层面添加了限制,任何直接修改n的操作都会导致编译错误。

绕过const限制的问题

虽然直接修改const变量会导致编译错误,但通过指针间接修改在语法上是可能的:

#include <stdio.h>int main()
{const int n = 0;printf("n = %d\n", n);  // 输出: n = 0int* p = &n;            // 获取n的地址*p = 20;                // 通过指针修改n的值printf("n = %d\n", n);  // 输出: n = 20return 0;
}

运行结果:

        这种操作虽然能修改n的值,但违背了使用const的初衷。为了真正保护变量不被修改,我们需要正确使用const修饰指针。


二、const修饰指针变量

const修饰指针变量时,根据const关键字相对于星号(*)的位置不同,其含义也不同:

int * p;//没有const修饰? int const * p;//const 放在*的左边做修饰
//上面这一句等价于
const int * p;//const 放在*的左边做修饰 int * const p;//const 放在*的右边做修饰

1、无const修饰的指针

void test1()
{int n = 10;int m = 20;int* p = &n;*p = 20;  // 可以修改指针指向的内容p = &m;   // 可以修改指针本身
}

2、const放在*左边

void test2()
{int n = 10;int m = 20;const int* p = &n;  // 或 int const* p = &n;*p = 20;  // 编译错误:不能通过指针修改指向的内容p = &m;   // 可以修改指针本身
}

3、const放在*右边

void test3()
{int n = 10;int m = 20;int* const p = &n;*p = 20;  // 可以修改指针指向的内容p = &m;   // 编译错误:不能修改指针本身
}

4、*两边都有const

void test4()
{int n = 10;int m = 20;const int* const p = &n;*p = 20;  // 编译错误:不能通过指针修改指向的内容p = &m;   // 编译错误:不能修改指针本身
}

三、使用建议

  1. 保护数据不被修改:如果希望数据不被修改,应该使用const type*const type* const形式

  2. 保护指针不被修改:如果希望指针本身不被修改,应该使用type* const形式

  3. 最佳实践:在函数参数中,如果函数不需要修改指针指向的数据,应该使用const修饰指针参数,这样既能保护数据,又能使函数接受const和非const的实参


四、记忆技巧

可以这样记忆const修饰指针的规则:

  • const在*左边:保护"星"指向的内容(数据不可变)

  • const在*右边:保护"星"本身(指针不可变)

  • 两边都有const:都保护

        这种修饰方式在C/C++中广泛使用,特别是在函数参数传递和API设计中,能够有效提高代码的安全性和可维护性。

http://www.dtcms.com/a/333680.html

相关文章:

  • libdrm 和 libgbm
  • 零基础从头教学Linux(Day 13)
  • 13_集合框架
  • ScanNet项目介绍
  • Linux网络配置:聚合链路与网桥实战
  • 开疆智能ModbusTCP转Ethernet网关连接FBOX串口服务器配置案例
  • MySQL多表查询案例
  • 360 集团20周年会:战略升级ALL IN Agent,抢占智能体时代先机
  • OSCP - Proving Grounds - CVE-2024-25180
  • 基于WSL搭建Ubuntu 22.04.x LTS开发环境
  • LLM - 使用 SGLang 部署 Qwen3-32B 与 Qwen2.5-VL-32B-Instruct
  • 《GUI-Actor: Coordinate-Free Visual Grounding for GUI Agents》论文精读笔记
  • 今日分享:C++模板(全详解)
  • 大数据系列之:设置CMS垃圾收集器
  • std::set_symmetric_difference
  • 第七十三章:AI的“黑箱”迷局:推理链路中的断点与Tensor调试——让模型“交代一切”!
  • CCS双轴相位偏移光源 让浅凹痕无处遁形
  • 【Redis】超详细基础入门学习
  • 硬件开发_基于STM32单片机的热水壶系统
  • GitHub的使用教程
  • Upload 上传 vue2前端 + 后端
  • 【DDIA】第二部分:分布式数据
  • 【大模型微调系列-02】 深度学习与大模型初识
  • Java Lambda表达式是什么,怎么用
  • C语言笔记6:C高级 part1
  • Go从入门到精通系列学习路线规划
  • 区块链技术原理(13)-以太坊燃料费Gas
  • ITM(仪器跟踪宏单元)是什么?
  • Elasticsearch赋能规章制度智能检索:从海量文档到秒级响应
  • PyInstaller打包Python应用操作备忘