C語言中的靜態、全域、局部變數/函數的說明)

來源:互聯網
上載者:User
 C語言中的“靜態”、“全域”的概念很容易弄混淆,無論是在學校,還是工作了以後,我個人在寫代碼的時候能避開就避開,咋一看還以為是優良的編程習慣呢,實際上是因為對C語言的不完全掌握, 相信也有一些人跟我一樣,對static與extern也是非常的不願提及。儘管各式各樣的編程規範裡都要求我們盡量不要使用全域變數,注意措辭,是“盡量”,這說明有的時候還是避免不了的,而靜態變數就不必說了。

 

對一門程式設計語言的理解有點像打掃房間,你越不願意掃的角落越容易引起你的不安。因此,很有必要把這裡好好的“打掃”一下。下面的文字有些來自網路,來自書本,還有就是是個人的體會,而且每一個結論都用了一些實驗驗證了。

 

先說說靜態修飾的涵義:靜態修飾的意義主要體現在一次儲存和範圍限定;

1、  一次儲存:靜態修飾的一次儲存功能主要體現在變數上

a)         靜態局部變數只被初始化一次,下一次初始化根據上一次的結果值,有點類似於c++中類的靜態成員變數,即無論該類型產生多少個執行個體對象,所有的對象共用一個靜態變數,到這裡就是無論這個函數調用多少次,該靜態變數只初始化一次,並沒有因為超出其生存期而被銷毀,只是外部不可見而已,用個例子說明之:

void  fun1( int  v )
{
    static  int  value = v;
    static  int  value = v;
}
int  main( int  arc, char  *args[ ])
{
    fun1( 50 );
    fun1( 100 );
}

執行的結果是:value : 50  value : 50
說明在第二次調用fun1( )時的初始化value的採用的是上一次value的值,value在靜態區的儲存空間並沒有因為fun1( )的結束而被釋放,即體現了一次儲存;

b)        sdf

2、  範圍限定:靜態修飾的範圍限定功能同時體現在函數與變數上;

a)         對於函數而言,任何用static修飾的函數,其範圍僅為當前源檔案,而對外部來說這個函數是不可見的,即只有和其在同一源檔案中的函數才能調用這個靜態函數;反過來說,如果一個函數僅僅被同一源檔案中的其他函數調用,那麼這個函數應該聲明為靜態,這樣做的好處在於:可以一定程度上的解決不同源檔案之間函數的命名衝突問題;

b)        對於變數而言,static修飾的全域變數,只在當前源檔案中有效,對外部不可見,外部檔案不能夠引用;

 

接下來分析一下全域變數以及全域變數與靜態變數的關係:

顧名思義,全域變數是指能夠在全域引用的變數,相對於局部變數的概念,也叫外部變數;同靜態變數一樣,全域變數位於待用資料區,全域變數一處定義,多處引用,用關鍵字“extern”引用“外部”的變數。

全域變數也可以是靜態,在前面有過說明,靜態全域變數的意義就是不讓“外部”引用,是單個源檔案裡的全域變數,即是編譯階段的全域變數,而不是串連階段的全域變數。

 

通過上面的分析,我們不難得出以下結論:

1、  靜態函數與普通函數的區別在於:靜態函數不可以被同一源檔案以外的函數調用。

2、  靜態局部變數與普通局部變數的區別在於:靜態局部變數只初始化一次,下一次初始化實際上是依然是上一次的變數;

3、  靜態全域變數與普通全域變數的區別在於:靜態全域變數的範圍僅限於所在的源檔案。

 

補充:如果在標頭檔中如果定義一個靜態全域變數(不太好的習慣,很少的時候需要這樣做),那意味著每一個包含此標頭檔的源碼檔案裡都會包含這樣一個相互獨立的全域變數。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.