
为什么不能将const指针赋给非const指针,而能反过来弄
4个回答
展开全部
防止你误操作嘛。。。
const修饰的对象不能进行写操作,如果你可以直接赋值不就能修改那个对象的值了嘛。。。
但是可以进行类型转换。。。
const int i = 0;
int* p = (int*)&i;
这样就没问题了,但是不推荐。理由同上。
其实C的类型限制很薄弱的。。
比如以下代码没有类型转换却也没有错误。
const int i = 0;
const int** pp;
int* p;
pp = &p;
*pp = &i;
*p = 1;
琢磨一下,就会发现以上代码是没有问题的。
所以使用的时候需要谨慎,以防不小心违背了const的意愿。
好了扯淡完毕。
展开全部
const 指针表示 所指向内容不能改变,假如你赋值给了一个非const指针,即一个值对应了2个指针,你可以通过操控非cons指针去改变值,这样就矛盾了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
在ANSI C中有关简单赋值有这样一段话,位于第6.3.16.1节,有下列约束条件
要使上述赋值形式合法,必须满足下列条件之一:
两个操作数都是指向有限定符或无限定符的相容类型的指针,左边指针所指向的类型必须具有右边指针所指向类型的全部限定符。
有两点要注意1,相容类型 2,右边有的左边也要有
char *cp;
const char *cpp;
cpp=cp;
左操作数是一个指向有const 限定符的char类型的指针。
右操作数是一个指向没有限定符的char类型的指针。
两个都是char类型,相容,左操作有限定符const,右操作无限定符。所以,左操作所指向的类型具有右操作的所指向类型的全部限定符。故可以赋值。
反过来
cp=cpp;
左操作无限定符,右操作有,不满足条件——左边指针所指向的类型必须具有右边指针所指向类型的全部限定符。所以不可以赋值。
当然从const的性质可知,const char *cpp 意味着 *cpp不能被修改,也就是指向的值不可被修改,而如果可以有一个指针能指向这个值,而我们又可以通过指针去改变它的值,这就违背了const 的性质。所以下面语句可以赋值。
const char *cp;
const char **cpp;
cpp=cp;
cp=cpp;
更多的
char **cp; 类型是”指向char类型的指针的指针
const char **cpp; 类型是“指向有const限定符的char类型的指针的指针“
它们指向的类型就已经不同。前者指向char *后者指向const char *,所以它们是不相容的。
cpp=cp;
cp=cpp;
两个都不可以。
要使上述赋值形式合法,必须满足下列条件之一:
两个操作数都是指向有限定符或无限定符的相容类型的指针,左边指针所指向的类型必须具有右边指针所指向类型的全部限定符。
有两点要注意1,相容类型 2,右边有的左边也要有
char *cp;
const char *cpp;
cpp=cp;
左操作数是一个指向有const 限定符的char类型的指针。
右操作数是一个指向没有限定符的char类型的指针。
两个都是char类型,相容,左操作有限定符const,右操作无限定符。所以,左操作所指向的类型具有右操作的所指向类型的全部限定符。故可以赋值。
反过来
cp=cpp;
左操作无限定符,右操作有,不满足条件——左边指针所指向的类型必须具有右边指针所指向类型的全部限定符。所以不可以赋值。
当然从const的性质可知,const char *cpp 意味着 *cpp不能被修改,也就是指向的值不可被修改,而如果可以有一个指针能指向这个值,而我们又可以通过指针去改变它的值,这就违背了const 的性质。所以下面语句可以赋值。
const char *cp;
const char **cpp;
cpp=cp;
cp=cpp;
更多的
char **cp; 类型是”指向char类型的指针的指针
const char **cpp; 类型是“指向有const限定符的char类型的指针的指针“
它们指向的类型就已经不同。前者指向char *后者指向const char *,所以它们是不相容的。
cpp=cp;
cp=cpp;
两个都不可以。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
const作为一个标记,标记它所定义的变量为常量,试图将常量修改为非常量,编译器会报错,这是编译检查,反过来肯定是没有问题的了,在C语言中可以通过指针强制将常量改变,
const int i = 2;
char * p = &i;
*p = 3;
这时i = 3;你去试试,很久没用了
const int i = 2;
char * p = &i;
*p = 3;
这时i = 3;你去试试,很久没用了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询