ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C++基础-const与一二级指针的结合

2022-07-23 12:00:25  阅读:132  来源: 互联网

标签:const 常量 int C++ 修饰 赋值 指针


const int a = 10;
int *p = &a; 
//会报错,常量地址不能泄露给指针
// 左:int* 右:const int*

const在C++中,修饰的常量不能作为左值,在编译过程中所有出现常量的地方都会用初始值替换。

const修饰的量常出现的错误是:

  • 常量不能再作为左值(试图直接修改常量的值)
  • 不能把常量的地址泄露给一个普通的指针或者普通的引用变量(间接修改常量的值)

const和一级指针的结合

const int *p; 
//const修饰*p,指针可以修改指向的int类型内存,但不能间接修改指向的值

int const* p;
//同上面的情况

int *const p;
//const修饰p本身,不能修改指向的内存,但可以通过指针解引用修改指向的值

const int *const p;
//上面的情况结合,不能修改指向内存,不能通过解引用修改指向的值

const 修饰的是离它最近的类型

总结const 和指针类型转换公式:

int a = 10;
const int *p = &a; //p此时是 整型常量 的 地址
int *q = p; //错误,类型不同,和a没有关系
  • int* <= const int * 转换错误 (有约束的不能给一个没约束的,怕解引用修改)
  • const int* <= int * 可以转换 (没约束的可以给一个有约束的,不怕解引用修改)
int *q1 = nullptr;
int *const q2 = nullptr; //q2本身是个常量,不能当左值用
cout<<typeid(q1).name<<endl; //int*
cout<<typeid(q2).name<<endl; //int*
  • const如果右边没有指针*的话,const是不参与类型的
  • int *const <= int * 可以转换 (int * 转 int *)
  • int * <= int *const 可以转换 (同理 int * 转 int *)

const和二级指针的结合

常见三种方式:

  • const int **q;
    • const修饰 **q , *q 可以被赋值,q本身也可以赋值
  • int * const * q;
    • const修饰 *q, **q可以被赋值,q本身也可以被赋值
  • int **const q;
    • const修饰 q, **q可以被赋值,*q本身也可以被赋值
int main(int argc, char const *argv[])
{
	int a = 10;
	int *p = &a;
	const int **q = &p; //const int** <= int** 错误

/*
q - 表示这块内存本身的值
*q - 指向的一级指针的值
**q - 指向的一级指针指向的变量的值
*/

转换公式:

int** <= const int** 转换错误

const int** <= int** 转换错误

int** <= int * const* 转换错误,这是const 和一级指针的结合(主要看const和右边的指针

int* const* <= int** 可以转换

const 和二级指针结合的时候 ,const是绝对不能省去的

标签:const,常量,int,C++,修饰,赋值,指针
来源: https://www.cnblogs.com/anqwjoe/p/16475581.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有