c语言中关于变量作用域问题

先让大家看看博主今天遇到的一个小程序:

#include<stdio.h>
int a,b;
void fun();
int main(void)
{
    int a = 50;
    fun();
    printf("2:%d,%d,%p,%p\n",a,b,&a,&b);
    a+=a;
    b+=b;
    printf("3:%d,%d,%p,%p\n",a,b,&a,&b);
    return 0;
}
void fun()
{
    a = 100;
    b = 200;
    printf("1:%d,%d,%p,%p\n",a,b,&a,&b);
}

各位能否看得出各个变量a和变量b输出的值?不过精通c语言基础的程序员肯定知道吧,哈哈!
下面是前面程序代码在vc++6.0上运行的结果截图:
这里写图片描述
我们来分析一下前面的代码,首先在所有函数外面声明两个变量a和b,他们是具有外连接的、静态的、文件作用域的变量,也就是我们所知道的全局变量。在main()函数里,定义了一个变量a,它是具有空连接的、自动的、代码块作用域的变量,作用范围仅限于main()函数。这里我们可以通过变量的地址来区分这三个变量。
程序运行时,从main()进入,调用fun()函数时,变量a和变量b分别被赋值为100和200,这里的a和b用的都是全局变量a和b,即在所有函数外面定义的变量,结束函数的调用之后,输出的a值却是main()函数里定义的局部变量a。

再让我们看看下面程序例子:

#include<stdio.h>
int a;
void fun1();
void fun();
int main(void)
{
    int a = 50;
    fun();
    printf("2:%d,%p\n",a,&a);
    a+=a;
    printf("3:%d,%p\n",a,&a);
    return 0;
}
void fun()
{
    a = 100;
    fun1();
    printf("1:%d,%p\n",a,&a);
}
void fun1()
{
    a = 400;
    printf("%d,%p\n",a,&a);
}

这里写图片描述
哈哈,这次大家是不是都猜到各个变量a值的输出结果了?是的,mian()函数调用一个fun()函数时用的变量a就是在所有函数外定义的变量a,除非函数自己本身也定义一个变量a。
下面程序代码和运行结果是验证:

#include<stdio.h>
int a;
void fun1();
void fun();
int main(void)
{
    int a = 50;
    fun();
    printf("2:%d,%p\n",a,&a);
    a+=a;
    printf("3:%d,%p\n",a,&a);
    return 0;
}
void fun()
{
    int a = 100;
    fun1();
    printf("1:%d,%p\n",a,&a);
}
void fun1()
{
    a = 400;
    printf("%d,%p\n",a,&a);
}

运行结果:
这里写图片描述
博主还发现,变量的地址也是好东西呢,可以帮助我们快速区分不同的变量。在这里再次谢谢大家的阅览!如果有错误也希望各位读者指正,博主会尽快改正的。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值