| 
 一、static和extern修饰局部变量  
 1、static与extern对局部变量的作用 1)延长局部变量的声明周期,从程序到程序退出,但是它并没有改变程序的作用域 2)定义变量的代码在整个程序运行期间仅仅会执行一次 例如: - #include <stdio.h>
 
 -  
 
 - //没有使用static修饰局部变量
 
 - void sum(){
 
 -     int sum = 0;
 
 -     printf("%d\n", sum++);
 
 - }
 
 -  
 
 -  
 
 - //使用static修饰局部变量
 
 - void sum2(){
 
 -     static int sum = 0;
 
 -     printf("%d\n", sum++);
 
 - }
 
 - int main(int argc, const char * argv[])
 
 - {
 
 -  
 
 -     // 没有使用static修饰局部变量
 
 -     printf("没有使用static修饰局部变量:\n");
 
 -     sum();
 
 -     sum();
 
 -     sum();
 
 -     
 
 -     // 使用static修饰局部变量
 
 -     printf("使用static修饰局部变量:\n");
 
 -     sum2();
 
 -     sum2();
 
 -     sum2();
 
 -     return 0;
 
 - }
 
  复制代码 
 
打印结果: 没有使用static修饰局部变量: 0 0 0 使用static修饰局部变量: 0 1 2  
分析结果: 使用局部变量后,每次对局部变量的修改都会影响下一次调用它的而结果。因为静态变量的定义只会被执行一次,每次调用函数时并没有真的释放掉该静态局部变量。因此每次修改的都是该局部变量。此时,【静态局部的变量的声明周期被延长了】。  
 
【注意】1、extern是不能够修饰局部变量的 例如: - void sum3(){
 
 -     extern int sum = 0;//会报错
 
 -     printf("%d\n", sum++);
 
 - }
 
  复制代码 
 
 
 
二、static和extern修饰全局变量  
 1、static 对全局变量的作用 static修饰的全局变量,表示该全局变量只能在该文件中使用,而不能在其他文件中访问。 例如: 在Test.h头文件中 - //声明一个静态变量
 
 - int age;
 
 - //定义一个全局变量
 
 - static int staticAge;
 
 -  
 
 - //声明一个函数访问age的值
 
 - void showAge();
 
 -  
 
 - 在Test.c源文件中
 
 - #include "Test.h"
 
 - //定义一个普通变量
 
 - int age = 10;
 
 - //定义一个全局变量
 
 - static int staticAge =20;
 
 -  
 
 - //定义一个函数访问age
 
 - void showAge(){
 
 -     printf("调用显示静态变量的函数:static age = %d\n", staticAge);
 
 - }
 
  复制代码 
在main.c源文件中 - #include <stdio.h>
 
 - #include "Test.h"
 
 -  
 
 - int main(int argc, const char * argv[])
 
 - {
 
 -     printf("访问普通全局变量:age = %d\n", age);
 
 -     printf("直接访问静态全局变量:static age = %d\n",staticAge);
 
 -     showAge();
 
 -     return 0;
 
 - }
 
  复制代码 
打印结果:  
访问普通全局变量:age = 10 直接访问静态全局变量:static age = 0 调用显示静态变量的函数:static age = 20  
分析结果: 由结果可知,静态全局变量只能在定义的文件内使用,因此也称为内部变量。  
【注意】在不同的文件中,使用static可以声明同名的变量  
2、extern修饰的全局变量 表示当前变量,可以在本文件中使用,也可以在其他文件中使用。 例如: 把上例中 Test.h 文件中的 static int staticAge; 改成 extern int staticAge;  
把Test.c文件中的 static int staticAge =20; 改为: extern int staticAge =20;  
在编译执行,结果为:  
直接访问extern全局变量:static age = 20  
【注意】1、extern声明的全局变量(在文件A中),如果B 文件包含A,那么B文件中就不能声明同名的变量。 2、变量定义为全局变量时,可以省略extern 3、不能用extern不能声明不存在的变量,即声明的变量,要么在本文件定义要么在其他文件有定义。  
4、全局变量默认初始化为0  
 
三、static和extern修饰函数 1、static和extern对函数的作用 1)static修饰的函数只能用在本文件,在其他文件中引用时会报错,就是内部函数。  
 
2)extern修饰的函数不仅能在本文件中使用,也能在其他文件中使用。一般可以省略掉extern关键字。  
 |