欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-12 12:38:08
...

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

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


结论预览

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);
}

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


情景二:

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

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

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

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

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

c语言:内外部变量、静态变量的差别以及证明过程
意思是变量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文件之中的。
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);
}

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


关键字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);
}

运行结果:错误。

错误:
c语言:内外部变量、静态变量的差别以及证明过程
错误显示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;
}

运行结果:

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

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;
}

运行结果:

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

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