局部变量:在函数内部或复合语句内部定义的变量称为局部变量,又称内部变量,其作用域是从定义变量的位置开始到函数或复合语句结束,在作用域之外,变量不能使用。
写一个简单的例子。
float f1(int x) //局部变量x生效
{
int a,b; //局部变量a和b生效
if (a<b)
{
int t; //局部变量t生效
t=a; a=b; b=t;
} //局部变量t失效
···
} //局部变量x、a和b失效
int main()
{
int n,m; //局部变量n和m生效
···
} //局部变量n和m失效
全局变量:在函数外部定义的变量称为全局变量,又称外部变量,其作用域是从定义变量的位置开始到本源程序文件结束。
写一个简单的例子。
int x = 1;y = 2; //全局变量 x 和 y 生效
int f1(int a)
{
···
}
char c1,c2; //全局变量 c1 和 c2 生效
void f2(int s)
{
···
}
int main()
{
···
}
/*以下若仍有函数,全局变量 x、y、c1 和 c2 仍有效*/
值得注意的是,在函数中若局部变量与全局变量同名,则函数中与局部变量同名的全局变量将被屏蔽,函数调用的将是局部变量。
写一个简单的例子。
输出结果。
变量具有多种属性,除了数据类型等属性以外,还有一个属性,就是存储类型。
变量完整的定义形式如下:
存储类型 数据类型 变量名;
在C语言中,存储类型有4种:auto(自动)、static(静态)、register(寄存器)、extern(外部)。
局部变量的存储类型
自动变量
在定义变量时,如果声明存储类型为auto,那么所定义的变量为自动变量。关键字auto允许省略,C语言将其作为默认的存储类型,即定义局部变量时,未特别声明变明存储类型的都是自动变量。
如果定义自动变量时未赋初值,它的值是不确定的,是随机数。
自动变量赋初值是在函数调用时进行的,每调用一次函数赋一次初值。
静态变量
在定义变量时,如果声明存储类型为static,那么所定义的变量为静态变量。
如果定义静态变量时未赋初值,对于数值型变量,系统自动赋值0;对于字符型变量,自动赋值'\0'。
静态变量在编译时赋初值,因此只赋一次初值,以后每次调用函数时不在重新赋初值,而是使用上一次函数调用结束时的值。
写一个简单的例子。
#include <stdio.h>
void test() {
auto a = 0; //定义自动存储类型变量a
static int b = 3; //定义静态存储类型变量b
a++;
b++;
printf("a=%d,b=%d\n", a, b); //输出a和b
}
int main() {
test(); //调用test函数
test();
test();
return 0;
}
输出结果。
寄存器变量
在定义变量时,如果声明存储类型为register,那么所定义的变量为寄存器变量。
为提高效率,允许把程序中频繁使用的变量放在CPU的寄存器中,这种变量就是寄存器变量。
全局变量
如果定义全局变量时未赋初值,对于数值型变量,系统自动赋值0;对于字符型变量,自动赋值'\0'。
用于声明全局变量的存储类型的关键字时extern和static。
写一个简单的例子说明extern。
#include <stdio.h>
int main() {
extern int x, y;
printf("x=%d,y=%d", x, y);
return 0;
}
int x = 1, y = 2;
输出结果。