今天我们来聊聊C语言里那些让人头秃的进阶操作——const、野指针和assert断言。
如果说指针是“外卖小哥”,那进阶玩法就是教你怎么给小哥戴上“紧箍咒”,别让他乱送餐(写数据),还得防止他迷路成了“流浪汉”。很多同学代码写着写着就崩了,多半是这几个坑没避开。来,搬好小板凳,咱们开讲!
一、const修饰指针:给变量上个“封印术”
大家都知道const是“常量”的意思,但在指针这里,它的位置决定了它封印的是谁。这就好比你和钱包的关系,const放在不同的位置,决定是你不能花钱,还是钱包不能丢。
1. 基础版:const修饰变量

但是!如果你耍小聪明,把n的地址交给指针,就能绕过这个限制:

这显然不合理啊!既然都说不让改了,凭啥你能改?所以,我们要把指针也锁起来。
2. 进阶版:const在*的左边(封印内容)
口诀:左定值(内容不能变)

这就好比:你不能动钱包里的钱(内容),但你可以换一个钱包(地址)。
3. 进阶版:const在*的右边(封印指针)
口诀:右定址(地址不能变)

这就好比:钱随便花(内容),但这张银行卡(地址)死活不能注销或换绑。
4. 终极版:左右都有const

既改不了内容,也改不了地址。 彻底锁死,这变量就是块“只读存储器”了。
二、野指针:别让你的指针变成“流浪狗”
野指针就是指针指向的内存地址是随机的、无效的。这玩意儿最可怕,因为它不一定立刻报错,就像一颗定时炸弹💣。
1. 野指针是怎么炼成的?
文档里总结了三大成因,太真实了:
-
没初始化:刚生出来的指针没家教,乱跑。

-
越界访问:狗遛得太远,跑出小区了。

-
空间释放:房子拆了,你还去住。

2. 如何驯服野指针?(本人小小小的建议)
-
养成好习惯:不知道指哪就指NULL

-
用完即焚:指针不用了,立马置为NULL。
-
出门带脑子:遍历数组时,时刻盯着边界,别越界。
-
别回头:千万别返回局部变量的地址!(上面第3点)。
三、assert断言:代码的“安检员”
为了防止有人把NULL指针带进函数里搞破坏,我们需要一个安检员,这就是assert。

如果arr真的是NULL,程序会直接崩溃并报错,告诉你“在第几行,arr是空的”。
好处:调试阶段帮你快速定位错误,比你自己慢慢找快多了!
四、传值 vs 传址:为什么交换函数总失败?
这是面试必考题!为什么有时候写个交换函数,数字就是换不过来?
1. 传值调用(失败版)

原因:这是复印机原理。你把a和b复印了一份给x和y。x和y在办公室里换得再欢,跟你原来的a和b半毛钱关系都没有。
2. 传址调用(成功版)

原因:这次你给了函数门牌号。函数拿着钥匙直接进你家(内存)把家具换了,当然生效了!
五、实战:手写一个strlen(字符串长度计算器)
结合上面的知识,我们来模拟实现库函数strlen:

注意这里要导入库,即要有#include <assert.h>,同时也引用了const char* str,因为我们只是数数,绝对不能改人家的字符串内容!
总结时间到啦!!!
|
场景 |
操作建议 |
|---|---|
|
不想改内容 |
|
|
不想改地址 |
|
|
防止野指针 |
初始化 |
|
调试抓虫 |
用 |
|
要改实参 |
必须用传址调用(传指针) |
指针进阶其实就这点事儿:管住手(const),看好路(防野指针),带好安检员(assert)。把这些搞定了,你的C语言基础水平就已经超过一大半初学者啦!
要是还有哪个地方绕不过来,评论区扣个“1”,我给你单独开小灶!

196

被折叠的 条评论
为什么被折叠?



