第 11章 用户标识符的作用域和存储类别
11.1 作用域和存储类别的概念
11.2 局部变量和全局变量
11.3 局部变量的存储类别和生存期
11.4 全局变量的存储类别和生存期
11.5 函数的存储分类
11.6 如何运行一个由多个源文件组成的程序
11.1 作用域和存储类别的概念
11.1.1 作用域
11.1.2 存储类别和生存期
11.2 局部变量和全局变量在 C语言中,局部变量和全局变量的划分完全取决于变量定义的位置 。
11.2.1 局部变量及其作用域凡是在函数内部定义的变量都是局部变量 ( 也称作内部变量 ),包括在函数内部复合语句中定义的变量和函数形参表中说明的形式参数 。
局部变量只能在函数内部使用,其作用域是从定义位置起至函数体或复合语句体结束为止 。
例 11.1 局部变量的作用域 。
int fun(int x,int y)
{ int z;
z=x+y; return z;
}
局部变量 x,y、
z的作用域
main( )
{ int a=2,b=3;
{ int c;
c=a+b;
printf("c=%d\n",c);
}
printf("a+b=%d\n",fun (a,b));
}
局部变量
c的作用域局部变量a
、b
的作用域说明
( 1) 在函数 fun中定义的变量 z和形参 x,y都只在函数 fun中有效,在主函数中不能引用 。
( 2) 在主函数开始定义的局部变量 a
和 b的作用域是整个 main函数,在其他函数中不能引用 。
( 3) 在 main函数的复合语句中定义的局部变量 c的作用域仅限于此复合语句,
在复合语句外面不能使用 。
( 4) 不同作用域中的局部变量可以同名,它们占据着不同的内存单元,不会发生混淆 。 当作用域产生重叠时,处于,内部,的变量起作用 。 例如:
main( )
{ int a=2,b=3,c=0;
{ int c;
c=a+b;
printf("复合语句内 c=%d\n",c);
}
printf("复合语句外 c=%d\n",c);
}
复合语句内局部变量 c的作用域主函数中局部变量
c
的作用域程序运行时输出:
复合语句内 c=5
复合语句外 c=0
从以上例子中可以看出:当主函数中的局部变量 c与函数内部复合语句中的局部变量 c同名时,在复合语句内部是自身的局部变量起作用,main函数中的局部变量 c被屏蔽 。
11.2.2 全局变量及其作用域凡是在函数外部任何位置上的变量都属于全局变量 ( 也称作外部变量 ) 。 全局变量的作用域分以下两种情况 。
1,全局变量与局部变量不同名时,其作用域是从定义位置开始到它所在的源文件结束为止例 11.2 全局变量作用域示意 。
int x=1;
void fun(int n)
{ … }
int y=2;
main( )
{ … }
int z=3; 全局变量 z的作用域全局变量
y
的作用域全局变量
x
的作用域说明
( 1) 变量 x,y,z都是在函数体外进行的定义,所以都属于全局变量 。
( 2) 全局变量 x定义在了源程序的开始,它的作用域覆盖了整个源程序 。
( 3) 全局变量 y定义在了函数 fun之后,
main函数之前,所以它的作用域不包括函数 fun。
( 4) 全局变量 z定义在了源程序的末尾,使得它既不能在函数 fun中使用,也不能在 main函数中使用 。
由此可见:同是全局变量,由于定义语句的位置不同,作用域的范围也有很大区别 。 不要误以为全局变量的作用域范围一定比局部变量的作用域范围大 。
2,全局变量与局部变量同名时,
全局变量的作用域不包括同名局部变量的作用域请看以下的简单例子:
int a=1; /* 定义全局变量 a */
main( )
{ int a=2; /* 定义局部变量 a */
fun( );
printf("在 main函数中 a=%d\n",a);
}
fun( )
{ printf("在 fun函数中 a=%d\n",a); }
程序运行时输出:
在 fun函数中 a=1
在 main函数中 a=2
说明
( 1) 在源程序的开头定义了全局变量
a,并赋有初值 1。 它的作用域原本应该包括整个源程序 。
( 2) 在 main函数中定义了局部变量 a,
并赋有初值 2。 它的作用域是整个 main函数 。
( 3) 由于全局变量 a与局部变量 a出现了重名,因此,在 main函数中是局部变量
a起作用,全局变量 a将被屏蔽而不起作用 。
( 4) 在实际应用中应避免同名现象的出现,以增强程序的可读性 。
使用全局变量,可以不经过参数传递,
直接在函数之间共享数据 。 但由此带来的弊端也是很明显的:程序中任何一个函数对变量的修改,都会影响到其他函数对该变量的引用,容易造成隐蔽的错误 。 因此,
除非十分必要,一般情况下不要使用全局变量 。
11.3 局部变量的存储类别和生存期
11.3.1 auto变量
11.3.2 register变量
11.3.3 用 static说明局部变量
11.4 全局变量的存储类别和生存期
11.4.1 用 extern说明全局变量
11.4.2 用 static说明全局变量
11.5 函数的存储分类
11.5.1 用 extern说明函数
11.5.2 用 static说明函数
11.6 如何运行一个由多个源文件组成的程序