C语言全局变量和局部变量(带实例讲解)
形参变量需要等到函数被"调用"时才能分配内存,调用结束后立即释放内存。
这说明 "形参变量"的作用域 非常有限,只能在"函数内部"使用,离开函数就无效了,这就是变量的"有效范围"。
一、所谓的"局部变量"
就是定义在 "函数内部的变量",它的作用域仅限于"函数内部",离开函数后就是"无效的",再使用就会报错!
例如:
int kangkang(int a)
{
int b,c; //abc仅在函数kangkang()内有效,出了kangkang()函数再调用就会报错
return a+b+c;
}
int main()
{
int m,n;//m,n仅在函数main()内有效
return 0;
}
这边几点需要注意一下:
1. 在main()函数中 定义的变量也是"局部变量(别以为它是main函数你就搞特殊,会被抓的)",只能在main函数中使用,
同时main函数中也"不能使用其他函数中定义的变量"。因为main函数也只是一个函数,与其他函数地位平等。
2. "形参变量"在函数体内定义的变量"都是"局部变量。"实参"给"形参"传值的过程也就是 局部变量赋值的过程。
3. 可以在不同的函数中使用相同的"变量名",因为它们表示不同得数据,分配不同的内存,互不干扰,也不会发生混淆。
4.在"语句"中也可以定义变量,它的"作用域"只限于"当前语句块"。
二、全局变量
什么叫做 函数的全局变量 ?
在所有"函数外部"定义的变量成为"全局变量"。
全局变量的作用域是什么?
全局变量的作用域默认是"整个程序",也就是所有的"源文件、包括.c和.h文件"。
//例如:
int a,b;//定义a,b两个全局变量
void kangkang1()
{
//todo
}
float x,y;//定义x,y两个全局变量(在所有函数的外部)
int kangkang2()
{
//todo
}
int main()
{
//todo
return 0;
}
a、b、x、y 都是在函数外部定义的全局变量。C语言代码是从前往后依次执行的,由于 x、y 定义在函数 kangkang1() 之后,所以在 kangkang1() 内无效;
而 a、b 定义在源程序的开头,所以在 kangkang1()、kangkang2() 和 main() 内都有效。
三、局部变量和全局变量的综合示例
eg1: 输出变量的值
#include<stdio.h>
int n = 10; //全局变量
void kangkang1()
{
int n = 20; //局部变量
printf("kangkang1 n: %d\n",n);
}
void kangkang2(int n)
{
printf("kangkang2 n: %d\n",n);
}
void kangkang3()
{
printf("kangkang3 n: %d\n",n);
}
int main()
{
int n = 30; //局部变量
kangkang1();
kangkang2(n);
kangkang3();
//代码块由{}包围
{
int n = 40; //局部变量
printf("block n:%d\n",n);
}
printf("mian n : %d\n",n);
return 0;
}
结果:
kangkang1 n: 20
kangkang2 n: 30
kangkang3 n: 10
block n:40
mian n : 30
解释说明:
代码中虽然定义了多个同名变量 n,但它们的作用域不同,在内存中的位置(地址)也不同,所以是相互独立的变量,互不影响,不会产生重复定义(Redefinition)错误。
1. 对于 kangkang1(),输出结果为 20,显然使用的是函数内部的 n,而不是外部的 n;
kangkang2()结果显示为30也是相同的情况,因为程序都是从mian函数开始运行,mian中定义了一个局部变量n=30,而kangkang2(n);正好调用了当中的n,所以输出为30;
当"全局变量"和"局部变量"同名时,在"局部范围内全局变量被“屏蔽”",不再起作用。或者说,变量的使用遵循"就近原则",如果在当前作用域中存在同名变量,就不会向更大的作用域中去寻找变量。
2. kangkang3() 输出 10,使用的是全局变量,因为在 kangkang3() 函数中不存在局部变量 n,所以编译器只能到函数外部,也就是全局作用域中去寻找变量 n。
3. 由{ }包围的代码块也拥有"独立的作用域",printf() 使用它自己内部的变量 n,输出 40。
4. C语言规定,只能"从小的作用域向大的作用域中去寻找变量",而不能反过来,使用更小的作用域中的变量。对于 main() 函数,即使代码块中的 n 离输出语句更近,但它仍然会使用 main() 函数开头定义的 n,所以输出结果是 30。
eg2:根据长方体的 长宽高 求它的体积 以及 三个面的面积
#include<stdio.h>
int s1,s2,s3; //定义三个面积
int vs(int a,int b,int c)
{
int v; //定义体积v
v = a*b*c;
s1 = a*b;
s2 = b*c;
s3 = a*c;
return v;
}
int main()
{
int v,length,width,height;
printf("请分别输入长方体的长和宽及高:\n");
scanf("%d %d %d",&length,&width,&height);
v = vs(length,width,height); //将三个实参传递到 vs函数中的形参中
printf("v=%d,s1=%d,s2=%d,s3=%d\n",v,s1,s2,s3);
return 0;
}
结果:
请分别输入长方体的长和宽及高:
5 6 8
v=240,s1=30,s2=48,s3=40
根据题意,我们希望借助一个函数得到三个值:体积 v 以及三个面的面积 s1、s2、s3。
遗憾的是,C语言中的函数只能有一个返回值,我们只能将其中的一份数据,也就是体积 v 放到返回值中,而将面积 s1、s2、s3 设置为全局变量。
全局变量的作用域是整个程序,在函数 vs() 中修改 s1、s2、s3 的值,能够影响到包括 main() 在内的其它函数。