普通局部变量和static局部变量:
1、
① static局部变量在编译阶段就已经分配内存空间了,也就是函数没有调用前它就已经存在了。
② 普通局部变量只有运行到定义该变量的时候才会分配内存空间。
2、
① 当执行完定义该static局部变量的函数体后,该static变量的内存空间不会被释放,只有程序结束时static变量才会自动释放。
② 当执行完定义该普通局部变量的函数体后,该普通局部变量的内存空间就会被释放。
3、
① 如果static局部变量不初始化,那么它默认为0。
② 如果普通局部变量不初始化,那么它的值为随机数。
4、
① static局部变量的初始化语句只会执行一次,下次再运行该初始化语句就不会被初始化,但是它可以被多次赋值。
② 每次运行该普通局部变量的定义时该变量都会被初始化。
5、static变量是存放在Data区的,该区只有程序结束时才会被释放。
为什么static变量只能被常量赋值,而不能被变量赋值?
例如:
int a = 10;
static int b = a;
这样会报错,变量不能给static变量赋值,因为static变量是存放在Data区,它在程序编译阶段就在Data区了,但是普通变量只有在程序运行到初始化的时候才会被分配内存空间,所以static变量在编译阶段被没有初始化分配内存空间的普通变量赋值是错误的,只能用常量赋值。
普通全局变量:
1、在函数外面定义的变量为全局变量,任何地方都可以使用全局变量。
2、在使用全局变量时,如果在前面找不到该全局变量的定义,必须在前面进行声明才可以使用该全局变量,使用extern声明,而且extern声明只针对全局变量,不能使用在局部变量。
3、如果全局变量不初始化,那么默认赋值为0。
4、全局变量只能定义一次,但可以声明多次。
5、全局变量在编译阶段已经分配了内存空间,即函数没有执行前,只有在整个程序结束后才会自动释放内存空间(和static变量类似)。
6、普通全局变量的定义和声明:
① 定义一个全局变量并初始化:
int num = 100;
② 如果要声明一个全局变量,需要加extern:
extern int num;
static全局变量:
1、static全局变量和普通全局变量的区别就在于文件作用域的不同,static全局变量只能在定义的文件内使用,其它文件是不能使用的,而普通全局变量在所有文件都能使用,前提是需要声明。
2、extern关键字只适用于普通全局变量,不能跟static一起使用。
3、不同文件定义的static全局变量即使名字一样,也是不会有影响的,因为它们是没有关系的。