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如果放在*的右边,修饰的是指针变量本⾝,保证了指针变量的内容不能修改,但是指针指 向的内容,可以通过指针改变