c语言:内外部变量、静态变量的差别以及证明过程

找了很长时间他们的差别,但是答案都不是很理想。

于是自己写代码来测验这四种情况的差别。


结论预览

1,局部变量(内部变量)

1.1,函数内定义的变量是局部变量,仅仅限于函数内使用。

1.2,子函数结束后会释放掉内部变量所占用的内存,函数内部的更改对外部没有影响。

1.3,函数内定义的局部变量与函数外定义的外部变量即使名字相同,但是毫不相干。

2,全局变量(外部变量)

2.1,外部变量可以被源程序的所有文件访问

2.2,外部变量的初始值默认为0;内部变量的初试值为随机数。

2.3,以extern修饰的变量可以直接调用在整个源程序中函数外定义的外部变量。extern只能用于声明,而不能用于定义。

2.4,c语言外部变量允许在不同的c文件中重复声明,且不同c文件中的同名外部变量所用的是同一个地址。

3,静态变量

3.1,以static修饰的内部变量只限于在函数内部的更改,此变量的初始值默认为0。

3.2,当外部变量用static修饰时,除本文件之外的文件都无权限访问。


以下是证明过程,环境是codeblocks。


关键字“extern”

情景一:

#include<stdio.h>
int a = 0;//声明外部变量并予以赋值
int main()
{
    text();//进入测试函数
}
int text()
{
    int a;
    printf("%d",a);
}

运行结果:
在这里插入图片描述
结论一:
子函数内定义的变量是局部变量,仅仅限于函数内使用,子函数结束后会释放掉内部变量所占用的内存,函数内定义的局部与函数外定义的外部变量无关。


情景二:

#include<stdio.h>
int a = 0;
int main()
{
    text();
}
int text()
{
    extern int a;
    printf("%d",a);
}

运行结果:
在这里插入图片描述
结论二:
以entern修饰的变量a可以直接调用函数外定义的外部变量。

推论一:entern可以用以声明变量。

#include<stdio.h>
extern int a = 0;
int main()
{
    text();
}
int text()
{
    extern int a;
    printf("%d",a);
}

运行结果:
在这里插入图片描述虽然程序成功运行,但是出现以下警告:

在这里插入图片描述
意思是变量a没有初始化,extern没有声明。(第二个警告是我没有给函数text()写函数原型)。

推论一:不成立,entern只能作为引用外部变量的入口。


外部变量的作用

外部变量又叫全局变量,外部变量的适用范围是整个源程序。

我们现在把主函数和测试函数分别写进两个c文件中。

#include<stdio.h>
int a;
int main()
{
    text();
}
int text()
{
    extern a;
    int b;
    printf("%d\n",a);
    printf("%d",b);
}

注意看工作空间咯,是分别放进两个c文件,下文把main.c与text.c分开写表示这两个函数是在不同的c文件之中的。
在这里插入图片描述

运行结果:
在这里插入图片描述

结论一:外部变量可以被源程序的所有文件访问

结论二:外部变量的初始值默认为0;内部变量的初试值为随机数

推论一:测试函数中对变量a的值进行更改会影响a的初始值。

#include<stdio.h>
int a = 0;
int main()
{
    text();
    printf("%d",a);
}
int text()
{
    extern int a;
    a = 1;//更改a的值
    printf("%d",a);
}

运行结果:
在这里插入图片描述
推论一:成立,外部变量在任何位置的更改都是在全局水平上的更改,子函数执行完毕后不会释放外部变量所占有的内存


关键字static

以static声明的外部变量只能被此c文件中函数访问。

情景一:静态外部变量

#include<stdio.h>
static int a = 0;
int main()
{
    text();
    printf("%d",a);
}
int text()
{
    extern int a;
    a = 1;
    printf("%d",a);
}

运行结果:错误。

错误:
在这里插入图片描述
错误显示a没有被声明,说明子函数text()没有权限访问main.c文件中以static修饰的变量。

结论一:当外部变量用static修饰时,除本文件之外的文件都无权限访问。

情景二:静态内部变量

#include<stdio.h>
int a;
int text();
int main()
{
    text();
    printf("%d",a);
}
#include<stdio.h>
int text()
{
    static int a = 1;
    printf("%d",a);
    return 0;
}

运行结果:

在这里插入图片描述
由运行的结果可以推出:

static int a = 1; 
等价于
int a = 0int a = 1;

观察:
不同之处在于,a = 1只在子函数中有效。
而在主函数中,调用完测试函数后,输出的值是a = 0,而不是任意值。

结论:以static修饰的内部变量只限于在函数内部的更改,此变量的初始值默认为0。


外部变量可不可以重复声明?

#include<stdio.h>
int a;
int text();
int main()
{
    text();
    printf("%d",a);
}
#include<stdio.h>
int a;
int text()
{
    a = 1;
    printf("%d",a);
    return 0;
}

运行结果:

在这里插入图片描述在这里插入图片描述
程序成功运行,并且0错误0警告。

结论:c语言外部变量可以在不同的c文件中重复声明,且不同c文件中的同名外部变量所用的是同一个地址。

  • 11
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言中有四种类型的变量:局部变量、全局变量、静态局部变量和静态全局变量。 1. 局部变量(Local Variables): 局部变量是在函数内部声明的变量,它们只在函数内部可见和访问。局部变量的作用域仅限于声明它们的函数内部。当函数执行完毕后,局部变量会被销毁,其占用的内存也会被释放。 2. 全局变量(Global Variables): 全局变量是在函数部声明的变量,它们可以被程序中的所有函数访问。全局变量的作用域从声明开始的地方一直延伸到文件的末尾。全局变量在整个程序的执行过程中都是存在的,因此会占用内存。需要注意的是,在多个文件中使用同名的全局变量会导致冲突,因此应该避免这样的情况发生。 3. 静态局部变量Static Local Variables): 静态局部变量与普通局部变量相似,都是在函数内部声明。不同之处在于,静态局部变量只会在首次进入该函数时进行初始化,之后的函数调用不会重新初始化该变量。同时,静态局部变量的作用域仍然限制在声明它们的函数内部,但是其生命周期会延长到整个程序的执行过程。 4. 静态全局变量Static Global Variables): 静态全局变量与普通全局变量相似,都是在函数部声明。不同之处在于,静态全局变量只能在声明它们的文件内部访问,其作用域被限制在当前文件范围内。其他文件无法访问该变量。静态全局变量会在程序开始执行时进行初始化,并且在整个程序执行期间都存在。 以上就是C语言中四种不同类型的变量:局部变量、全局变量、静态局部变量和静态全局变量的特点和用法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值