完全掌握assert和const,这就够了

1.指针程序中经常出现的assert断言

assert.h这个头文件定义了宏assert(),用于运行时程序确保符合指定条件。如不符合就报错终止。因此这个宏常常被称为“断言”

如图,第8行中的assert()用来判断p这个指针是否为空指针,因为第7行中我把p设置为空指针,所以assert括号内条件不成立,程序会报错。在assert以下的代码都不会执行。

结果如图:

这个报错很详细,assert() 宏接受⼀个表达式作为参数。如果该表达式为真(返回值⾮零), assert() 不会产⽣ 任何作⽤,程序继续运⾏。如果该表达式为假(返回值为零), assert() 就会报错,在标准错误 流 stderr 中写⼊⼀条错误信息,显⽰没有通过的表达式,以及包含这个表达式的⽂件名和⾏号。

assert()的使用对程序员很友好,有一种无需更改代码就能启动或关闭它的机制。如果你已经确认程序没有问题不需要再断言判断时,就可以再 #include<assert.h>前面加上#define NDEBUG,便可以终止所有assert()语句,未来想要使用assert()语句时只需手动删去#define NDEBUG就可以了。

2.const修饰指针变量

在各种指针变量的使用中相信大家经常能看到const的身影例举一个char*类型的指针变量pi

即char*pi。

const可以在*的左端:const char*pi , 也可以在*的右端:char*const pi;

这两种写法各有什么含义呢?

第19行报错了,因为const修饰指针变量后,被修饰的指针变量所指向的内容是不能被修改的。

在看这里,18行和23行打印的*p好像并不一样,但是p和m的地址一样,为什么?

因为被p指向的变量它的内容不能修改,但是没说你的指针变量本身是不能修改的呀,这里指针变量p本身可以修改。

也就是加上const后,不能通过指针p去修改被指向的对象n,但可以修改指针变量p。

以上都是const放在*左端,但也会出现*的右端,这两种写法一样吗?

这里报错原因是,const放在*右端,修饰指针变量,const的作用是使指针本身不能被修改,但其指向的对象的内容是可以修改的。

验证结果:

可以看出这次p和m的地址不一样,但与const放在*左端相比,p所指向的内容被改变了,n=10;变为n=20;

3.总结const:

• const如果放在*的左边,修饰的是指针指向的内容,保证指针指向的内容不能通过指针来改变。 但是指针变量本⾝的内容可变。

• const如果放在*的右边,修饰的是指针变量本⾝,保证了指针变量的内容不能修改,但是指针指 向的内容,可以通过指针改变

  • 13
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值