栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

const和一级、二级指针以及一级指针和引用的结合

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

const和一级、二级指针以及一级指针和引用的结合

const修饰的变量不能再作为左值,初始化以后不能被修改。
const右边没有*时,如int *const p,这种时候const不参与类型,它就是int *,代表p是个int *的常量。
const修饰的是离它最近的类型

const与一级指针结合

const int *p : 离const最近的是int,去掉int后,const修饰的就是*p,代表*p不能被改变,即p指向的数据不能被改变,p可以被改变重新指向别的内存。 (常量指针)
int const* p : 离const最近的是*,但*不是类型,所以离const最近的还是int,去掉int,修饰的就是*p,也是代表*p不能被改变。(常量指针)
int *const p : 离const最近的是int*,去掉int*后,const修饰的是p,就是指针本身,代表p只能指向那一块内存不能被改变,但是内存的内容即*p(指针解引用)可以改变。(指针常量)
const int *const p : 上面两种类型的结合,第一个const修饰int,代表着指针指向的内容不能被改变,第二个const修饰int *,代表着指针指向的内容不能被改变。

const int* <= int*           //  正确
int* <= const int*           //  错误

const与二级指针结合

const int **q : 离const最近的是int,去掉int后,const修饰的就是**q,代表**q不能被改变,即最终指向的数据不能被改变,*q和q可以被改变重新指向别的内存。
int *const* q : 离const最近的是*,但*不是类型,所以离const最近的还是int*,去掉int*,修饰的是*q,代表*q不能被改变,**q和q可以被赋值。
int **const q : 离const最近的是int**,去掉int**后,const修饰的是q,就是指针本身,代表q只能指向那一块内存不能被改变,但是内存的内容即*q以及**q可以改变。

const int** <= int**           //  错误
int** <= const int**           //  错误
int ** const <= int**          //  正确 const右边没有*, 不参与类型,就是int** <= int**
int** <= int *const*           //  错误 
int* const * <= int**          //  正确  可以映射成 const int* <= int*  是正确的
int* const * <= const int**    //  错误

const int** <= int**错误原因:

int a = 10;
int *p = &a;
const int **q = &p;     //  编译出错

对const int **q而言,**q的指不能改变,但是*q可以改变。const int **q = &p相当于 *q = p, **q里面存的是const int 即整型常量,即*q里存的是常量指针。可以做如下操作:

const int b = 20;
*q = &b;

如果这么做,相当于

p = &b;

而p是int*型,&b是const int *,在一级指针转换中,int* <= const int* 是错误的。
所以const int** <= int** 也是错误的。改成如下就可以了。

int a = 10;
const int *p = &a;     //  将*q所指的p改成常量指针
const int **q = &p;

//  或者:
int a = 10;
int *p = &a;
const int * const *q = &p;   //   不允许*q被改变

int** <= int *const* 错误原因:

int a = 10;
int *const p = &a;
int **q = &p;     //  编译出错

int **q,认为*q是可以修改的,而int *const p认为p是不能修改的,所以矛盾了。

修改:

int a = 10;
int *const p = &a;
int *const *q = &p;   

int* const * <= const int**错误原因:

int a = 10;
const int *p = &a;
int *const *q = &p;     //  编译出错

int *const *q,认为**q是可以修改的,而const int *p 认为*p是不可以修改的,矛盾了。

修改:

int a = 10;
const int *p = &a;
int const **q = &p;  // const int *p没有要求p不能修改,所以改成int const **q,此处*可以修改

const与一级指针、引用的结合引用

1、

int a = 10;
int *p = &a;
int *&q = p;    //  正确

2、

int a = 10;
int *const p = &a;   
int *&q = p;    //  错误  因为 int *const p要求p不能被修改, q是p的引用, q可以修改, 矛盾

修改:

int a = 10;
int *const p = &a;   
int *const &q = p;   

3、

int a = 10;
const int *p = &a;   
int *&q = p;    //  错误  因为 const int *p要求*p不能被修改, q是p的引用, *q可以修改, 矛盾

修改:

int a = 10;
const int *p = &a;   
const int *&q = p;  

4、

int a = 10;
int *p = &a;   
const int *&q = p;    //  错误

把const int *&q = p 转换成 const int **q = &p,上面已经分析过,const int** <= int**这样转换是错误的。
具体分析:const int *&q 意味 *q的值不能变,而即*q放的是整型常量,即q里存的是常量指针, 但是q本身可以改变,可以做如下操作:

const int b = 20;
q = &b;

而q是p的引用,如果这么做,相当于

p = &b;

而p是int*型,&b是const int *,在一级指针转换中,int* <= const int* 是错误的。
所以这里也是错误的。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/347351.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号