const的新认识

今天发现一个有趣的现象,有如下代码:
 void fun( char *p)
   {
     printf("%s\n",p);
   }
   int main()
   {
   const  char *a="abcdefg";
     fun(a);
   char *c;
   const char *b;
   c=b;
   b=c;
  }




Void fun(char *p) 和c=d这两行会出现waring 其实这两行都是相同的赋值语句,都是有const修饰的赋值给没有const修饰的。
也就是说只能把没有const修饰的赋值给有const修饰的,反之则waring 。
我在书上摘取以下这段话:
要使上述的赋值形式合法,必须满足下列条件之一:
两个操作数都是指向有限定符或无限定符的相容类型的指针,左边指针所指向的类型必须具有右边指针所指向类型的全部限定符。
正是这个条件,使得函数调用中实参 char *能够与形参const char *匹配即
Void fun(const char *a);
Mian()
{
 Char *b;
 Fun(b);
}正常而不产生waring,它之所以合法,是因为在下面代码中:
Char *cp;
Const char *ccp;
Ccp=cp;
左操作数是一个指向有const限定符的char的指针;
右操作数是一个指向没有限定符的char的指针;
Char类型与chat类型是相容的,左操作数所指向的类型具有右操作数所指向类型的限定符(无),再加上自身的限定符(const);
以上分析便解释了程序为什么会出现waring;
附: const下面定符是修饰指针所指向的类型,而不是指针本身;
关键字const并不能把变量变成常量,在一个符号前加上const限定符只是表示这个符号不能被赋值,也就是它的值对于这个符号来说是只读的,但它并不能防止通过程序的内部(甚至是外部)的方法来修改这个值。同时const修饰全局变量和修饰局部变量,数据所存储的位置是不同的,所以对于局部变量可以通过获取它本身的地址来改变它的值,而全局变量却不行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值