目录
下一篇:c语言*返回指针的函数
全局变量
一、定义
定义在函数外面的变量是全局变量
全局变量具有全局的生存期和作用域
他们与任何函数都无关
在任何函数内部都可以使用他们
实验:
int f(void );
int gAll=12;//一个全局变量
int main(int argc,char const *argv[])
{
printf("这是在%s里面使用gAll=%d\n",__func__ ,gAll);//__func__是当前函数的名称的字符串
f();
printf("再一次在%s里面使用gAll=%d\n",__func__ ,gAll);
return 0;
}
int f(void ){
printf("这是在%s里面%d\n",__func__,gAll);
gAll+=2;
printf("再一次在%s里面%d\n",__func__,gAll);
return gAll;
}
也就是全局变量一改都改
二、全局变量的初始化
没有做初始化的全局变量会得到0值(本地变量会得到一个内存中莫名其妙的值)
指针会得到NULL值
只能用编译时刻已知的值来初始化全局变量
他们的初始化发生在main函数之前
也就是:不能 int g2=10; int gAll=12;
但是可以:const int gAll=12;int g2=gAll;//不推荐
当不给gAll赋值时,上面代码的结果
警告:全局变量不应该和另一个全局变量联系在一块,在复杂的程序里面很难知道全局变量的初始化顺序
静态本地变量
一、定义
1、在本地变量定义时加上static修饰符,就会成为静态本地变量
2、当函数离开的时候,静态本地变量会继续存在并保持其值
3、静态本地变量的初始化只会在第一次进入这个函数时做,以后进入函数时会保持上次离开时的值
int f(void ){
int all=1;
printf("这是在%s里面%d\n",__func__,all);
all+2;
printf("再一次在%s里面%d\n",__func__,all);
}
这次没用static修饰all,在主函数中调用3次f()
这次用static修饰
static int all=1;
printf("这是在%s里面%d\n",__func__,all);
all+=2;
printf("再一次在%s里面%d\n",__func__,all);
静态本地变量实际上是特殊的全局变量
它们位于相同的内存区域
做个试验:
gAll是全局变量
all是静态本地变量
k是局部变量
他们的地址如下
会发现全局变量和静态本地变量几乎放在一起,而本地变量很远
静态本地变量具有全局的生存期,函数内的局部作用域
static 在这里的意思是局部作用域(本地可访问)
三、被隐藏的全局变量
如果函数内部存在于全局变量同名的变量,则全局变量会被隐藏,也就是函数(或大括号内)的本地变量优先