c语言全局变量与静态本地变量

目录

全局变量

静态本地变量

下一篇: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 在这里的意思是局部作用域(本地可访问)

 

 

三、被隐藏的全局变量

如果函数内部存在于全局变量同名的变量,则全局变量会被隐藏,也就是函数(或大括号内)的本地变量优先

猜你喜欢

转载自blog.csdn.net/weixin_46919419/article/details/112550341