博客
关于我
const与指针
阅读量:570 次
发布时间:2019-03-10

本文共 1562 字,大约阅读时间需要 5 分钟。

const修饰的指针与普通变量

知道const这个修饰词吧?在C语言中,const是一个很强大但也非常严格的修饰词,它可以修饰多种类型的变量,本文将详细探讨它在常规变量和指针两种场景下的用法和影响。

一、const修饰普通变量

1. 和普通变量一起冠以const

在C语言中,const可以单独修饰变量,使其成为常量。与const是否放在变量类型的前面无关,无论是在int后面还是在前面,效果都是一样的。

int const a = 10; // 与const int a = 10; 是等价的a = 20; // 会报错,表示const修饰的普通变量的值是不能被修改的

从上面可以看出,一旦用const修饰普通变量,就无法通过赋值来改变这个变量的值。它的值将被认为是固定的,任何试图修改它的行为都会导致编译失败。

二、const修饰指针

指针在C语言中是一种强大的工具,但它也有自己的特点。而在const修饰的作用下,指针的行为会发生很大变化。以下是关于const修饰指针的三种常见情况的详细分析。

2.1 const *p

这个写法中,const修饰的是指针的目标(p),也就是指针所指向的内存空间的值。不能直接修改 p所指向的内存空间里的值,但可以更改p的值,即让p指向其他内存地址。

int a = 10;int const *p = &a;*p = 30;    // 报错,*p所指向的内存空间的值不能被修改p = &b;     // 不会报错,p的值可更改*p = 30;    // 报错,* p所指向的地址空间的值仍然不能被修改

这就是说,const修饰的是p所获取的地址值。如果p所在的地址是常量,那么这个地址空间里的值不能被修改,但p本身的值(即指针存储的地址)可以被重新赋值。

2.2 *const p

在这个写法中,与上面的情况相比,const修饰的对象是p这个指针变量本身。这意味着p的值不能被修改,指针必须固定指向某个地址,但这个地址空间的值可以被修改。

int a = 10;int *const p = &a;*p = 30;    // 不会报错,pcso指针指向的地址空间的值可以被修改p = &b;     // 报错,p本身的值不能被修改

这里的区别体现在哪呢?很简单就是,在int const *p中,*p(指针的目标地址)是常量,但p本身的值可以变。而在int const p中,p的值是不能变的(即p只能固定指向某个地址),但指针目标地址的值(也就是p)的内容是可以被改的。

2.3 *const *p

这个写法看起来更复杂,但其实它涉及到了对两个const修饰的情况的叠加。首先,const *p修饰了p所指的地址空间的值不能被修改,其次,*p的修饰也意味着p本身的值也不能被修改。

int a = 10;int const * const p = &a;*p = 30;    // 报错,*p所指的地址空间的值不能被修改p = &b;     // 报错,p的值不能被修改

这种双重const修饰使得p不仅不能指向其他内存地址,还不能修改*p所指向的地址空间的值。这就是为什么在double const p的情况下,任何试图修改p的值或p的值都会导致编译错误。

总结

通过上述对const修饰方式的探讨,我们可以得出以下结论:

  • 主要看const是修饰了(p) 还是(p)。如果是修饰了p,那么它意味着*p所指向的地址空间的值不能被修改。如果是修饰了p,那么它意味着p的值不能被修改(即p不能再被赋值)。

这种对const修饰方式的理解,对于代码的编写和优化都非常有用。理解清楚它修饰的是变量本身还是变量所指向的内存地址,可以帮助你更高效地使用资源,同时避免运行时错误。

转载地址:http://yijvz.baihongyu.com/

你可能感兴趣的文章
OpenCV与AI深度学习 | 实战 | 基于YoloV5和Mask RCNN实现汽车表面划痕检测(步骤 + 代码)
查看>>
OpenCV与AI深度学习 | 实战 | 基于YOLOv9+SAM实现动态目标检测和分割(步骤 + 代码)
查看>>
OpenCV与AI深度学习 | 实战 | 基于YOLOv9和OpenCV实现车辆跟踪计数(步骤 + 源码)
查看>>
OpenCV与AI深度学习 | 实战 | 文本图片去水印--同时保持文本原始色彩(附源码)
查看>>
OpenCV与AI深度学习 | 实战—使用YOLOv8图像分割实现路面坑洞检测(步骤 + 代码)
查看>>
OpenCV与AI深度学习 | 实战篇——基于YOLOv8和OpenCV实现车速检测(详细步骤 + 代码)
查看>>
OpenCV与AI深度学习 | 实战|OpenCV实时弯道检测(详细步骤+源码)
查看>>
OpenCV与AI深度学习 | 实践教程|旋转目标检测模型-TensorRT 部署(C++)
查看>>
OpenCV与AI深度学习 | 工业缺陷检测中数据标注需要注意的几个事项
查看>>
OpenCV与AI深度学习 | 干货 | 深度学习模型训练和部署的基本步骤
查看>>
OpenCV与AI深度学习 | 手把手教你用Python和OpenCV搭建一个半自动标注工具(详细步骤 + 源码)
查看>>
OpenCV与AI深度学习 | 深度学习检测小目标常用方法
查看>>
OpenCV与AI深度学习 | 超越YOLOv10/11、RT-DETRv2/3!中科大D-FINE重新定义边界框回归任务
查看>>
OpenCV与AI深度学习 | 高效开源的OCR工具:Surya-OCR介绍与使用
查看>>
Opencv中KNN背景分割器
查看>>
OpenCV中基于已知相机方向的透视变形
查看>>
OpenCV中的监督学习
查看>>
opencv中读写视频
查看>>
opencv之cv2.findContours和drawContours(python)
查看>>
opencv之namedWindow,imshow出现两个窗口
查看>>