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

你可能感兴趣的文章
nginx代理地图服务--离线部署地图服务(地图数据篇.4)
查看>>
Nginx代理外网映射
查看>>
Nginx代理模式下 log-format 获取客户端真实IP
查看>>
Nginx代理静态资源(gis瓦片图片)实现非固定ip的url适配网络环境映射ip下的资源请求解决方案
查看>>
Nginx代理静态资源(gis瓦片图片)实现非固定ip的url适配网络环境映射ip下的资源请求解决方案
查看>>
Nginx反向代理与正向代理配置
查看>>
Nginx反向代理是什么意思?如何配置Nginx反向代理?
查看>>
nginx反向代理解决跨域问题,使本地调试更方便
查看>>
nginx启动脚本
查看>>
Nginx在Windows下载安装启动与配置前后端请求代理
查看>>
Nginx多域名,多证书,多服务配置,实用版
查看>>
nginx开机启动脚本
查看>>
nginx异常:the “ssl“ parameter requires ngx_http_ssl_module in /usr/local/nginx/conf
查看>>
nginx总结及使用Docker创建nginx教程
查看>>
nginx报错:the “ssl“ parameter requires ngx_http_ssl_module in /usr/local/nginx/conf/nginx.conf:128
查看>>
nginx报错:the “ssl“ parameter requires ngx_http_ssl_module in usrlocalnginxconfnginx.conf128
查看>>
nginx日志分割并定期删除
查看>>
Nginx日志分析系统---ElasticStack(ELK)工作笔记001
查看>>
Nginx映射本地json文件,配置解决浏览器跨域问题,提供前端get请求模拟数据
查看>>
nginx最最最详细教程来了
查看>>