const的应用
下面引用陈正冲和石虎老师的《C 语言深度解剖》书中的解释
强烈推荐
编译器通常不为普通 const 只读变量分配存储空间,而是将它们保存在符号表中,这使 得它成为一个编译期间的值,没有了存储与读内存的操作,使得它的效率也很高。 const 定义的只读变量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define 一样给出的是立即数,所以,const 定义的只读变量在程序运行过程中只有一份拷贝(因为 它是全局的只读变量,存放在静态区),而#define 定义的宏常量在内存中有若干个拷贝。 #define 宏是在预编译阶段进行替换,而 const 修饰的只读变量是在编译的时候确定其值。 #define 宏没有类型,而 const 修饰的只读变量具有特定的类型
#define M 3 //宏常量
const intN=5; //此时并未将 N 放入内存中
int i=N; //此时为 N 分配内存,以后不再分配!
int I=M; //预编译期间进行宏替换,分配内存
int j=N; //没有内存分配
int J=M; //再进行宏替换,又一次分配内存
同时const不但可以修饰变量,也可以修饰数组
比如
static const int day[10]={0,1,2,3,4,5,6,7,8,9};
当然const也是可以用来修饰指针的
void main()
{
int a = 10, b = 20;
int *p1 = &a;
*p1 = 100;
p1 = &b;
const int *p2 = &a;//*p不可改变,p可以改变
int const *p3 = &a; //*p不可改变, p可以改变
int * const p4 = &a;//*p可改变,p不可以改变
const int * const p5 = &a;//*p不可改变,p不可以改变
*p2 = 200;
p2 = &b;
*p3 = 200;
p3 = &b;
*p4 = 200;
p4 = &b;
p5 = &b;
*p5 = 200;
}*/
由于有了const,就出现了指针的赋值兼容性问题,比如
const int *p2 = &a;
int p3=p2;
这样原本不可以通过p来改变a的值,变为了可以通过p3来改变a的值,这样p指针的能力就被扩展了,这样编译就无法通过,所以在我们对指针进行赋值时,要注意指针的能力只能被缩小,不能被扩充
但是int *const p=&a;
int *s=p;
int const *s2=p;却可以被编译通过,是因为,当s不指向p后指向其他的内存空间时,p的指向并不会跟着改变