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的操作。再比如要把一個字符數組當字符串來用,但又覺得每次在字符數組末尾加’\0’太麻煩。如果把字符串定義成靜態的,就省去了這個麻煩,因為那里本來就是’\0’。
不妨做個小實驗驗證一下。
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指針。