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 = 0;
int 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文件中的同名外部变量所用的是同一个地址。