局部变量与全局变量  函数的形参变量只在被调用期间才分配内存单元,调 用结束立即释放。  ↓ 这一点表明形参变量只有在函数内才是有效的, 离 开该函数就不能再使用了。这种变量有效性的范围称 变量的作用域。不仅对于形参变量, C语言中所有 的量都有自己的作用域。  ↓ 变量说明的方式不同,其作用域也不同。  ↓ C语言中的变量,按作用域范围可分为两种, 局部变量 全局变量 上一页 下一页 返回上一级 局部变量 #include a, int f1(int aa) /*函数f1*/ b, { int b,c; c 作 …… 用 局部变量也称为内部变 } 域 量。 x, int f2(int x) /*函数f2*/  局部变量是在函数内作 y, { int y,z; 定义说明的。其作用域 z …… 作 仅限于函数内, 离开该 用 } 函数后再使用这种变量 域 是非法的。 void main( )

Download Report

Transcript 局部变量与全局变量  函数的形参变量只在被调用期间才分配内存单元,调 用结束立即释放。  ↓ 这一点表明形参变量只有在函数内才是有效的, 离 开该函数就不能再使用了。这种变量有效性的范围称 变量的作用域。不仅对于形参变量, C语言中所有 的量都有自己的作用域。  ↓ 变量说明的方式不同,其作用域也不同。  ↓ C语言中的变量,按作用域范围可分为两种, 局部变量 全局变量 上一页 下一页 返回上一级 局部变量 #include a, int f1(int aa) /*函数f1*/ b, { int b,c; c 作 …… 用 局部变量也称为内部变 } 域 量。 x, int f2(int x) /*函数f2*/  局部变量是在函数内作 y, { int y,z; 定义说明的。其作用域 z …… 作 仅限于函数内, 离开该 用 } 函数后再使用这种变量 域 是非法的。 void main( )

局部变量与全局变量
 函数的形参变量只在被调用期间才分配内存单元,调
用结束立即释放。

↓
这一点表明形参变量只有在函数内才是有效的, 离
开该函数就不能再使用了。这种变量有效性的范围称
变量的作用域。不仅对于形参变量, C语言中所有
的量都有自己的作用域。

↓
变量说明的方式不同,其作用域也不同。

↓
C语言中的变量,按作用域范围可分为两种,
局部变量
全局变量
1
上一页
下一页 返回上一级
局部变量
#include <stdio.h>
a,
int f1(int aa) /*函数f1*/
b,
{ int b,c;
c
作
……
用 局部变量也称为内部变
}
域
量。
x,
int f2(int x) /*函数f2*/

局部变量是在函数内作
y,
{ int y,z;
定义说明的。其作用域
z
……
作
仅限于函数内,
离开该
用
}
函数后再使用这种变量
域
是非法的。
void main( ) /*主函数f2*/
{ int aa,n;
a,
n
……
作
f1(a); f2(n);
用
……
域
}
 在函数f1内定义了三个变
量,a为形参,b,c为一般
变量。
 在 f1的范围内a,b,c有效,
a
或者说a,b,c变量的作用
域限于f1内。
 同理,x,y,z的作用域限于
f2内。
 a,n作用域限于main函数
a
内。
允许在不同的函数中使用相同
的变量名,它们代表不同的对
象,分配不同的单元,互不干
扰,也不会发生混淆。
2
上一页
下一页 返回上一级
 关于局部变量的作用域还要
说明以下几点:
1. 主函数中定义的变量也
只能在主函数中使用,不能
在其它函数中使用。同时,
主函数中也不能使用其它函
数中定义的变量。因为主函
数也是一个函数,它与其它
函数是平行关系。这一点是
与其它语言不同的,应予以
注意。
2. 形参变量是属于被调函
数的局部变量,实参变量是
属于主调函数的局部变量。
例如,右边的形参变量x属
于f2被调函数,实参变量n是
属于main主调函数。
a,
b,
c
作
用
域
#include <stdio.h>
int f1(int a) /*函数f1*/
{ int b,c;
……
}
x,
y,
z
作
用
域
int f2(int x) /*函数f2*/
{ int y,z;
……
}
a,
n
作
用
域
void main( ) /*主函数f2*/
{ int a,n;
……
f1(a); f2(n);
……
}
3
上一页
下一页 返回上一级
 关于局部变量的作用域还
要说明以下几点:
3. 注意在复合语句中定义
的变量的作用域。
如右侧例子中的b变量。
s,
a
作
用
域
。例如:
#include <stdio.h>
void main( )
{ int s,a;
……
{ int b;
b
s=a+b;
作
……
用
域
}
……
}
4.注意相同变量名的变量
的作用域。
4
上一页
下一页 返回上一级
k
作
用
域
 #include <stdio.h>
void main( )
{
int i=2,j=3,k;
k=i+j;
k {
int k=8;
作
if(j==3) printf("%d\n", k);
用
域 }
printf("%d\n%d\n", i, k);
}
 在复合语句外由main定义的k起作
用,而在复合语句内则由在复合语
句内定义的k起作用。因此程序第4
行的k为main所定义,其值应为5。
第7行输出k值,该行在复合语句内,
由复合语句内定义的k起作用,其
初值为8,故输出值为8,第9行输
出i,k值。i是在整个程序中有效
的,第7行对i赋值为3,故以输出
也为3。而第9行已在复合语句之外,
 本程序在main中定义了i,j,k三个变
输出的k应为main所定义的k,此k
量,其中k未赋初值。 而在复合语
值由第4 行已获得为5,故输出也
句内又定义了一个变量k,并赋初
为5。
值为8。应该注意这两个k不是同一
个变量。
 程序输出结果为:8
2
5
上一页
返回 5
下一页 返回上一级
全局变量
 全局变量是在函数外部定义的变量。
 全局变量不属于哪一个函数,它属于
一个源程序文件。其作用域是从定义
位置到源文件结束的地方。
6
上一页
下一页 返回上一级
a,
b
作
用
域
 例如:
#include <stdio.h>
int a, b; /*全局变量*/
void f1( ) /*函数f1*/
{
……
}
float x, y; /*全局变量*/
int fz( ) /*函数fz*/
x,
y {
作 ……
用
域 }
void main( ) /*主函数
*/
{
……
}
 从左例可以看出a、b、x、y
都是在函数外部定义的全
局变量,但x、y 定义在函
数f1之后(而在f1内又没
有对x、y采用引用说明来
延伸其作用域(详细解释见外
部变量)),所以x、y在f1内
无效。
a、b定义在源程序最前面,
因此在f1、f2及main内均可
使用。
7
上一页
下一页 返回上一级
 例、输入正方体的长l、宽w、高h,求体积及三个面
x*y、 x*z、 y*z 的面积。
#include <stdio.h>
int s1,s2,s3;
int vs( int a,int b,int c)
{ int v;
v=a*b*c; s1=a*b;
s2=b*c; s3=a*c;
return v;
}
void main( )
{ int v, l, w, h;
printf("\ninput length,
width and height\n");
scanf("%d%d%d",&l,&w,&h);
v=vs(l,w,h);
printf("v=%d s1=%d s2=%d
s3=%d\n",v,s1,s2,s3);
}
 本程序中定义了三个外部变量
s1,s2,s3, 用来存放三个面积,
其作用域为整个程序。
 函数vs用来求正方体体积和三
个面积, 函数的返回值为体积v
 由主函数完成长宽高的输入及
结果输出。由于C语言规定函
数返回值只有一个, 当需要增
加函数的返回数据时,用外部
变量是一种方式。
 本例中,如不使用外部变量,
在主函数中就不可能取得
v,s1,s2,s3四个值。而采用了外
部变量, 在函数vs中求得的
s1,s2,s3值在main 中仍然有效。
 因此外部变量可以作为实现函
数之间数据通讯的一种手段。
8
上一页
下一页 返回上一级
对于全局变量还有以下几点说明:
 1. 全局变量在定义时就已分配了内存单元。
 2. 全局变量可加强函数模块之间的数据联系, 但是又使
函数要依赖这些变量,因而使得函数的独立性降低。从模
块化程序设计的观点来看这是不利的, 因此在不必要时
尽量不要使用全局变量。
 3. 在同一源文件中,允许全局变量和局部变量同名。在
局部变量的作用域内,全局变量不起作用。
9
上一页
返回
下一页 返回上一级