首先,编译器为什么会报错?????
1:编译器会一直检测代码是否有更改st常量的可能,如果存在这样的可能,编译器就会报错。
///编译器要保证不能直接或间接的去修改常量内存
2:怎样看有没有错误转换呢?????
(1)对于简单代码:看有没有把一个常量的地址或者引用泄露给普通的指针或者引用变量
(2)对于复杂代码:找代表同一块内存的两个表达式,看是否把常量的地址试图放在一个普通指针里面
----->其实总的来说错误就是:把普通指针修改成存放常量地址的指针。
几种类型转换的公式*******(以整型为例)
const int * -->int *:类型转换错误。《1》
int *-->const int *:类型转化正确。《2》
const int ** -->int **:类型转换错误。《3》
int **-->const int **:类型转换错误。《4》/后面我们会一一说明
************接下来我们先应该了解一下在c++中,const 位于*的左边和右边到底有什们区别呢?????
我们可以从运行的结果可以看出,当const 位于类型的*的左侧,指针类型中const是有参与的。
当const位于*的右侧时,const是不参与指针的类型的,此时int *const 就等价于int *,属于同一个类型。
******接下来我们看一看一些容易出错的例子
这个是否正确呢???我们用上面的公式来分析一下
p的类型为int **(p是int *,&p则为int **)
而q的类型应该是int **(const位于*的右边,不参与类型)
所以此代码是将int **赋给int **(正确)
*****我们再来看一些例子
///我们再来分析一下
首先&p的类型为int **,而q的类型为int *const*(以上有说明)
我们把两个指针的类型的前半部分int *看成一个整体(T表示)
则p的类型为T*,q的类型为Tconst*
所以此代码是将*转换成const *(正确)参见《2》
*****我们再来看一些例子
//我们可以看出图中有划红线的部分,当然编译不能通过
这个同样我们可以看出p所对应的*q;*p对应的是**q;
我们选择p <--->*q进行分析
p的类型为const int *,而*q 所对应的 int* ,(参见《1》,错误)
所以肯定会出错,所以我们必须将*q改成const int *,当然可以这样改:
/看,这样就不会出错
*****我们再来看一些例子
/结果是报错了,图中const int * &q = p中,它就相当与const int **q = &p,(&代表的是引用,不等于取地址符)
&p的类型为int **,q的类型为const int **(参见《4》,错误)
*****我们再来看一些例子
//当然,这个仍然存在错误,&p的类型为int *const*(&p就要给前面加*----->int *const *p),q的类型为int **,
我们把int *看成一个整体(T表示)
则代码的意思是将Tconst *转换成T*(参见《1》,错误),将const 去掉就可以了。
*****我们再来看一些例子
//这个是正确的,那我们来分析一下,
int *const &q = p可以写成int *const *q = &p;&p的类型为int *const *,而q的类型为int *const *,所以正确。
************************************************
以上就是一些常见的例子,觉得很实用,总结一下就是上面的几个公式,主要看赋值号两边的类型是否要求,另外,如果是二级以上的指针,跟二级指针遵守规则一致。