本地變量,全局變量,靜態變量區別分析

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);//輸出本地變量的地址 
}
相關文章
相關標籤/搜索