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
int a = 0;//声明外部变量并予以赋值
int main()
{
    text();//进入测试函数
}
int text()
{
    int a;
    printf("%d",a);
}

运行结果:
c语言:内外部变量、静态变量的差别以及证明过程_第1张图片
结论一:
子函数内定义的变量是局部变量,仅仅限于函数内使用,子函数结束后会释放掉内部变量所占用的内存,函数内定义的局部与函数外定义的外部变量无关。


情景二:

#include
int a = 0;
int main()
{
    text();
}
int text()
{
    extern int a;
    printf("%d",a);
}

运行结果:
c语言:内外部变量、静态变量的差别以及证明过程_第2张图片
结论二:
以entern修饰的变量a可以直接调用函数外定义的外部变量。

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

#include
extern int a = 0;
int main()
{
    text();
}
int text()
{
    extern int a;
    printf("%d",a);
}

运行结果:
c语言:内外部变量、静态变量的差别以及证明过程_第3张图片虽然程序成功运行,但是出现以下警告:

c语言:内外部变量、静态变量的差别以及证明过程_第4张图片
意思是变量a没有初始化,extern没有声明。(第二个警告是我没有给函数text()写函数原型)。

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


外部变量的作用

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

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

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

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

运行结果:
c语言:内外部变量、静态变量的差别以及证明过程_第5张图片

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

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

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

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

运行结果:
c语言:内外部变量、静态变量的差别以及证明过程_第6张图片
推论一:成立,外部变量在任何位置的更改都是在全局水平上的更改,子函数执行完毕后不会释放外部变量所占有的内存


关键字static

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

情景一:静态外部变量

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

运行结果:错误。

错误:
c语言:内外部变量、静态变量的差别以及证明过程_第7张图片
错误显示a没有被声明,说明子函数text()没有权限访问main.c文件中以static修饰的变量。

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

情景二:静态内部变量

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

运行结果:

c语言:内外部变量、静态变量的差别以及证明过程_第8张图片
由运行的结果可以推出:

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

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

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


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

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

运行结果:

c语言:内外部变量、静态变量的差别以及证明过程_第9张图片c语言:内外部变量、静态变量的差别以及证明过程_第10张图片
程序成功运行,并且0错误0警告。

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

你可能感兴趣的:(C语言)