C语言进阶之const和static的比较分析

来源:互联网 发布:杭州软件开发招聘 编辑:程序博客网 时间:2024/05/17 22:13

温馨提示:观看本文之前务必先弄懂什么是栈区,堆区,动态区,静态区,只读区,代码段。
关于const很重要的一句话是:const修饰的变量不是真的常量,它只是告诉编译器该变量不能出现在赋值符号的左边,也即不能通过const修饰的变量去修改变量的值。
static关键字指明变量的”静态”属性,同时具有”作用域限定符”的意义。从字面的意思直译static是静态的意思,但是不好记忆和理解,所以你可以这样理解它,就好比它把变量关起来,不让变量到处跑,也不让别人来看望他。如果变量在函数里被static修饰就只能在函数里老老实实的呆着了,哪都不许去,断网断电,跟外界隔离;如果是全局变量或者函数本身被static修饰,那全局变量或者函数就只能在本文件内活动,打个比喻,文件比喻是国家,那就是说他只能在中国呆了,想出国旅游,没门!想让国外的朋友给他打电话或者来看他,想都别想了,还是洗洗睡吧。下面通过各个方面分析const和static的区别:
1、 修饰局部变量
const修饰局部变量,其存储位置还是在栈上的。表示该局部变量是只读的,但可以通过间接的手段修改它的值,如通过指针修改它的值。局部变量的作用域没有改变,跟普通局部变量是一样的。但是有一个特例:const static修饰的局部变量是存贮在只读存储区的。
static修饰局部变量,将局部变量由栈转到静态区存贮,指明了变量的”静态”属性,虽然是存贮在静态存贮区的,但是局部变量的作用域没有被改变。在其它函数或者其它文件不能访问它。
2、 修饰全局变量
const修饰全局变量,其存贮位置跟编译器有关系,对于现代C编译器如GCC,VC10.0,会将const修改的全局变量存贮于只读存储区,其值不可修改,如果试图去修改它的值会导致程序崩溃;对于支持标准C的编译器如BCC, 会将const修改的全局变量存贮于静态存储区,可以通过间接的手段修改它的值。对于const修饰全局变量其作用域没有被改变。
static修饰全局变量,全局变量本身就是存放在静态存贮区的,所以变量的存贮位置没有改变,还是静态存贮区。但是变量的作用域被改变了,被static修饰的全局变量被限制在本文件中使用,其它文件不能对它进行访问。关起来,断网断电,与外界隔离。
3、const修饰函数参数,如 int func(const int array[],int n) ,如果这个函数是一个函数库,它向使用这个函数的用户说明了:你传过来的array[]数组,本函数不会修改数组里面的值,你可以放心
地使用这个函数。如果函数库写成这样子int func(int array[],int n),那做为用户使用这个函数你就要小心了,因为这个函数有可能会修改你数组里面的值。
4、 const修饰函数返回值,表示返回值不可改变。如果返回值是一个变量的值,变量的值又是一个常量,用const修饰就没有意义了。所以多用于返回值为指针的情形。
5、 static修饰函数,表明该函数只能在本文件被使用。这样可以避免其它文件定义和使用这个函数。
6、 那么const volatile int i = 0;是什么意思呢?分析一下:i是变量,类型为int,被volatile修饰,表示每次都到内存取值并且不做任何优化,同时,i又被const修饰,表明i不能出现在赋值符号(=)的左边。简单来说,就是i是只读变量且不让编辑器对他进行优化,每次访问i时都得到内存取值。

原创粉丝点击