zoukankan      html  css  js  c++  java
  • c++和c中const的区别

    const在c与c++的区别与使用

    大学期间对c和c++的了解太少了,现在工作了导致自己来恶补,简单的const关键字里面的学问还是挺大的,越是基础的知识越是容易忘却,所以今天开始记录着自己每一天的学习结果。

    1.在c语言中const

    在C语言中 const关键字用来修饰变量名为只读,仅此而已。

    也就是说通过变量名不可以修改它的值,但是可以通过得到它的地址来修改他的值。

    #include<stdio.h>
    int main(){
        const int a = 10;
        int *p = (int *)&a;
        *p = 20;
        printf("a = %d\n",a);
        return 0;
    }
    

    同时被const修饰的全局变量也就是外连接,其他源文件要引用只需要加上extern即可。
    被const修饰的全局变量不能以地址的形式进行修改,由于它在内存中位于常量区,他的地址空间是只读的。在C语言中被const的变量是直接被分配内存的。

    2.c++中的const

    2.1 c++中const的使用

    c++中 const关键字被用来表示常量,和#define的作用一样。
    在C++中能否通过地址来改变它的值,取决于是否给他分配了内存。主要分以下三中情况
    1、const int a = 10;
    这种情况是不分配内存的,直接被写在符号表中,即使后面被分配了内存,那么a的值也不会被改变,输出的值一直都是符号表中的值

     ```
      #include<iostream>
      int main(){
          const int a = 10;
          std::cout << "original a =" << a <<  std::endl;
    
          int *p = (int *)&a;
          *p = 200;
          std::cout << "*p =" << *p <<  std::endl;
    
          std::cout << "last a =" << a <<  std::endl;
          return 0;
      }
     ```
    

    测试结果如下图所示:

    2、int b =100;
    const int a = b;

    3、const person per ={"name","id"}

    2和3这种情况都是直接分配内存的,并不会被写在符号表中,它的值是可以通过地址访问的方式来改变的。

    2.2 c++中const的使用建议

    在c++中尽量将宏定义#define 替换为 const
    由于#define在编译的预处理阶段就替换为相对应的常量,假如 #define Max 1024; 那么我们在由于这发生错误,他只会提示1024出现错误,
    而我们换成const int Max = 1024;系统就会提示我们这一行发生了错误,并且定义到相对应的行。

    2.3 常量指针与指针常量的区别

    这一题目都是面试中好多公司愿意问的问题,刚好学习到这,就把这块也纳入到本章节中。

    指针常量
    int *const p;,顾名思义它是一个常量,只不过被指针修饰。

    int a = 10, b =20;
    int *const p = &a;
    
    p = &b; //×
    *p = 30; //√
    

    常量指针
    const int *p;p是一个常量

    int a = 10, b =20;
    int *const p = &a;
    
    p = &b; //√
    *p = 30; //×
    
    

    2.4 练习题

    指向常量的指针常量
    int * const p; //指针常量
    const int * const p;//指向常量的指针常量

  • 相关阅读:
    [三]JavaIO之IO体系类整体设计思路 流的概念以及四大基础分类
    [二] JavaIO之File详解 以及FileSystem WinNTFileSystem简介
    [一]FileDescriptor文件描述符 标准输入输出错误 文件描述符
    [零] JavaIO入门简介 程序设计语言 为什么需要IO库
    装饰器模式 Decorator 结构型 设计模式 (十)
    适配器模式 adapter 结构型 设计模式(九)
    layui 鼠标悬停单元格显示全部
    mysql 日期总结
    区域块路由与全局路由兼容,双重路由
    JS-SDK相关参考
  • 原文地址:https://www.cnblogs.com/TelSunny/p/15558465.html
Copyright © 2011-2022 走看看