C语言局部变量和全局变量

局部变量 定义在函数内部的变量称为 局部变量( Local Variable ,它的作用域仅限于函数内部, 离开该函数后就是无效的,再使用就会报错。例如:
   
   
  1. int f1(int a){
  2. int b,c; //a,b,c仅在函数f1()内有效
  3. return a+b+c;
  4. }
  5. int main(){
  6. int m,n; //m,n仅在函数main()内有效
  7. return 0;
  8. }
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 文件。例如:
   
   
  1. int a, b; //全局变量
  2. void func1(){
  3. //TODO:
  4. }
  5.  
  6. float x,y; //全局变量
  7. int func2(){
  8. //TODO:
  9. }
  10.  
  11. int main(){
  12. //TODO:
  13. return 0;
  14. }
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】输出变量的值:
   
   
  1. #include <stdio.h>
  2.  
  3. int n = 10; //全局变量
  4.  
  5. void func1(){
  6. int n = 20; //局部变量
  7. printf("func1 n: %d\n", n);
  8. }
  9.  
  10. void func2(int n){
  11. printf("func2 n: %d\n", n);
  12. }
  13.  
  14. void func3(){
  15. printf("func3 n: %d\n", n);
  16. }
  17.  
  18. int main(){
  19. int n = 30; //局部变量
  20. func1();
  21. func2(n);
  22. func3();
  23. //代码块由{}包围
  24. {
  25. int n = 40; //局部变量
  26. printf("block n: %d\n", n);
  27. }
  28. printf("main n: %d\n", n);
  29.  
  30. return 0;
  31. }
#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。

3) C语言规定,只能从小的作用域向大的作用域中去寻找变量,而不能反过来,使用更小的作用域中的变量。对于 main() 函数,即使代码块中的 n 离输出语句更近,但它仍然会使用 main() 函数开头定义的 n,所以输出结果是 30。

【示例2】根据长方体的长宽高求它的体积以及三个面的面积。
   
   
  1. #include <stdio.h>
  2.  
  3. int s1, s2, s3; //面积
  4.  
  5. int vs(int a, int b, int c){
  6. int v; //体积
  7. v = a * b * c;
  8. s1 = a * b;
  9. s2 = b * c;
  10. s3 = a * c;
  11. return v;
  12. }
  13.  
  14. int main(){
  15. int v, length, width, height;
  16. printf("Input length, width and height: ");
  17. scanf("%d %d %d", &length, &width, &height);
  18. v = vs(length, width, height);
  19. printf("v=%d, s1=%d, s2=%d, s3=%d\n", v, s1, s2, s3);
  20.  
  21. return 0;
  22. }
#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() 在内的其它函数。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值