C语言Review3_static关键字,全局变量和局部变量

static关键字的使用比较微妙;

static修饰函数:
static修饰的函数,仅限在本源码文件中使用;不能被本源码以外的代码文件调用;
静态函数的声明不应该放在头文件里,应该放在静态函数所在的文件里。
static函数只能在本编译单元有效,编译器只有该函数的入口的地址,没有该函数名,其它的编译单元无法通过函数名取得该函数的入口地址。
普通的函数默认是有外链接特性的;

static修饰变量:
1)修饰全局变量:
    全局变量是不在任何代码块中声明的变量;简单来说就是{}以外的变量;
    全局变量具有静态的存储属性,存在于静态内存中,在程序运行前就被创建,并且伴随整个程序的生命周期。而且具有外链接属性;
    如果使用static关键字修饰全局变量后,全局变量就不具有外链接属性了。也就是说只能在定义该变量的文件中使用它,不能在其他文件中使用它。
2)修饰局部变量:
    局部变量是指在{}定义的变量。特定是生命周期短作用范围小,只在{}内有效,一旦程序运行离开了{},它就会被销毁。它存在于栈空间中。
    但是如果用static关键字修饰它,它就变成了静态类型,其生命期就等于整个程序的生命期,并且存在于静态空间中。



内存分为以下几个区域:
常量存储区:这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改,程序结束后由系统释放。
程序代码区:存放函数体的二进制代码;
全局区(静态区):全局变量和静态变量都存放在这里;初始化的放在一个区域,未初始化的放在相邻的另一个区域;
堆区:程序运行过程中,有程序员动态申请和释放;若申请了堆区内存,之后忘记释放内存,很容易造成内存泄漏;就是需要我们自己手动申请和释放;
栈区:存放函数内的局部变量,形参和函数返回值;栈区之中的数据的作用范围过了之后,系统就会回收自动管理栈区的内存(分配内存 , 回收内存);就是系统帮我们申请和释放;



全局变量存放在静态存储区,位置是固定的。 局部变量在栈空间,栈地址是不固定的。
局部变量:内部变量,在函数内作定义的;其作用域仅限于函数内,离开函数后再使用该变量就是非法的。保存在栈中,在函数被调用时,才由系统动态在栈中分配临时性的存储单元。
全局变量:静态变量+外部变量;都是保存在全局存储区,永久性占用存储单元。


全局变量全局静态变量的区别:
若程序由一个源文件构成时,全局变量与全局静态变量没有区别
若程序由多个源文件构成时,全局变量与全局静态变量不同:全局静态变量使得该变量成为定义该变量的源文件所独享,即:全局静态变量对组成该程序的其它源文件是无效的。
全局变量具有外部链接的静态,可以在所有源文件里调用,除了本文件,其他文件可以通过extern的方式引用。

全局变量是不显式用static修饰的全局变量,但全局变量默认是外链接性的,作用域是整个工程,
在一个文件内定义的全局变量,在另一个文件中,通过extern 全局变量名的声明,就可以使用全局变量。

全局静态变量是显式用static修饰的全局变量,作用域是声明此变量所在的文件,其他的文件即使用extern声明也不能使用。
其实全局静态变量和全局变量的区别就是在于有没有外部链接性;

全局变量的使用

如果一个变量多次在多个函数体内使用,这样的就可以使用全局变量
全局静态变量只能在它被声明的文件中使用,不能跨文件引用;



参考链接:

C语言中变量的存储类型:https://www.cnblogs.com/grooovvve/p/9782550.html

C语言中变量,全局变量与变量的作用域:https://www.cnblogs.com/grooovvve/p/9782483.html

C语言中extern用法:https://www.cnblogs.com/grooovvve/p/9782391.html

原文地址:https://www.cnblogs.com/grooovvve/p/14166565.html