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

你可能感兴趣的文章
Postman轻松签名,让SHA256withRSA保驾护航
查看>>
Postman还能做Mock?又学了一招!
查看>>
Postman还能做Mock?又学了一招!
查看>>
postman进行http接口测试
查看>>
Postman高阶技能:Collection集合批量运行!
查看>>
postMessage跨标签页共享数据
查看>>
QImage对一般图像的处理
查看>>
post为什么会发送两次请求?
查看>>
Post表单提交TextArea的值出现转译乱码问题 - Spring MVC处理表单提交
查看>>
Power BI 中的 Python 可视化需要什么设置?任何特定的 matplotlib 包版本或系统设置?
查看>>
Power BI:如何在 Power Query 编辑器中将 Python 与多个表一起使用?
查看>>
power english (3) main text -emotion mastery - focus
查看>>
POWER ENGLISH (6) - MODEL
查看>>
power english (1) —— passion
查看>>
Power English (1) 原文
查看>>
power English (3)原文
查看>>
POWER ENGLISH(7)- repetition
查看>>
SpringBoot中集成SpringBatch详细解析与实战示例(CSV文件读取十万条数据进行业务处理后写入Mysql数据库)
查看>>
powerbi 一张表在另外一张表中出现的数量_PowerBi之初步学习笔记
查看>>
QGIS怎样设置简体中文以及新建可编辑的多边形的图层
查看>>