C语言 const static 静态变量 全局变量 局部变量

来源:互联网 发布:oracle update sql语句 编辑:程序博客网 时间:2024/05/16 14:41
  • 静态存储区:存放全局变量和静态变量,在执行程序前分配存储空间,占据固定的存储单元。
  • 动态存储区:存放函数的局部变量、函数的返回值、行参等。


存储类别分类:

  1. 自动(auto)非静态变量的局部变量即为自动变量。在C语言中,函数内没有存储类别说明的变量均视为自动变量。
  2. 寄存器(register)使用寄存器变量是为了提高执行效率,因为频繁地从内存单元存取变量相比于从寄存器中存取变量需要消耗更多的时间。只有局部变量才可以定义成寄存器变量。但不能大量使用寄存器,因为寄存器的数目有限。
  3. 静态(static)静态变量不属于动态存储,属于静态存储。静态局部变量的生存周期虽然是从程序开始运行到程序运行结束,但是它的作用域仍然与其作为自动变量的作用域相同。静态全局变量,只能在被定义的..c文件中使用,不能被其它.c文件中的函数调用。静态局部变量在它所在的函数被执行时进行初始化,之后再次执行该函数时,该静态局部变量不再进行初始化,保存的是上一次的运算结果。静态全局变量的初始化是在执行main()函数之前完成的,其静态全局变量的当前值由最近一次对它的赋值操作来决定。
  4. 外部(extern)外部存储类别定义方式为在全局变量类型前面加上关键字extern,如果没有指定全局变量的存储类别,则默认为extern。

如何区分const char*p 和char* const p?

画一条垂直线穿过上述指针声明的星号位置,如果const出现在线的左边,指针指向的数据为常量;

如果const出现在线的右边,指针本身为常量,不能改变指针P的指向。

静态变量和全局变量都储存在一个叫静态存储区的内存区域内,但是它们有区别。

static的第一个特性是静态静态存储区与栈不同,不会伴随着函数的退出而消失。static类型的变量,如果不初始化,值为0。而不是像某些自动变量那样是一个随机数。就算你把它定义在一个函数内,它也不会随着函数的退出而消失,所以经典的用法就是用来统计这个函数被调用了多少次。

全局变量也可以达到这个效果。但是有缺陷,全局变量的一个特点是所有的函数都能访问它。一旦该全局变量被修改,你都不知道是谁动了它。

static的第二个特性是隐藏,只在定义它的范围内可见,其它函数对它不可见。所以能避免上面讲的全局变量出现的尴尬现象。static用来修饰函数,这个函数只在当前的.c文件中可见。

全局变量,也称外部变量,在函数体外定义。全局变量可分为外部全局变量静态全局变量。使用static存储类别的全局变量只能在被定义的源程序文件中使用,而使用extern存储类别的全局变量不仅可以在被定义的.c文件中使用,还可以被其它.c文件中的函数引用。

阅读全文
0 0
原创粉丝点击