c語言中定義的static關鍵字主要有兩個作用。(c++對它進行了擴充套件,有三個作用。)
第乙個作用是修飾變數,又可分為修飾全域性變數和修飾區域性變數兩種情況。
1.修飾全域性變數:全域性變數的值存放在棧上,其儲存型別為靜態儲存型別,不管有沒有在其前加static關鍵字,因此,全域性變數的作用域為從定義全域性變數起始處到檔案結尾處。沒有加static關鍵字的全域性變數,除了可以在其定義的檔案之中被引用外,其他檔案也可以通過使用extern宣告來引用它。但是,加了static關鍵字的全域性變數,其他檔案即使使用extern宣告也無法引用它。
2.修飾區域性變數:若區域性變數前沒有加static關鍵字,則其值存放在堆上,儲存型別為動態儲存型別,作用域為從變數定義起始處到函式結束處,可以被初始化任意次,若未指定初始化值,則預設初始化值是乙個任意數。若區域性變數前加了static關鍵字,則其值存放在棧上,儲存型別為靜態儲存型別,作用域為從變數定義起始處到檔案結尾處,只能被初始化一次,若未指定初始化值,則預設初始化值為0。如以下**:
#include
static localval()
void main()
static關鍵字修飾的變數一般不能作為函式形參。像下面這段**,vc下編譯,會給出乙個警告,然後忽略static。
#include
staticlocalval(static int a)//vc下編譯,a的位址為0x0012ff2c,處於堆位址,可見static被忽略掉了
void main()
static.c(3) : warning c4042: 'a' : has bad storage class
乙個函式中定義的static變數,能不能被其他函式引用呢?
在vc下執行如下**,會出來兩個連線錯誤,可見,靜態區域性變數,只能在其定義的函式內部使用。
#include
staticlocalval()
callstalocval()
void main()
static.obj : error lnk2001: unresolved external symbol _a
debug/static.exe : fatal error lnk1120: 1 unresolved externals
第二個作用是修飾函式。
static修飾函式,不改變函式的儲存型別,只是改變函式的作用域。沒有加static的函式,其他檔案可以通過使用extern來呼叫函式,若函式前加了static關鍵字,則該函式只能在本檔案中使用(所以又稱內部函式)。使用內部函式的好處是:不同的人編寫不同的檔案時,不用擔心自己定義的函式,會與其他人寫的函式同名。
C語言中static關鍵字用法
static關鍵字在c語言中比較常用,使用恰當能夠大大提高程式的模組化特性,有利於擴充套件和維護。變數1.區域性變數 普通區域性變數是再熟悉不過的變數了,在任何乙個函式內部定義的變數 不加static修飾符 都屬於這個範疇。編譯器一般不對普通區域性變數進行初始化,也就是說它的值在初始時是不確定的,除...
C語言中static關鍵字用法
概述 static關鍵字在c語言中比較常用,使用恰當能夠大大提高程式的模組化特性,有利於擴充套件和維護。在程式中使用static 變數1.區域性變數 普通區域性變數是再熟悉不過的變數了,在任何乙個函式內部定義的變數 不加static修飾符 都屬於這個範疇。編譯器一般不對普通區域性變數進行初始化,也就...
C語言中static關鍵字的用法
static關鍵字在c語言中主要有兩種用法 unsigned char test int main getchar unsigned char test static unsigned char i i return i 以上輸出後i的數值會遞增,如果去掉static關鍵字,程式編譯提示區域性變數未...