一、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关键字。
|