1、const的做用
const修饰的变量,变成了一个不可修改的常量,好比int c = 0;
这个时候,c是能够修改的,可是加上const之后,c的值就变成常量,const int c = 0;
若是这个时候令c = 2;
那么程序就会报错。
这就是const的主要做用,可是,在C语言中,const修饰的变量真的就是一个常量吗?ide
2、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; }
这段代码,运行结果以下
不是说好的const修饰的变量是一个常量吗?常量是什么,就是初始化之后,直到程序结束,值都不会改变的量。为何这里被改变了呢?测试
3、const的几种状况
在回答上面的问题以前,咱们先考虑const会出现的几种状况,
一、const修饰static局部变量
二、const修饰全局变量
三、const修饰局部变量优化
第一种状况,这个时候的局部变量受到static的影响更大,所以,存储在只读存储区上,没法进行修改。
第二种状况,这个时候的就要看编译器了,若是是早期的编译器,好比BCC这种的话,变量是存储在全局数据区,而若是先一些现代c编译器的话,那么,编译器会优化,将其存储于只读存储区。
第三种状况,这是比较常见的,这种时候,变量是存储在栈上的,所以,咱们能够经过指针指向这段内存,而后修改这个值。指针
所以,得出结论====>在C语言中,const修饰的变量,并不彻底是常量。code
下面是测试代码blog
#include <stdio.h> 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; }
4、const的扩展
咱们能够利用const的这个属性来规范一些代码编写。
一、const修饰的函数参数,在函数内部不容许修改。
二、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; }