華為 1.static有什么用途?(請至少說明兩種)


1.static有什么用途?(請至少說明兩種)

    1)在函數體,一個被聲明為靜態的變量在這一函數被調用過程中維持其值不變。

    2) 在模塊內(但在函數體外),一個被聲明為靜態的變量可以被模塊內所用函數訪問,但不能被模塊外其它函數訪問。它是一個本地的全局變量。

    3) 在模塊內,一個被聲明為靜態的函數只可被這一模塊內的其它函數調用。那就是,這個函數被限制在聲明它的模塊的本地范圍內使用

    以上是c的內容,對於c++請看以下三個示例之后的部分!!!

    1)示例:

     static的第一個作用是保持變量內容的持久。存儲在靜態數據區的變量會在程序剛開始運行時就完成初始化,也是唯一的一次初始化。共有兩種變量存儲在靜態存儲區:全局變量和static變量,只不過和全局變量比起來,static可以控制變量的可見范圍,說到底static還是用來隱藏的。雖然這種用法不常見,但我還是舉一個例子。 

 1 #include<stdio.h>
 2 
 3 int fun(void)
 4 {
 5     static int count = 10; //事實上此賦值語句從來沒有執行過 
 6     return count--;
 7 } 
 8 
 9 int count = 1; 
10 
11 int main(void) 
12 { 
13     printf("global\t\tlocal static\n"); 
14     for(; count <= 10; ++count)
15         printf("%d\t\t%d\n", count, fun());
16     return 0;
17 } 

 

程序的運行結果是:

 global local static 

1 10 

2 9 

3 8 

4 7 

5 6 

6 5 

7 4 

8 3 

9 2 

10 1 

參考轉自:http://wenku.baidu.com/link?url=GeR-U21HvIYGnuF1xmCEmf-SzR6R-Nfj8x2_RRxXi-NfDPN39XGNWpwGrVTZbyb-_osre3Y89lKfoAiKqWEgX86umsjLfBzxCcDqDkPpkou

 

 

    2)示例:

    它的第二條也是最重要的一條:隱藏。 
    當我們同時編譯多個文件時,所有未加static前綴的全局變量和函數都具有全局可見性。為理解這句話,我舉例來說明。我們要同時編譯兩個源文件,一個是a.c,另一個是main.c。 下面是a.c的內容 

1 char a = 'A'; // global variable
2 void msg()
3 { 
4  printf("Hello\n");
5 }

    下面是main.c的內容

1 int main(void)
2 {
3     extern char a; // extern variable must be declared before use print 
4     f("%c ", a); 
5     (void)msg();
6     return 0;
7 }

   程序的運行結果是: A Hello 
   你可能會問:為什么在a.c中定義的全局變量a和函數msg能在main.c中使用?前面說過,所有未加static前綴的全局變量和函數都具有全局可見性,其它的源文件也能訪問。此例中,a是全局變量,msg是函數,並且都沒有加static前綴,因此對於另外的源文件main.c是可見的。 
   如果加了static,就會對其它源文件隱藏。例如在a和msg的定義前加上static,main.c就看不到它們了。利用這一特性可以在不同的文件中定義同名函數和同名變量,而不必擔心命名沖突。Static可以用作函數和變量的前綴,對於函數來講,static的作用僅限於隱藏,而對於變量,static還有其他兩個作用。 

 

    3)示例:

    static的第三個作用是默認初始化為0。其實全局變量也具備這一屬性,因為全局變量也存儲在靜態數據區。在靜態數據區,內存中所有的字節默認值都是0x00,某些時候這一特點可以減少程序員的工作量。比如初始化一個稀疏矩陣,我們可以一個一個地把所有元素都置0,然后把不是0的幾個元素賦值。

    如果定義成靜態的,就省去了一開始置0的操作。再比如要把一個字符數組當字符串來用,但又覺得每次在字符數組末尾加&rsquo;\0&rsquo;太麻煩。如果把字符串定義成靜態的,就省去了這個麻煩,因為那里本來就是&rsquo;\0&rsquo;。

    不妨做個小實驗驗證一下。 

1 #include <stdio.h>
2 int a; 
3 int main(void)
4 { 
5     int i; 
6     static char str[10]; 
7     printf("integer: %d; string: (begin)%s(end)", a, str); 
8     return 0; 
9 } 

   程序的運行結果如下 

integer: 0; string: (begin)(end) 
    最后對static的三條作用做一句話總結。首先static的最主要功能是隱藏,其次因為static變量存放在靜態存儲區,所以它具備持久性和默認值0。 

 

 

以下轉自:http://blog.csdn.net/leo115/article/details/8085414

面試題:static有什么作用?

答:在C語言中,static主要定義全局靜態變量,定義局部靜態變量,定義靜態函數

 一、       定義全局靜態變量 :在全局變量前面加上關鍵字static,該全局變量變成了全局靜態變量。全局靜態變量有以下特點:

(1)       在全局數據區內分配內存

(2)       如果沒有初始化,其默認值為0

(3)       該變量在本文件內從定義開始到文件結束可見

 二、       定義局部靜態變量:在局部靜態變量前面加上關鍵字static,該局部變量便成了靜態局部變量。靜態局部變量有以下特點:

(1)       該變量在全局數據區分配內存

(2)       如果不顯示初始化,那么將被隱式初始化為0

(3)       它始終駐留在全局數據區,直到程序運行結束

(4)       其作用域為局部作用域,當定義它的函數或語句塊結束時,其作用域隨之結束。

  三、       定義靜態函數:在函數的返回類型加上static關鍵字,函數即被定義成靜態函數。靜態函數有以下特點:

(1)       靜態函數只能在本源文件中使用

(2)       在文件作用域中聲明的inline函數默認為static

                說明:靜態函數只是一個普通的全局函數,只不過受static限制,他只能在文件坐在的編譯單位內使用,不能呢個在其他編譯單位內使用。

在C++語言中新增了兩種作用:定義靜態數據成員或靜態函數成員

(1)       定義靜態數據成員。靜態數據成員有如下特點:

(1)       內存分配:在程序的全局數據區分配

(2)       初始化和定義:靜態數據成員定義時要分配空間,所以不能在類聲明中定義

(3)       靜態成員函數。靜態成員函數與類相聯系,不與類的對象相聯系。靜態成員函數不能訪問非靜態數據成員。原因很簡單,非靜態數據成員屬於特定的類實例,主要用於對靜態數據成員的操作。

(4)       靜態成員函數和靜態數據成員都沒有this指針。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM