C语言中变量的作用域和生命周期

C语言中变量的作用域和生命周期

1.普通局部变量

 在{ }内部定义的变量就是局部变量

 只有执行到定义变量的这个语句,系统才会给这个变量分配存储空间

 当离开{ }, 这个非static局部变量自动释放

 局部变量的作用域在当前的{ },离开此{ },无法使用

 不同的{ }中,变量名字可以一样,遵循就近原则 
    

2.static局部变量

 在{ }内部定义的变量就是局部变量
    
 static局部变量,是在编译阶段就已经分配空间,函数没有调用前,它已经存在
    
 当离开{ },static局部变量不会释放,只有程序结束,static变量才会自动释放
    
 局部变量的作用域在当前的{ },离开此{ },无法使用
     
 如果static局部变量不初始化,它的值默认为0。
     
 static局部变量初始化语句,只会执行一次,但是可以赋值多次。 
    
 不同的{ }中,变量名字可以一样
    
 static int i; static变量没有放在栈里,放在data区。
    
 static变量只能用常量初始化,变量不可以。

 普通局部变量和static局部变量的区别:
   
 内存分配和释放: 
    普通局部变量只有执行到定义变量的语句才分配空间
                        
    static局部变量在编译阶段,变量的空间已经分配
                                
    普通局部变量离开作用域{},自动释放
                
    static局部变量只有在整个程序结束才自动释放
    
 初始化 :    
   普通局部变量不初始化的时候,值为随机数
                       
   static局部变量不初始化的时候,值为0
                       
   static局部变量初始化语句只有第一次执行时候有效
                       
   static局部变量只能用常量初始化
 

3.普通全局变量 (外部链接)

 在{} 外面(函数外面)定义的变量为全局变量
 
 只有定义了全局变量,任何地方都能使用此变量
    
 如果使用变量时,在前面找不到此全局变量的定义,需要声明后才能使用

 普通全局变量不初始化的时候,默认赋值为0

 extern声明只是针对全局变量,不是针对局部变量
    
 普通全局变量只能定义一次,可以声明多次    
 
 声明extern int a; 定义 int a = 10;声明不同于定义
    
 普通全局变量在编译阶段已经分配空间(函数没有执行前),只有在整个程序结束,才自动释放。
    
 不同文件,普通全局变量只能定义一次,可以声明多次 
    
 分文件编程,在.h文件中放普通全局变量的声明,不要放定义,否则容易出现重复定义错误,编译不 通过。在.c文件中放定义。所以在.h文件中出现大量的extern声明 
    
 全局变量的建议:定义一个全局变量,建议初始化。如果声明一个全局变量,建议加extern 
    
    

4.static全局变量(内部链接)

 static全局变量和普通全局变量的区别即作用域不一样(文件作用域)
     
 extern关键字只适用于普通全局变量
     
 分文件编程,普通全局变量只能在一个文件中定义一次

 普通全局变量所有文件都能使用,前提是需要声明

 静态static全局变量只能本文件使用,别的文件不能使用

 不同文件只能出现一个普通全局变量的定义

 一个文件只能有一个static全局变量的定义,不过不同文件间的static全局变量,就算名字相同,也 是没有关系的两个变量。static全局变量更安全。

 不初始化时候值为0


5.普通函数和static函数的区别(文件作用域不一样)

 所有文件只能有一次普通函数的定义 

 每一个文件可以有一个static函数的定义

 普通函数所有文件都能调用,前提是使用前已经声明

 但是static函数只能在定义所在的文件中使用