一:const修饰指针
( const的作用:给指定变量加上限制,使其不能被修改)
例如:
#include<stdio.h>
int main()
{
int m=7;
const int n=7;
m=20;
n=20;
printf("m=%d\n",m);
printf("n=%d\n",n);
return 0;
}
运行的结果是:
可以看到,上述代码中的n是无法被改变的,但是n的本质是变量,只不过被const 修饰后,在语法上有了限制,直接在代码中对n修改就不符合语法规则,就报错
但是如果我们另辟蹊径,不直接对n的值进行修改,而是从它的地址入手呢
#include<stdio.h>
int main()
{
const int n=6;
printf("n=%d\n",n);
int *p=&n;
*p=0;
printf("n=%d\n",n);
return 0;
}
结果说明了一切,我们做到了,但这只是一条小路,它打破了语法规则
我们还应该在思考一下为什么呢,我用const 去修饰n就是为了他不会被改变,但是这样还是会有办法改变n,那么怎样可以让他无论如何都不会被改变呢?
那我们联想到,前面开辟的小路就是从我变量的指针入手,那我要是直接const指针呢
请看:
#include<stdio.h>
int main()
{
int n=7;
int *p=&n;
*p=20;
printf("n=%d\n",n);
return 0;
}
const 放在*p的左边
#include<stdio.h>
int main()
{
int n=7;
int const*p=&n; //const 放在*p的左边
*p=20;
printf("n=%d\n",n);
return 0:
}
const放在*p的右边
#include<stdio.h>
int main()
{
int n=7;
int *const p=20;
printf("n=%d \n",n);
return 0;
}
j
综上,可得出结论:
const 如果放在* 的左边,修饰的是指针指向的内容,保证指针指向的内容不会通过指针来改变,但是指针变量本身的内容可以改变。
const 如果放在* 的右边,修饰的是指针变量本身,保证指针变量的内容不会改变,但是指针指向的内容,可以通过指针来改变。
二:assert 断言
其头文件为 assert.h 用于在运行中确定程序是否符合指定条件,如果不符合就报错终止运行,这个宏常常被称为“断言”。
assret(p !=NULL)
验证p是否为空指针,如果是的话,程序就会终止运行,并且给出报错信息提示,如果不是,程序就会继续进行。
assert( 要判断的条件)
它的使用有以下好处:
1: 可以自动识别标识文件和出问题的行数号
2:有一种可以无需更改代码就能开启或关闭的assert的机制,那就是
#define NUEBUG
#include<assert.h>
在前面定义一个宏#NUEDUG即可