1,全域性變數,和區域性變數的生存週期咋樣呢,儲存位置呢??
2,假如全域性變數和區域性變數定義賦值都是一樣的,那麼printf函式裡呼叫變數會出現什麼結果??把區域性變數去掉呢??
3,對於乙個c/c++程式而言,全域性變數真的只是定義在所有函式之外就ok的嗎??假如某乙個全域性變數定義在最底部,那麼上面的那些程式可以用這些全域性變數嗎???
4,誰又知道(::value)這個是什麼玩意啊??
執行結果:#include int num = 5, sco= 8;
執行結果:void print()
int main()
可以看到,雖然在這個程式裡面定義了兩次的num,sco,但是定義它們的位置是不一樣的,乙個是在main函式之外,另乙個在main函式裡面,所以,可以知道,在main函式裡面的是區域性變數,在main函式之外的是全域性變數
全域性變數:儲存在全域性區,且生命週期是一直到程式整體退出
區域性變數:(程式執行時)儲存在棧區, 生命週期是僅僅在當前的函式中,函式執行完,退出時,生命也就結束!!
所以,我們可以知道,在main函式裡,我們先呼叫的是print函式,而它列印的變數是全域性變數(對於當前這個程式)
所以它列印出了5,8
執行完畢,呼叫printf函式,裡面也用到了引數,可以想明白的是,printf這類的函式是位於某乙個函式底下的,所以先是檢視當前函式裡有沒有可以用到的變數(區域性變數),如果沒有的話,那麼檢視全域性變數,如果有的話,呼叫之。
程式2:
#include int num = 5,sco = 8;
void print()
int main()
可以看到,執行結果跟我們想得是一樣的!!!
那麼如果把全域性變數放在最低部,會出現什麼情況,還能正常編譯和執行嗎??
#include void print()
int main()
int num = 4, sco = 5;
能編譯通過嗎??答案顯而易見是不行的。。。
編譯如下:
可以看見,這裡面報了好多錯,未宣告在這個區域裡
這時該咋辦啊!!!
啊啊啊啊
後來,思考著是不是可以考慮用一下extern,就意味著這個全域性變數已經在其他地方定義過了,試一試,,
#include extern int num,sco;
void print()
int main()
int num = 4, sco = 5;
好啦,編譯通過,執行正確
哈哈(還是有點小激動)
所以,總結如下,對於全域性變數它的生命週期是從當前定義的地方一直到程式執行完畢,之前的函式是不可以操作這個全域性變數的,不然會報出編譯錯誤的提示,當然,這裡也可以用extern來解決這個問題,我覺得extern這個用法應該是碰見extern,只能表明變數不在當前預編譯的程式中,也可能是在下面還麼有編譯到的程式語句中,先預編譯下面的語句,然後再去當前工程的其他c檔案/cpp檔案中查詢變數,如果沒有報錯,如果有,進行相應的操作
關於::value
#include int value = 0;
void printvalue()
int main()
執行結果:
這回明白了吧!!其實(::value)在c++中就可以簡單的理解為通過域操作符(::)來直接操作全域性變數,但是值得注意的是,c中沒有也不支援這個操作符
全域性變數 靜態全域性變數 靜態區域性變數 區域性變數
全域性和靜態變數都在堆裡。這句話應該錯了,應該是放在常量資料段 全域性變數的作用範圍是整個程式 如果程式是多個檔案,必須在其他的檔案中說明 靜態變數的作用範圍要看靜態變數的位置,如果在函式裡,則作用範圍 就是這個函式。靜態全域性變數,只在本檔案可以用,雖然整個程式包含多個檔案,但靜態全域性變數只能用...
全域性變數 靜態全域性變數 靜態區域性變數 區域性變數
全域性和靜態變數都在堆裡。全域性變數的作用範圍是整個程式 如果程式是多個檔案,必須在其他的檔案中說明 靜態變數的作用範圍要看靜態變數的位置,如果在函式裡,則作用範圍 就是這個函式。靜態全域性變數,只在本檔案可以用,雖然整個程式包含多個檔案,但靜態全域性變數只能用在定義它的那個檔案裡,卻不能用在程式中...
全域性變數 靜態全域性變數區域性變數 靜態區域性變數
對於乙個完整的程式,在記憶體中的分布情況如下圖 區 low address 全域性資料區 堆區 棧區 high address 一般程式把新產生的動態資料存放在堆區,函式內部的自動變數存放在棧區。自動變數一般會隨著函式的退出而釋放空間,靜態資料 即使是函式內部的靜態區域性變數 也存放在全域性資料區。...