函數的每次運行,就產生了一個獨立的變量空間,在這個空間中的變量,是函數的此次運行所獨有的,稱做:本地變量
本地變量使用規則:安全
1.它是定義在塊內的(包括函數塊,語句塊,甚至隨便拉一對大括號來定義變量) 2.程序運行進入這個塊以前,其中的變量不存在,離開這個塊,其中的變量就消失了 3.塊外面定義的變量在裏面依然有效,塊裏面定義的變量在外面無效 4.塊裏面定義了和外面同名的變量則掩蓋了外面的 5.不能在一個塊內定義同名的變量 6.本地變量不會被默認初始化
1.它們與任何函數都無關。
2.在任何函數內部均可以使用它們。函數
全局變量使用規則:測試
1.沒有作初始化的全局變量會獲得0值---指針會獲得NULL值 2.只能用編譯時刻已知的值來初始化全局變量---不能用其餘全局變量來對全局變量賦值 (程序嚴格按照順序執行) 3.它們的初始化發生在main函數以前 4.若是函數內部存在與全局變量同名的變量,則全局變量被隱藏 C語言老是以最小的地方定義的變量爲主,隱藏其餘的外部變量---裏面覆蓋外面
如何在多個.c源程序中使用全局變量?(同一項目共享一個全局變量)指針
全局變量的聲明---使用:extern int all;如此便告訴了編譯器在整個項目的某個地方有個叫all的東西code
注意:在使用extern對全局變量聲明時不能對全局變量初始化,由於初始化是定義的事情內存
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);//輸出本地變量的地址 }