C語言變量聲明類型與存儲區域探究

靜態局部變量具有局部作用域,它只被初始化一次,自從第一次被初始化直到程序運行結束都一直存在,它和全局變量的區別在於全局變量對所有的函數都是可見的,而靜態局部變量只對定義自己的函數體始終可見。

 

靜態全局變量也具有全局作用域,它與全局變量的區別在於如果程序包含多個文件的話,它作用於定義它的文件裏,不能作用到其它文件裏,即被static關鍵字修飾過的變量具有文件作用域。這樣即使兩個不同的源文件都定義了相同名字的靜態全局變量,它們也是不同的變量。由於靜態全局變量的作用域侷限於一個源文件內,只能爲該源文件內的函數公用,因此可以避免在其它源文件中引起錯誤。

 

全局變量,靜態局部變量,靜態全局變量都在靜態存儲區分配空間,而局部變量在棧裏分配空間

一個由C/C++編譯的程序佔用的內存分爲以下幾個部分 

棧區(stack)由編譯器自動分配釋放 ,存放函數的參數值,局部變量的值等。其操作方式類似於數據結構中的棧。

堆區(heap)一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收 。

全局區(靜態區)(static)全局變量和靜態變量的存儲是放在一塊的,初始化的全局變量和靜態變量在一塊區域,未初始化的全局變量和未初始化的靜態變量在相鄰的另一塊區域。 程序結束後由系統釋放 

文字常量區常量字符串就是放在這裏的。 程序結束後由系統釋放

程序代碼區—存放函數體的二進制代碼。

 

For循環中其實不管是i++++i都是在for循環體全部執行完畢後才執行,

如:for(int i = 0;i < 10; i++){

printf(“%d\n”,i);

}

等同於for(int i = 0;i < 10; ){

printf(“%d\n”,i);

 i++;

}

for(int i = 0;i < 10; ++i){

printf(“%d\n”,i);

}

同樣和for(int i = 0;i < 10; ){

printf(“%d\n”,i);

++i;

}是一個意思

 

i++  :先在i所在的表達式中使用i的當前值,後讓i1

++i  :讓i先加1,然後在i所在的表達式中使用i的新值

 

i++由於是在使用當前值之後再+1,所以會需要一個臨時變量來轉儲,而++則直接+1,不存在這樣的問題。

在沒有編譯器優化的情況下,++i更好。優化過後兩者都一樣

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章