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

你可能感兴趣的文章
Node-RED中使用node-random节点来实现随机数在折线图中显示
查看>>
Node-RED中使用node-red-browser-utils节点实现选择Windows操作系统中的文件并实现图片预览
查看>>
Node-RED中使用node-red-contrib-image-output节点实现图片预览
查看>>
Node-RED中使用node-red-node-ui-iframe节点实现内嵌iframe访问其他网站的效果
查看>>
Node-RED中使用Notification元件显示警告讯息框(温度过高提示)
查看>>
Node-RED中使用range范围节点实现从一个范围对应至另一个范围
查看>>
Node-RED中实现HTML表单提交和获取提交的内容
查看>>
Node-RED中将CSV数据写入txt文件并从文件中读取解析数据
查看>>
Node-RED中建立TCP服务端和客户端
查看>>
Node-RED中建立Websocket客户端连接
查看>>
Node-RED中建立静态网页和动态网页内容
查看>>
Node-RED中解析高德地图天气api的json数据显示天气仪表盘
查看>>
Node-RED中连接Mysql数据库并实现增删改查的操作
查看>>
Node-RED中通过node-red-ui-webcam节点实现访问摄像头并截取照片预览
查看>>
Node-RED中配置周期性执行、指定时间阶段执行、指定时间执行事件
查看>>
Node-RED安装图形化节点dashboard实现订阅mqtt主题并在仪表盘中显示温度
查看>>
Node-RED怎样导出导入流程为json文件
查看>>
Node-RED订阅MQTT主题并调试数据
查看>>
Node-RED通过npm安装的方式对应卸载
查看>>
node-request模块
查看>>