博客
关于我
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/

你可能感兴趣的文章
Openlayers实战:绘制图形,导出geojson文件
查看>>
Openlayers实战:绘制图形,导出KML文件
查看>>
Openlayers实战:绘制多边形,导出CSV文件
查看>>
Openlayers实战:输入WKT数据,输出GML、Polyline、GeoJSON格式数据
查看>>
Openlayers高级交互(10/20):绘制矩形,截取对应部分的地图并保存
查看>>
Openlayers高级交互(11/20):显示带箭头的线段轨迹,箭头居中
查看>>
Openlayers高级交互(14/20):汽车移动轨迹动画(开始、暂停、结束)
查看>>
Openlayers高级交互(15/20):显示海量多边形,10ms加载完成
查看>>
Openlayers高级交互(16/20):两个多边形的交集、差集、并集处理
查看>>
Openlayers高级交互(17/20):通过坐标显示多边形,计算出最大幅宽
查看>>
Openlayers高级交互(19/20): 地图上点击某处,列表中显示对应位置
查看>>
Openlayers高级交互(2/20):清除所有图层的有效方法
查看>>
Openlayers高级交互(3/20):动态添加 layer 到 layerGroup,并动态删除
查看>>
Openlayers高级交互(6/20):绘制某点,判断它是否在一个电子围栏内
查看>>
Openlayers高级交互(7/20):点击某点弹出窗口,自动播放视频
查看>>
Openlayers高级交互(8/20):选取feature,平移feature
查看>>
Openlayers:DMS-DD坐标形式互相转换
查看>>
openlayers:圆孔相机根据卫星经度、纬度、高度、半径比例推算绘制地面的拍摄的区域
查看>>
OpenLDAP(2.4.3x)服务器搭建及配置说明
查看>>
OpenLDAP编译安装及配置
查看>>