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**,因为这样会有让一个普通指针指向常对象的危险。
而在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**,因为这样会有让一个普通指针指向常对象的危险。
相关文章推荐
- 关于一维数组、二维数组、一级指针、二级指针、指针数组、数组指针、空指针、字符指针、const的个人理解
- const 和一级指针、二级指针、引用的结合使用总结
- 关于c++中const和指针结合的使用
- 经典笔试题:一级指针数组、二级指针数组和三级指针的联合使用详解
- 十二、c++指针 一级指针和二级指针
- C语言:结构体中一级指针和二级指针的创建与释放示例
- const 和二级指针的使用
- 一级指针与二级指针
- 关于对有一级指针,二级指针的初始化及其浅拷贝和深拷贝
- 一级指针还是二级指针作函数参数(2)
- C++ const与指针的结合
- 关于一级指针和二级指针的部分理解(I)
- 一级指针与二级指针作函数参数的内存分配
- C 结构体嵌套一级指针 二级指针 动态分配内存
- 一级指针, 二级指针
- 一级指针二级指针详解
- 一级指针,二级指针在函数调用传址问题。在子函数中分配内存。
- C++ 浅谈指针的用法:与const、一维数组、二维数组、typedef等结合
- 一级指针和二级指针
- const与指针结合的三种情况