本地变量,全局变量,静态变量区别分析

1.定义在函数内部的变量就是本地变量

函数的每次运行,就产生了一个独立的变量空间,在这个空间中的变量,是函数的此次运行所独有的,称做:本地变量
  • 本地变量=局部变量=自动变量(之因此这么叫是由于:它的生存期是自动的)。
  • 写在函数表里的参数也是本地变量。
  • 生存期:何时这个变量开始出现了,到何时它消亡了。
  • 做用域:在(代码的)什么范围内能够访问这个变量(这个变量能够起做用)。
  • 对于本地变量,这两个问题的答案是统一的:大括号内---咱们把大括号称做'块'。

本地变量使用规则:安全

1.它是定义在块内的(包括函数块,语句块,甚至随便拉一对大括号来定义变量) 
 2.程序运行进入这个块以前,其中的变量不存在,离开这个块,其中的变量就消失了 
 3.块外面定义的变量在里面依然有效,块里面定义的变量在外面无效
 4.块里面定义了和外面同名的变量则掩盖了外面的
 5.不能在一个块内定义同名的变量
 6.本地变量不会被默认初始化

2.定义在函数外面的变量是全局变量

  • 全局变量具备全局的生存期和做用域:

    1.它们与任何函数都无关。
    2.在任何函数内部均可以使用它们。函数

全局变量使用规则:测试

1.没有作初始化的全局变量会获得0值---指针会获得NULL值 
  2.只能用编译时刻已知的值来初始化全局变量---不能用其余全局变量来对全局变量赋值 
      (程序严格按照顺序执行)                         
  3.它们的初始化发生在main函数以前        
  4.若是函数内部存在与全局变量同名的变量,则全局变量被隐藏
    C语言老是以最小的地方定义的变量为主,隐藏其余的外部变量---里面覆盖外面

如何在多个.c源程序中使用全局变量?(同一项目共享一个全局变量)指针

全局变量的声明---使用:extern int all;

如此便告诉了编译器在整个项目的某个地方有个叫all的东西code

注意:在使用extern对全局变量声明时不能对全局变量初始化,由于初始化是定义的事情内存


3.静态本地变量(阉割的全局变量)

static+本地变量=静态本地变量 当函数离开的时候,静态本地变量会继续存在并保持其值
静态本地变量的初始化只会在第一次进入这个函数时作,之后进入函数时会保持上次离开时的值
静态本地变量其实是特殊的全局变量,它们位于相同的内存区域 静态本地变量具备全局的生存期,函数内的局部做用域
static在这里的意思是局部做用域(本地可访问)

返回指针的函数注意点作用域

1.返回本地变量的地址是危险的
2.返回全局变量或静态本地变量的地址是安全的
3.返回在函数内malloc的内存是安全的,可是容易形成问题
4.最好的作法是返回传入的指针
#include<stdio.h> 
 int f(void);
 int g(void);
 int t(void);
 int gall;  
int main(int argc,char const *argv[])
{    
   printf("in %s gall=%d\n",__func__,gall);
   f();
   printf("again in %s gall=%d\n",__func__,gall);
   g();
   g();
   t();
   return 0;
}
//__func__是预置在编译器中的宏,并不包含于任何头文件,因此直接调用便可。
//注意__和_ 
//__func__是一个字符串,值为调用__func__函数的函数名。 
int f(void)//测试全局变量gall 
{    
     printf("in %s gall=%d\n",__func__,gall);
     gall+=2;
     printf("again in %s gall=%d\n",__func__,gall);
}
int g(void)//测试静态本地变量all 
{    static int all=1;  
     printf("all=%d\n",all);
     all+=2;
}
int t(void)//探索静态本地变量的本质 
{    static int sall=0; 
            int tall=0;
     printf("&全局变量=%p\n",&gall);//输出全局变量的地址
     printf("&静态本地变量=%p\n",&sall);//输出静态本地变量的地址 
     printf("&本地变量=%p\n",&tall);//输出本地变量的地址 
}
相关文章
相关标签/搜索