1、全部變量、局部變量
局部變量:定義在函數內部的變量,作用域爲函數內部 eg: void fun(){ int x;}
全部變量:只能定義一次,多次引用。作用域爲整個文件。
若同一個源文件,全局變量和局部變量重名是,在局部變量的作用域,全部變量不起作用。
關鍵詞:
全部變量:函數外定義+全局可見+存放在內存的全局數據區+未初始化的的時候爲0
局部變量:函數內定義+函數內可見+存放在棧區,函數退出變量消失+不顯式初始化內容不可預知
2、靜態存儲變量、動態存儲變量
靜態存儲變量:程序運行期間永久佔用固定內存的變量+存放在棧區,生命週期爲整個程序
動態存儲變量:根據需要進行臨時動態分配存儲空間的變量+存放在堆區,函數結束後自動釋放
所以程序的指令代碼是放在代碼區,靜態存儲變量是放在靜態數據區(比如全局變量),而程序的動態存儲變量是存放在動態數據區(比如函數的形參、函數調用的返回地址)
3、靜態局部變量、靜態全局變量、外部變量(extern)
靜態局部變量:與局部變量的區別是,在函數退出時該變量還是存在但是不能被其他函數使用。當再次進入到該函數的時候可以使用上次保存的結果。可以理解爲把局部變量緩存起來,在原作用域內有效。(只被初始化一次,下一次初始化根據上一次的結果值)
eg:
#include<stdio.h>
voidfun1(int v){
static int a = v;
printf(“%d”,a)
}
intmain(){
fun1(100);
fun1(200);
}
兩次執行的結果都是100,第二次調用時初始化的a是上一次的值,體現了一次存儲
靜態全局變量、extern:僅在定義的源文件內有效,靜態全局變量與全局變量的區別就是:全局變量和一再聲明爲外部變量(extern),被其他源文件使用。靜態全局變量就不行了,只能在源文件內使用。
任何用static修飾的函數,其作用域僅爲當前源文件,而對外部來說這個函數是不可見的
備註:
一個程序將操作系統分配給其運行的內存塊分爲4個區域:
1、 代碼區:存放程序各個函數的代碼塊
2、 全局數據區:存放全局數據和靜態數據(一次初始化,多次調用)
3、 堆區:動態數據
4、 棧區:局部數據