变量分类
作用域分类
局部变量(默认是自动局部变量)1. 定义:在一个函数内部定义的变量(包括函数形参)
2. 有效范围:一直在本函数有效
3. 变量存储:栈内存,函数结束之后自动销毁
4. 静态局部变量:存储在静态存储区,作用域依旧在函数体内部。每次对其修改都会被保存下来。
局部变量出现在一个作用域内,它们是局限于一个函数的.局部变量经常被称为自动变量,因为它们在进入作用域时自动生成,离开作用域时自动消失.
全局变量
1. 定义:在函数外部定义的变量,可为本源文件中其他函数使用
2. 有效范围:从定义变量的位置开始到本源文件的结束
3. 变量存储:存储在静态存储区域(静态内存)
4. 可被工程项目其他文件的 extern 声明之后调用(当作外部变量),对其每次修改都会进行保存
5. 静态全局变量:不能被其他源文件使用,只能本源文件使用,并且每次修改会被保存
全局变量是在所有函数体的外部定义的,程序的所有部分(甚至其他文件中的代码)都可以使用.全局变量不受作用哉的影响,总是可用的(也就是说,全局变量的生命期一直到程序的结束)
生存周期分类
静态存储方式——程序运行期间分配固定的存储空间的方式
动态存储方式——程序运行期间根据需要进行的动态分配空间的方式
又可分为
1. auto(自动)——默认,数据存储在动态存储
2. static(静态)——函数在调用结束之后会保存本次调用的数值
3. register(寄存器)——在声明动态局部变量或者函数形参时,可将变量声明为register,这样编译系统就会为变量分配一个寄存器而不是内存空间,通过这种方式可提升对某些局部变量频繁调用的程序的性能。(寄存器运算速度远高于内存)
4. extern (外部)——扩展全局变量的作用域
静态变量是指那些本不应该在程序整个生命期里存在的变量可以在程序的整个生命期里存在的变量(如局部变量),要达到这样的效果,只要在这样的变量前加上static就可以了,static变量的是在函数范围之外他是不可用的,所以它不可能被轻易地改变,这会使错误局部化,static的另一个意思是:在某个作用域外不可访问.当使用static于函数名和所有函数外部的变量时,它的意思是"在文件的外部不可以使用这个名字",函数名或变量是局部于文件的.
外部变量是指在文件a中定义了一个全局变量,在文件b中声明并使用这个全局变量时,这个全局变量对于b来说是外部变量
全局变量与外部变量的区别
全局变量是在函数的外部定义的,它的作用域为从变量定义处开始,到本程序文件的末尾。
如果外部变量不在文件的开头定义,其有效的作用范围只限于定义处到文件终了。
如果同一个源文件中,全局变量与局部变量同名,则在局部变量的作用范围内,全局变量被“屏蔽”, 即它不起作用。
如果写在文件的开头,可以省略extern。
在静态存储区分配存储空间
#include<stdio.h> #include <process.h> int a=5;//全局变量a,写在文件的开头,省略extern void Print_a( ) { int a=10;//全局变量被屏蔽 printf("%d\n",a); } int main(void) { printf("%d\n",a); Print_a( ); system("pause"); return 0; } 结果: 5 10
全局变量在整个程序中起作用,如果程序包含多个程序文件模块,可以通过外部声明,使得全局变量的作用范围扩展到其他模块,也可以通过定义静态全局变量,使其作用范围仅限制在这个模块
外部变量
全局变量只能被定义一次,如果其他模块要使用该全局变量,需要通过外部变量的声明。
外部变量声明格式: extern 变量名表;
只起说明作用,不分配存储单元,对应存储单元在全局变量定义时分配。
main.c
#include <stdio.h> int count ; extern void write_extern(); int main() { count = 5; write_extern(); }
support.c
#include <stdio.h> extern int count; void write_extern(void) { printf("count is %d\n", count); }
静态全局变量
当程序只有一个文件模块,其与一般全局变量作用相同; 当程序有多个模块时,C语言静态全局变量的作用范围局限于该模块。