局部變量:定義在函數內部的變量叫局部變量。
全局變量:定義在函數外部的變量叫全局變量。
變量作用域:局部變量只作用於函數內部,全局變量作用於整個工程。
1:局部變量只在定義它的函數內部有效,其他函數不能使用它(因為每個函數有自己的獨立空間,其他函數要用它的時候空間已經被回收)。
2:全局變量在數據區中,局部變量在棧中。全局變量通常自動初始化為0,局部變量看編譯環境,debug下為全C;Release方式下為以前占用此空間的殘留值。調試:
通過這個例子很容易看到,全局變量地址在0x0042c17c(數據區),局部變量地址在0x0012ff44(棧區)(關於怎麼從地址認區呢,我想這個只能是個大概,也就是說,哪個地址大概是什麼區,因為多調試幾個程序後,會看到不同的變量所占的地址區域的特點!).
應用程序在運行時在內存中的分區:代碼區((放代碼)可讀可執行);數據區((放全局變量,靜態變量)(可讀可寫));棧區(局部變量);堆區;(我的理解肯定還不完善,到以後我學習到更多的知道啦!我再進進行說明了哦!)。
3:初始化時機的不同。全局變量在main函數之前初始化,局部變量進函數的時候才初始化,例子:
這樣呢!我們可以清楚看到啦!全局變量g_x在沒有進main函數之前就被初始化為我代碼所定義的0x12345678這個值了(很抱歉啦!我沒有截修改後的代碼圖,看不見g_x=0x12345678)。
疑問:全局變量g_x怎麼知道值是0x12345678呢?!我們在調試的時候並沒有看到有賦值語句啊!
既然我們在調試的從真正的入口處都沒有看到有全局變量的賦值操作,那麼這個賦值操作肯定還在這之前。這樣的話,那我們去可執行文件裡去看看:
我們看到024A33處有個12345678的值。這個值就是全局變量的那個值嗎,這樣辦!我們把它修改成0x87654321。然後我們再看可執行文件的輸出,全局變量g_n的值果然也被改了。這說明呢!全局變量的初始化是編譯器做的。被寫在了可執行文件裡啦!!!
注意點:禁止用全局變量!因為全局變量和太多的“人”和“事”有關系了!