C语言 const 搞不清楚?教你最简单的学习技巧!
发布日期:2021-06-29 15:20:50 浏览次数:2 分类:技术文章

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

const大家应该很容易理解,就是常量,它的目的是让我们期待的数据,不被意外的修改,如果修改就代表它是写错了,在运行时候出错。

我们来看个简单的代码, 然后分析下为什么会出现这个错误,它的实现机制是什么?

这个在编译的时候就报错了,系统检测出来是修改常量了。

然后我们把代码修改一下,然他能够编译通过。

编译有提示,但是可以编译通过,并且运行还能运行。大家一下子是不是觉得蒙圈了,const为什么还能修改,还不出错?

这才是我这一节真正想分享给大家的。我们的程序在内存中是以进程形态存在,在操作系统中记录。

然后我们的程序加载的时候,会有各种段,段里面会对应着几个属性,读,写,执行。

而我们前面说过,局部变量是在栈上面的,而栈是可读可写的,之前是可以执行的,后续限制了,原因是栈可以执行,之前黑客利用栈溢出,使用加载代码进入栈里面进行攻击系统。

但是栈上面的数据是可以修改的。所以这个程序是可以正常运行的。那么,我们调整下代码,

我搬到外面了,然后运行时候就挂了,提示异常。为什么呢?因为全局常量,编译器会把它放到.rodata段,这个段被加载进入内存后,是设定了只读,如果去写入,就会出错。

我们看代码:objdump -d hello

这里的数据从这个地址去拿,然后我们使用 objdump -h hello,看到这个630地址是在这个位置,

这个段是数据段,并且是需要申请,加载的,只读区域。这样子分析,是不是一目了然了,明白了原来如此。我们学习一定要深入挖掘本质,这样子才豁然开朗。

然后我们来看下几个常见的用法:

const int *p=&a;

int *const p=&a;

我们记住一个就明白了,const跟着是哪个类型,就是修饰哪个,用*前后分割。

第一个*前面是 const int 所以修饰int,也就是目标的数据不让改变。

这样子操作,在编译的时候就报错了,原因是 p指向了一个只读的int,但是我们去修改它,编译器就能检测出来,你是写错了。

这样子就可以修改,因为const修饰的是p这个指针。如果你去改动p指针,就出错了,

那么这个const的修饰,目的是什么呢?目的很简单,防止我们肆意的修改,比如我们传入了一个数组,这个数组传入方法,只是让你去读,不让你修改,那么就可以带上const这个限定。

那么,使用const的作用是什么呢?

1 防止被意外修改

2 便于系统检测,同时也便于使用者调用,明确知道数据不可修改

3 可以避免用户出错,添加的强调修饰

4 增加代码健壮性

学习了这么多,还不抓紧去应用下。我们默认把一些不动的常量,使用const去做修饰。使用最多的场景就是传参,传入时候进行限定,防止函数体里面对数据进行破坏。

以上就是今天想分享给大家的,不知道听明白了吗?下一节我们说下C和C++如何混合开发,大家可以持续关注,后续会有项目实战!

~~ end not end ~~

热门文章

职场老鸟,互联网十年从业生涯,分享 [Java,Python,安卓,AI,爬虫] 技术文章,学习资料, 热点趣闻等。关注回复 1024 Python 电子书大全 面试资料,给你一份私藏的程序员好礼,永远更新中!赶紧来关注哦!

我的微信 code_gg_boy 。

转载地址:https://codegg.blog.csdn.net/article/details/114156913 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:教你快速开发的3大妙招!
下一篇:赚不到钱的5大原因!

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2024年04月29日 22时56分57秒