黑马程序员----C语言学习笔记之static和extern关键字

------Java培训、Android培训、iOS培训、.Net培训--------
一、static和extern修饰局部变量

1、static与extern对局部变量的作用
1)延长局部变量的声明周期,从程序到程序退出,但是它并没有改变程序的作用域
2)定义变量的代码在整个程序运行期间仅仅会执行一次
例如:
  1. #include

  2. //没有使用static修饰局部变量
  3. void sum(){
  4.     int sum = 0;
  5.     printf("%d\n", sum++);
  6. }


  7. //使用static修饰局部变量
  8. void sum2(){
  9.     static int sum = 0;
  10.     printf("%d\n", sum++);
  11. }
  12. int main(int argc, const char * argv[])
  13. {

  14.     // 没有使用static修饰局部变量
  15.     printf("没有使用static修饰局部变量:\n");
  16.     sum();
  17.     sum();
  18.     sum();
  19.     
  20.     // 使用static修饰局部变量
  21.     printf("使用static修饰局部变量:\n");
  22.     sum2();
  23.     sum2();
  24.     sum2();
  25.     return 0;
  26. }
复制代码


打印结果:
没有使用static修饰局部变量:
0
0
0
使用static修饰局部变量:
0
1
2

分析结果:
使用局部变量后,每次对局部变量的修改都会影响下一次调用它的而结果。因为静态变量的定义只会被执行一次,每次调用函数时并没有真的释放掉该静态局部变量。因此每次修改的都是该局部变量。此时,【静态局部的变量的声明周期被延长了】。


【注意】1、extern是不能够修饰局部变量的
例如:
  1. void sum3(){
  2.     extern int sum = 0;//会报错
  3.     printf("%d\n", sum++);
  4. }
复制代码




二、static和extern修饰全局变量

1、static 对全局变量的作用
static修饰的全局变量,表示该全局变量只能在该文件中使用,而不能在其他文件中访问。
例如:
在Test.h头文件中
  1. //声明一个静态变量
  2. int age;
  3. //定义一个全局变量
  4. static int staticAge;

  5. //声明一个函数访问age的值
  6. void showAge();

  7. 在Test.c源文件中
  8. #include "Test.h"
  9. //定义一个普通变量
  10. int age = 10;
  11. //定义一个全局变量
  12. static int staticAge =20;

  13. //定义一个函数访问age
  14. void showAge(){
  15.     printf("调用显示静态变量的函数:static age = %d\n", staticAge);
  16. }
复制代码

在main.c源文件中
  1. #include
  2. #include "Test.h"

  3. int main(int argc, const char * argv[])
  4. {
  5.     printf("访问普通全局变量:age = %d\n", age);
  6.     printf("直接访问静态全局变量:static age = %d\n",staticAge);
  7.     showAge();
  8.     return 0;
  9. }
复制代码

打印结果:

访问普通全局变量: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关键字。

你可能感兴趣的:(c语言基础)