C语言中const只读变量及常量的注意事项
来源:互联网 发布:sql declare怎么运行 编辑:程序博客网 时间:2024/04/30 21:53
- C语言中存在const修饰的变量,一般我们会直接称作“常量”,但是其实更准确的称为只读变量。位置:内存堆栈。只读的性质由编译器赋予,人为修改编译不过。
只读变量需要初始化,不然编译报错,因为定义性声明时如果不初始化,之后不允许初始化,这个变量就没有意义了。- 其实在C语言中存在真正的常量,如:char *p = “Hello World”,”Hello World”就是真正的常量。位置:内存的常量存储区(内存中真正的只读区域)。只读的性质由操作系统赋予,所以人为修改编译通过,但是运行崩溃。
- 这篇写得比较简单,如果想深究,请看:http://blog.csdn.net/csdn_lsd/article/details/78420320
参考:https://jingyan.baidu.com/article/59a015e3522575f7948865c1.html
只读变量
- 虽然变量由const修饰,但是从本质上仍然是变量,所以存储在堆栈和静态存储区,这些区域从进程角度讲是可读可写的,但是为什么const修饰后就不可写了。
- 原因:
C语言编译主要分为编译和链接两个部分,如果人为修改只读变量,在编译器编译阶段(第二步:编译过程,做语法检查,生成汇编)检查语法错误的时候将报错,这就是C语言规定的语法,而不是const修饰的内存空间的属性变成了只读,所以我们当然可以修改这个空间的值了,只不过我们需要获取这个空间的地址,指针。
#include <stdio.h>int main(void){ const int i = 100; //int *p = &i; //warning:initialization discards ‘const’ qualifier from pointer target type //初始化从指针目标类型中丢弃'const'限定符 int *p = (int *)&i;//&i是(const int *),强转为(int *),不会警告 *p = 200; printf("now the value of i is %d\n",i); return 0;}
输出:
windows:the value of i is 100
ubuntu:the value of i is 200
常量
#include <stdio.h>int main(void){ char *p = "hello world"; *p = 'w';//编译通过,不报warning return 0;}
- 这段代码可以通过编译的第二步:编译过程,生成汇编代码,但是运行时程序崩溃。常量放在内存中的静态区的常量区,这块空间由系统管理,编译器无权管理,所以编译时不报警告,运行时崩溃。
总结
- const变量和常量从本质上来说是不一样的,他们在进程中所处的区域,及他们的属性的控制都是不同的。所以对它们进行操作的错误也是不同,即管理它们的对象不同,只读变量由编译器约束和常量由操作系统去约束。
阅读全文
0 0
- C语言中const只读变量及常量的注意事项
- 常量与只读变量的区别(const)
- C语言 用const修饰符定义只读常量,只读常量与#define定义的符号常量的区别
- c语言中的只读变量const
- const 引出的对常量,变量,只读变量的讨论
- C++中 Const 常量的用法,及变量的初始化
- const常量和readonly只读变量
- php 中静态变量static 全局常量const的使用注意事项
- C语言中,常量=const?
- C语言之变量、常量(define\const)、变量的声明和定义
- const 修饰的只读变量
- C++ 常量折叠和C语言中const常量对比
- C语言中变量的地址是一个常量
- C 语言中符号常量与常变量的区别
- C语言中const char* 和char* const等常量的正确理解
- C语言const 限定词真正的含义“只读的”
- C语言中变量和常量
- C语言中 常量和变量
- 【个人训练】(ZOJ3983)Crusaders Quest
- day12-IO【转换流,打印流,序列化】
- 我的电路实践
- python的try...except
- Yii2.0 rules验证规则集合
- C语言中const只读变量及常量的注意事项
- day-13-对线程【Thread、线程创建】
- 通过MWeb上传Blog
- day-14-(网络编程【Socket网络编程】)
- 判断三角形,一个简单的水分支(不是分治)(坑了我三次提交)
- 11.01 早上 枚举+二分+并查集
- 交换排序
- ZOJ 3987 && 2017CCPC秦皇岛 G:Numbers(高精度+贪心)
- 获取应用版本号 iOS Swift