1、

/*文件1*/

 1 #include"f2.h"
 2 #include<stdio.h>
 3 int j=4;
 4 int f1(int m,int k){
 5     int f;
 6     if(n)//为什么可以直接用n?因为在编译连接时,f2.h文与main.c源文件链接,出现在main.c之前,可以这样说,对于链接的所有文件中,源文件在链表尾部,也就是说全局变量n在f1()函数前就已经定义了。
 7         n=k*n;
 8     j=m+j;
 9     f=n%j;
10     return f;
11 }
12 
13 int main(){
14 
15     int k,m,j;
16     extern int n;
17     extern int f2(int,int);
18     k=4;
19     m=3;
20     j=0;
21     printf("p1=%d\n",f1(n,m));
22     printf("p2=%d\n",f2(k,m));
23     printf("p3=%d\n",f1(n,j));
24     printf("p4=%d\n",f2(n,j));
25     printf("n=%d\n",n);
26     printf("j=%d\n",j);
27     return 0;
28 }

/*文件2   f2.h*/

1 int n=2;
2 int  f2(int a,int b){
3    static int m;
4     extern int j;
5     n=n*j+1;
6     j=j+m+1;
7     m=n+j+a+b;
8     return m;
9 }

运行结果:

 

 

 

 主要考察全局变量(有两种类型:static和extern)和局部变量作用域

 全局变量:在函数外部定义的变量称为全局变量。全局变量的作用域是从该变量定义的位置开始到整个源文件结束止。若全局变量中的局部变量同名,则在该函数中,这个全局变量被屏蔽,在该函数内,访问的是局部变量,与同名的全局变量不发生任何关系。可以跨越几个编译单位使用

局部变量:在函数内部或者复合语句内定义的变量称为局部变量,也称为内部变量。局部变量的作用域是定义该变量的函数或复合语句,在其他范围内无效。一般地,局部变量只有定义,没有声明,因为局部变量不能跨越几个编译单位使用。

static局部变量:



static局部变量
当在函数体(或复合语句)内部static来定义一个变量时, 称该变量为静态局部变量。静态局部变量的作用域与auto、 register类型的变量一 样,但它与这两种变量有两点本质上的区别:
●在整个程序运行期间,静态局部变量在内存的静态存储区中占据着永久性的存储单元。即使退出函数以后,下次再进入该函数时,静态局部变量仍使用原来的存储单元。由于并不释放这些存储单元,因此这些存储单元中的值得以保留。因而可以继经使用存储单元中原来的值。由此可见,静态局部变量的生存期一直延长到程序运行结束。

●静态局部变量的初值是在编译时赋给的,在程序执行期间不再赋初值.对未赋初值的静态局部变量,C编译系统自动给它赋初值0。

 


(2)全局变量的存储类别
全局变量有如下几种存储类别。

①static全局变量
当用static定义全局变量时,该变量称为静态局部变量。静态局部变量只限于本编译单位使用,不能被其他编译单位所引用。


②extern全局变量

在全局变量之前加上extern的作用有两种:

●在同一编译单位内用extern说明符来扩展全局的作用域。全局变量定义之后,引用它的函数在前,应该在引用它的函数中用extern对此全局变量进行声明,以便通知编译程序,该变量是一个已在外部定义了的全局变量,已经分配了存储单元,不需要再为它另外开辟存储单元。
●在不同编译单位内用extem说明符来扩展全局变量的作用城。一个C程序总是由许多函数组成,这些函数可以分别存放在不同的源文件中,每个源文件可以单独编译.这些可以单独编译的源文件称为“编译单位”。每一个程序由多个编译单位组成,并且在每个文件中均需要引用同一个全局变量时,这样为了防止变量名重复定义,应在其中一个文件中定义所有的全局变量,而其他用到这些全局变量的文件中用extern对这些变量进行声明,表示这些变量已在其他编译单位中定义,通知编译系统不必再为它们开辟存储单元。