回頭來看C語言裡的static

2021-09-08 08:12:20 字數 1347 閱讀 7406

沒見過什麼大世面,程式也都是上千行最多了,所以,這些也都沒仔細考慮過。前面為了面試草草的看了下static的一些關鍵用法,囫圇吞棗,壓根沒搞明白具體用處,居然都能蒙混過關。

學習lua到lua包的部分。看到下面一種定義包私有的方法,有點茅塞頓開的意思:

local 

function checkcomplex(c) 

if not ((type(c) == 

"table

") and tonumber(c.r) and tonumber(c.i)) then 

error(

"bad complex number

", 3) 

endendlocal 

function new(r, i) 

return  

endlocal 

function add(c1, c2) 

checkcomplex(c1); 

checkcomplex(c2); 

return new(c1.r + c2.r, c1.i + c2.i) 

end... 

complex = 

同樣,不希望被從其它檔案訪問的變數,我們可以用static把它鎖起來。

1、對於變數:

不管是區域性變數,還是全域性變數,用static宣告之後,都是儲存在靜態區。未初始化的靜態變數自動賦初值為0。

關於靜態儲存區:靜態儲存區也就是通常說的資料段,還會有初始化資料段和未初始化資料段之分;堆是留給程式動態申請空間的,也就是malloc出來的;而棧則是留給區域性變數的。

全域性變數經static宣告後,只能有本檔案範圍內可呼叫;而區域性變數作用域還是定義空間內,但是它的值會因為修改而被更新,而不是再次由棧分配並初始化。

全域性變數的好理解,下面看看用static宣告的區域性變數

#include        

#include        

inttest()

intmain()

它的結果是:2、3

2、對於函式

c裡面的全域性變數及函式是預設可以extern的,而用stiac宣告過之後,就只有在本檔案內可用了。

用static 定義函式或全域性變數名之後,有以下兩個好處:

a、在本檔案內可見,可防止汙染變數名,防止與其它檔案內變數名衝突。

b、只有本檔案可呼叫該函式或該變數,本檔案之外無法訪問。

在其他地方看到有另外的好處,這個是比較稀罕的東西:用static宣告後,它會從一開始就擁有記憶體空間,函式和變數都是如此(預先給函式分配空間?這個怎麼理解,沒學過編譯原理啊);這個記憶體空間的生存週期到程式結束,也就是他不是棧給他臨時分配空間。這樣做大大節約了切換時間(我怎麼覺得不會有多少:x)。

從彙編來看c語言

一 學習過程從c 語言的角度提出一些問題,這些問題再從彙編的角度考慮,還真的很有意思。1 我們用高階語言程式設計時,一般不可能不用到變數,但是一定要用到變數嗎?還有這些變數從彙編的角度是怎麼實現的呢?畢竟暫存器和記憶體空間是不可能儲存乙個變化的值的,要改變暫存器和記憶體空間的值,只有重新賦值。但是原...

C語言裡的for

for迴圈感覺是比較有技術含量的乙個知識點,很容易繞暈過去,特別是for迴圈的巢狀語句,總是有種不知道應該怎麼往下看的無措感。但是for迴圈其實還有點意思,特別是在我用它能輸出菱形之後,越發覺得好神奇。首先總結for的知識點 格式如下 for 表示式1 表示式2 表示式3 語句表示式1 賦初值,只執...

C語言 static的意義

在c語言中,static的字面意思很容易把我們匯入歧途,其實它的作用有三條。1 第乙個作用 隱藏。當我們同時編譯多個檔案時,所有未加static字首的全域性變數和函式都具有全域性可見性。為理解這句話,我舉例來說明。我們要同時編譯兩個原始檔,乙個是a.c,另乙個是main.c。下面是a.c的內容 in...