const的新认识

来源:互联网 发布:铜排折弯算法 编辑:程序博客网 时间:2024/05/16 06:25
今天发现一个有趣的现象,有如下代码:
 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修饰全局变量和修饰局部变量,数据所存储的位置是不同的,所以对于局部变量可以通过获取它本身的地址来改变它的值,而全局变量却不行
原创粉丝点击