固执的const与易变的volatile
对于const与volatile这两个关键字可能在一些简单的C语言应用中比较少见,但是在实际的项目应用中这两个关键字身影却随处可见。下面我们就这两个关键进行讨论。
1,const 可能大家见到这个关键字会想到常量,即认为经过const声明的变量将会常量化,遗憾的是这又是一种错误的观点(注意:对于const的讨论限于C语言,在C++中const将会有新的意义,感兴趣的可以找我讨论)。
有:const int i = 10;
虽然有const的声明,i 依然是变量,但是是只读变量。如有:i = 50;//编译将报错,因为i不可写只可读。对其证明下一节将给出。下面将说说const的作用。
const 的冻结效应
上面也提到了const int i = 10;对于i只能读不能写,也就是说i的内容被冻结了。
那么还有:(1)const int *p; (2)int const *p; (3)int *const p; (4)int const *p const;
又做何解呢?
int a ; const int *p = &a; 冻结*p的值,如有*p = 10;//编译将报错。
同(1)
int a; int *const p = &a;//冻结p的值,即p的指向不可改。如有 p = &b//编译将报错。但是*p的值却可以改变。*p = 50;//正确
双冻结,p与*p都被冻结。
一旦内容被冻结就变成了只读,这样就可对数据起到保护作用了。在赋值语句中被冻结的内容不能再做左值了。
下面看以例子:
#include <stdio.h>
#include<stdlib.h>
#include<assert.h>
char* strcpy(char *des, const char *soure)//对源数据soure起到了保护作用
{
assert((NULL != des) && (NULL != soure));//函数入口出对指针进行检测
while((*des++ = *soure++) != '\0');
return des;
}
int main(int argc, char *argv[])
{
char s[50];
strcpy(s,"hello,baby!");
printf("%s",s);
}
对其变量性质的证明
有const int i = 10;int a[i];//编译将报错,i是变量,编译的时候编译器无法确定数组的大小,解决方法#define i 10就可以了。但在C++中可以直接用,而还有它自己的优点。比如类型验证。
还有一个例子可以说明在c中const int i = 10;中i是变量。
Switch(a)
{
case 1:statement1
break;
........
case i:statement2//编译报错,因为是变量。
break;
......
default:statementn
}//待续。。。。