const的应用

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的指向并不会跟着改变

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值