教育改变生活
标题:
【C语言】全局变量和局部变量
[打印本页]
作者:
wander
时间:
2024-4-19 22:54
标题:
【C语言】全局变量和局部变量
所谓
作用域(
Scope
)
,就是变量的有效范围。
不仅对于形参变量,C语言中所有的变量都有自己的作用域。决定变量作用域的是变量的定义位置。
局部变量
定义在函数内部的变量称为
局部变量(
Local Variable
)
,它的作用域仅限于函数内部, 离开该函数后就是无效的,再使用就会报错。
例如:
int
f1
(
int
a
)
{
int
b
,
c
;
//a,b,c仅在函数f1()内有效
return
a
+
b
+
c
;
}
int
main
()
{
int
m
,
n
;
//m,n仅在函数main()内有效
return
0
;
}
几点说明:
1) 在 main 函数中定义的变量也是局部变量,只能在 main 函数中使用;同时,main 函数中也不能使用其它函数中定义的变量。main 函数也是一个函数,与其它函数地位平等。
2) 形参变量、在函数体内定义的变量都是局部变量。
实参给形参传值的过程也就是给局部变量赋值的过程。
3) 可以在不同的函数中使用相同的变量名,它们表示不同的数据,分配不同的内存,互不干扰,也不会发生混淆。
4) 在语句块中也可定义变量,它的作用域只限于当前语句块。
全局变量
在所有函数外部定义的变量称为
全局变量(G
lobal Variable
)
,它的作用域默认是整个程序,也就是所有的源文件,包括 .c 和 .h 文件。
例如:
int
a
,
b
;
//全局变量
void
func1
()
{
//TODO:
}
float
x
,
y
;
//全局变量
int
func2
()
{
//TODO:
}
int
main
()
{
//TODO:
return
0
;
}
a、b、x、y 都是在函数外部定义的全局变量。C语言代码是从前往后依次执行的,由于 x、y 定义在函数 func1() 之后,所以在 func1() 内无效;而 a、b 定义在源程序的开头,所以在 func1()、func2() 和 main() 内都有效。
局部变量和全局变量的综合示例
【示例1】输出变量的值:
#include
<stdio.h>
int
n
=
10
;
//全局变量
void
func1
()
{
int
n
=
20
;
//局部变量
printf
(
"func1 n: %d
\n
"
,
n
);
}
void
func2
(
int
n
)
{
printf
(
"func2 n: %d
\n
"
,
n
);
}
void
func3
()
{
printf
(
"func3 n: %d
\n
"
,
n
);
}
int
main
()
{
int
n
=
30
;
//局部变量
func1
();
func2
(
n
);
func3
();
//代码块由{}包围
{
int
n
=
40
;
//局部变量
printf
(
"block n: %d
\n
"
,
n
);
}
printf
(
"main n: %d
\n
"
,
n
);
return
0
;
}
运行结果:
func1 n: 20
func2 n: 30
func3 n: 10
block n: 40
main n: 30
代码中虽然定义了多个同名变量 n,但它们的作用域不同,在内存中的位置(地址)也不同,所以是相互独立的变量,互不影响,不会产生
重复定义(Redefinition)
错误。
1) 对于 func1(),输出结果为 20,显然使用的是函数内部的 n,而不是外部的 n;func2() 也是相同的情况。
当全局变量和局部变量同名时,在局部范围内全局变量被“屏蔽”,不再起作用。或者说,变量的使用遵循就近原则,如果在当前作用域中存在同名变量,就不会向更大的作用域中去寻找变量。
2) func3() 输出 10,使用的是全局变量,因为在 func3() 函数中不存在局部变量 n,所以编译器只能到函数外部,也就是全局作用域中去寻找变量 n。
3) 由
{ }
包围的代码块也拥有独立的作用域,printf() 使用它自己内部的变量 n,输出 40。
4) C语言规定,只能从小的作用域向大的作用域中去寻找变量,而不能反过来,使用更小的作用域中的变量。对于 main() 函数,即使代码块中的 n 离输出语句更近,但它仍然会使用 main() 函数开头定义的 n,所以输出结果是 30。
【示例2】根据长方体的长宽高求它的体积以及三个面的面积。
#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
;
}
int
main
()
{
int
v
,
length
,
width
,
height
;
printf
(
"Input length, width and height: "
);
scanf
(
"%d %d %d"
,
&
length
,
&
width
,
&
height
);
v
=
vs
(
length
,
width
,
height
);
printf
(
"v=%d, s1=%d, s2=%d, s3=%d
\n
"
,
v
,
s1
,
s2
,
s3
);
return
0
;
}
运行结果:
Input length, width and height: 10 20 30↙
v=6000, s1=200, s2=600, s3=300
根据题意,我们希望借助一个函数得到三个值:体积 v 以及三个面的面积 s1、s2、s3。遗憾的是,C语言中的函数只能有一个返回值,我们只能将其中的一份数据,也就是体积 v 放到返回值中,而将面积 s1、s2、s3 设置为全局变量。全局变量的作用域是整个程序,在函数 vs() 中修改 s1、s2、s3 的值,能够影响到包括 main() 在内的其它函数。
欢迎光临 教育改变生活 (http://bbs.goldoar.com/)
Powered by Discuz! X3.2