博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C语言查漏补缺——const
阅读量:6899 次
发布时间:2019-06-27

本文共 1670 字,大约阅读时间需要 5 分钟。

一、const的作用

const修饰的变量,变成了一个不可修改的常量,比如
int c = 0;这个时候,c是可以修改的,但是加上const以后,c的值就变成常量,
const int c = 0; 如果这个时候令c = 2;那么程序就会报错。
这就是const的主要作用,但是,在C语言中,const修饰的变量真的就是一个常量吗?

二、const的"bug"

我们看下面这段代码

int main(){    const int cim_test = 1;    printf("cim_test = %d\n", cim_test);    int *p1 = &cim_test;    *p1 = 3;    printf("cim_test = %d\n", cim_test);    return 0;}
这段代码,运行结果如下

C语言查漏补缺——const

不是说好的const修饰的变量是一个常量吗?常量是什么,就是初始化以后,直到程序结束,值都不会改变的量。为什么这里被改变了呢?

三、const的几种情况

在回答上面的问题之前,我们先考虑const会出现的几种情况,
1、const修饰static局部变量
2、const修饰全局变量
3、const修饰局部变量

第一种情况,这个时候的局部变量受到static的影响更大,因此,存储在只读存储区上,无法进行修改。

第二种情况,这个时候的就要看编译器了,如果是早期的编译器,比如BCC这种的话,变量是存储在全局数据区,而如果先一些现代c编译器的话,那么,编译器会优化,将其存储于只读存储区。
第三种情况,这是比较常见的,这种时候,变量是存储在栈上的,因此,我们可以通过指针指向这段内存,然后修改这个值

因此,得出结论====>在C语言中,const修饰的变量,并不完全是常量。

下面是测试代码

#include 
const int cig_test = 2;int main(){ const int cim_test = 1; const static int cism_test = 3; printf("cim_test = %d\n", cim_test); int *p1 = &cim_test; *p1 = 3; printf("cim_test = %d\n", cim_test); int *p2 = &cig_test; *p2 = 4; //不确定,需要知道编译器是现代编译器,还是古老的标志编译器 printf("cig_test = %d\n", cig_test); int *p3 = &cism_test; *p3 = 5; //报错,加上static修饰的变量,存储在只读存储区 printf("cism_test = %d\n", cism_test); return 0;}

四、const的扩展

我们可以利用const的这个属性来规范一些代码编写。
1、const修饰的函数参数,在函数内部不允许修改。
2、const修饰的函数返回值,表示函数的返回值不可以修改
#include <stdio.h>

const char* f(const int i)  {      i = 5;    //error,const变量不能作为左值      return "Hello World";    //返回指向只读存储区的指针  }  int main()  {      char* pc = f(0); //waring      printf("%s\n", pc);      pc[6] = '_';    //error,不能修改只读存储区的内容      printf("%s\n", pc);      return 0;  }

转载于:https://blog.51cto.com/12876518/2108152

你可能感兴趣的文章
撩课-Web大前端每天5道面试题-Day33
查看>>
快捷键方式
查看>>
使用pug模板中的问题
查看>>
Shell基础之运算符 & 环境变量配置文件
查看>>
乖乖兽:是什么让你减肥会反弹?这3点很多人都没注意
查看>>
变量作用域和作用域链
查看>>
MAC下安装配置Tomcat
查看>>
GMQ钱包APP全方位保证数字货币资产安全
查看>>
Android 开发面经,历时两月斩获BAT+头条四个公司 Offer
查看>>
Logstash/Elasticsearch/Kibana安装
查看>>
命令别名:保护和服务
查看>>
Ubuntu 常用软件推荐(QQ、微信、MATLAB等)及安装过程
查看>>
Gradle 使用技巧(二) - SO/NDK过滤
查看>>
Java核心技术笔记 对象与类
查看>>
创建本地git仓库
查看>>
css实现开关switch插件
查看>>
Android O 后台startService限制浅析
查看>>
【vue-page-stack】Vue页面堆栈管理器
查看>>
解构赋值 —— ES6基础总结(三)
查看>>
Cocos2dx源码记录(10) CCRenderer
查看>>