訂閱
糾錯
加入自媒體

關鍵字static的使用方法

2021-02-01 17:30
一口Linux
關注

對于普通的局部變量,每次調用的時候,都會在棧里初始化1次,

1 #include <stdio.h>
 2
 3
 4 void func()
 5 {
 6     static int aa = 11;
 7                                                                                                
 8     printf("aa= %d ",aa++);
 9
10 }
11
12 int main(int argc, char **argv)
13 {
14    
15     func();
16     func();
17
18     return 0;
19 }

函數(shù)中靜態(tài)變量aa 只初始化一次,每次訪問的值應該是上一次調用到該函數(shù)時最后處理的結果,

三、static 函數(shù)

1. 概念:

在函數(shù)的返回類型前加上關鍵字static,函數(shù)就被定義成為靜態(tài)函數(shù)。

函數(shù)的定義和聲明默認情況下是extern的,但靜態(tài)函數(shù)只是在聲明他的文件當中可見,不能被其他文件所用。

static函數(shù)(也叫內部函數(shù))只能被本文件中的函數(shù)調用,而不能被同一程序其它文件中的函數(shù)調用。

區(qū)別于一般的非靜態(tài)函數(shù)(外部函數(shù)) static在c里面可以用來修飾變量,也可以用來修飾函數(shù)。

先看用來修飾變量的時候。變量在c里面可分為存在全局數(shù)據(jù)區(qū)、棧和堆里。

其實我們平時所說的堆棧是棧而不包含堆,不要弄混。

2. 定義靜態(tài)函數(shù)的好處:<1>其他文件中可以定義相同名字的函數(shù),不會發(fā)生沖突,不用擔心自己定義的函數(shù),是否會與其它文件中的函數(shù)同名,因為同名也沒有關系。<2> 靜態(tài)函數(shù)不能被其他文件所用。存儲說明符auto,register,extern,static,對應兩種存儲期:自動存儲期和靜態(tài)存儲期。<3> 統(tǒng)計次數(shù)功能聲明函數(shù)的一個局部變量,并設為static類型,作為一個計數(shù)器,這樣函數(shù)每次被調用的時候就可以進行計數(shù)。這是統(tǒng)計函數(shù)被調用次數(shù)的最好的辦法,因為這個變量是和函數(shù)息息相關的,而函數(shù)可能在多個不同的地方被調用,所以從調用者的角度來統(tǒng)計比較困難。<4> 靜態(tài)函數(shù)會被自動分配在一個一直使用的存儲區(qū),直到退出應用程序實例,避免了調用函數(shù)時壓棧出棧,速度快很多。舉例

a.c

 1 #include <stdio.h>
 2
 3 void func();
 4
 5 int main(int argc, char **argv)
 6 {
 7    
 8     func();                                                                                                        
 9
10     return 0;
11 }

b.c

 1 #include <stdio.h>
 2
 3 int b = 10;
 4
 5
 6 static void func()                                                                                                
 7 {
 8     printf("in func b =%d",b);
 9 }

編譯

由編譯結果可知,a文件訪問不到b文件中的靜態(tài)函數(shù)func。

四、一個關于static變量的巧妙的用法-偷梁換柱

如何定義一個和庫函數(shù)名一樣的函數(shù),并在函數(shù)中調用該庫函數(shù)?

關于該問題的答案,彭老師已經(jīng)已經(jīng)將分析過程發(fā)布于以下文章。

粉絲提問|c語言:如何定義一個和庫函數(shù)名一樣的函數(shù),并在函數(shù)中調用該庫函數(shù)


<上一頁  1  2  3  
聲明: 本文由入駐維科號的作者撰寫,觀點僅代表作者本人,不代表OFweek立場。如有侵權或其他問題,請聯(lián)系舉報。

發(fā)表評論

0條評論,0人參與

請輸入評論內容...

請輸入評論/評論長度6~500個字

您提交的評論過于頻繁,請輸入驗證碼繼續(xù)

暫無評論

暫無評論

    掃碼關注公眾號
    OFweek人工智能網(wǎng)
    獲取更多精彩內容
    文章糾錯
    x
    *文字標題:
    *糾錯內容:
    聯(lián)系郵箱:
    *驗 證 碼:

    粵公網(wǎng)安備 44030502002758號