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


    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是绝对不能省去的

  • 相关阅读:
    HTML 防盗链 用src引用网上图片显示 403 Forbidden
    JS C# 正则表达式去除html字符中所有的标签(img em标签除外)
    net core 3.1使用ElasticSearch 全文搜索引擎
    VS2019开启调试,测试图片上传的时候,一点到图片上传,直接导致VS调试崩掉,返回 程序“[14764] iisexpress.exe”已退出,返回值为 -1 (0xffffffff)。 是什么原因导致的?
    NET 5 使用IdentityServer4 4.x
    服务器下配置springboot项目开机自启
    分布式技术文档
    win10系统ffmpeg命令初体验
    大数据Hadoop生态圈介绍
    MySQL之Explain详解
  • 原文地址:https://www.cnblogs.com/anqwjoe/p/16475581.html
Copyright © 2020-2023  润新知