您的位置:首页 > 其它

const与一级指针二级指针结合

2017-11-06 17:48 169 查看
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**,因为这样会有让一个普通指针指向常对象的危险。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: