const与一级指针二级指针结合
const关键字在C和C++里修饰变量时,是不同的,在C++里const修饰的量是常量,
而在C里const修饰的量是常变量。关于const在C和C++里的不同我有时间再整理成另外一篇。
一、首先来确定一下到底const修饰的是谁。一句话,类型就近原则。
const int p; 此时离const最近的类型是int类型,所以const修饰的是 p,所以p不能被改变;
const int * p; 此时离const最近的类型还是int类型,所以const修饰的是 * p,所以 * p不能被改变,p可以被改变;
int * const p ; 此时离const最近的类型是int*类型,所以const修饰的是 p,所以p不能被改变;;
在C++里const修饰的是常量,那么就有以下2条重要的参考规则:
**1、常量不能当作左值;
2、不允许有指针或引用可以间接改变该常量的值。**
这两条规则是我们的重要参考依据。
******const与一级指针结合:
int a=10;
const int *p = &a;此时const修饰 *p,
*p = 20;//错误,不符合规则1.(常量不能当作左值;)
int*q = p;//错误,不符合规则2(不允许有指针或引用可以间接改变该常量的值。因为此时我们可以对q解引用,来改变*p)
const与二级指针结合:参考https://wenku.baidu.com/view/bbe7e708a300a6c30c229fa1.html
const int **p ,
int **const p,
int const *p的区别 参照第一点,你能够很快区分const int **p , int **const p的区别。 const int **p 表示**p代表的整形内存放的是常量,不能被修改,而指针p本身可以被任意修改赋值。 int **const p 表示**p代表的整形内存放的是变量,可以被任意修改,而指针p本身是不能被修改的 int *const *p是什么意思呢? 由于int const p是一个二级指针,那么const现在修饰的是int,代表*p的值是不能被修改的,通俗的说,也就是二级指针p所指向的一级指针*p是不能被修改的,而**p所代表的整形内存可以被任意修改,指针p本身也可以被任意修改! 对于二级指针综合const有一个重要的问题,如下,请看示例代码:
int a=10;
int *p=&a;
const int q=&p;//error! “初始化”: 无法从“int ”转换为“const int ” 也类似于这样的代码: int *p; const int **q=p; //error! “初始化”: 无法从“int ”转换为“const int *”
可以看出,c++不让我们把int**转换为const int**,这样不好吗?我们不是把类型的安全属性提高了吗?为什么反到禁止这样的类型转换呢? 当然c++这样做是出于安全考虑的,以防止我们修改常量对象。为了展现如何会修改常量对象,在这里我们做个假设,假设c++允许我们代码“const int **q=&p”的执
行,也就是允许我们把int**转换为const int**,请看实例:
int a=10;
int *p=&a;
const int **q=&p;//假设这一行代码c++允许执行
const int b=20;
const int *pb=&b;
* q=pb;//重点在这里,由于* q(* q就是指针p)是变量,pb指针也是变量,因此把pb赋值给* q,也就等于执行了p=pb,由于pb指向的是常量b,因此指针p也指向了常量b,但是看看p的定义 int * p, 没有任何const修饰,你可以通过* p修改内存的值,但是p代表的常量b,是不能被修改的,你试图通过非常量指针p去修改常对象是错误的!编译器不会答应这样的事情!通过上面例子,你应该知道c++为什么不允许我们把int*转换为const int**,因为这样会有让一个普通指针指向常对象的危险。
文章来源: blog.csdn.net,作者:IM-STONE,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/doubleintfloat/article/details/78460091
- 点赞
- 收藏
- 关注作者
评论(0)