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;//指向常量的指针常量

最新文章

  1. HDFS的架构
  2. 理解Docker(3):Docker 使用 Linux namespace 隔离容器的运行环境
  3. LayaAir引擎——(八)
  4. 高性能MySQL笔记 第6章 查询性能优化
  5. 20145223《Java程序程序设计》第3周学习总结
  6. dump redo日志文件的信息
  7. c#省市联动
  8. c++内置函数---7
  9. 本地开发时同时启动多个tomcat服务器
  10. JQuery操作select checkbox radio总结
  11. 手机自动化测试:Appium源码分析之跟踪代码分析六
  12. C语言代码训练(一)
  13. Chipmunk僵尸物理对象的出现和解决(五)
  14. centos7安装python3 以及tab补全功能
  15. windows下VMware-workstation中安装CentOS
  16. CodeForces - 375A Divisible by Seven(数学)
  17. css3实现好看的边框效果
  18. django restframework Serializers
  19. Spark算子之aggregateByKey详解
  20. sqlserver,杀掉死锁的进程

热门文章

  1. 新装centos机器基础配置之基础软件包安装
  2. java动态编译——tools.jar问题
  3. 日志审计功能-appent多个日志
  4. JDK中Lambda表达式的序列化与SerializedLambda的巧妙使用
  5. Linux检测磁盘空间
  6. Java异常与错误
  7. iNeuOS工业互联网操作系统,分布式云端控制安全策略和增加实时日志功能
  8. Codeforces 632F - Magic Matrix(暴力 bitset or Prim 求最小生成树+最小瓶颈路)
  9. BSA分析
  10. dlang 泛型