c語(yǔ)言中static關(guān)鍵字有兩個(gè)作用,一是文件作用域,二是函數(shù)作用域。
一、文件作用域 文件作用域關(guān)鍵字static的作用是,以static申明的全局變量、函數(shù)不得被其他文件所引用,例如: //這是mystr.c文件的內(nèi)容 #include <string.h> static int num = 10; int mynum = 100; static int str_len(char *str) { return strlen(str); } int mystr_len(char *str) { return str_len(str) + num; } 當(dāng)你mystr.c文件中的str_len函數(shù)加上了static關(guān)鍵字,你便不能在其他的地方復(fù)用這個(gè)函數(shù),譬如,你不能這樣寫(xiě): //這是main.c 的內(nèi)容 #include <stdio.h> int main() { int len; len = str_len("hello, world\n"); printf("%d %d\n", num, len ) return 0; } gcc main.c mystr_len.c 將不能編譯通過(guò),因?yàn)閙ystr.c中的num變量和str_len函數(shù)都用了static關(guān)鍵字,導(dǎo)致他們只能在mystr.c中被使用,如文件中的mystr_len函數(shù)可以引用num變量和str_len函數(shù)。 //這是main.c 的內(nèi)容 #include <stdio.h> int main() { int len; len = mystr_len("hello, world\n"); printf("%d %d\n", my_num, len ) return 0; } 當(dāng)不用static關(guān)鍵字時(shí),等同于extern,即 int mystr_len(char *str) { return str_len(str) + num; } 和 extern int mystr_len(char *str) { return str_len(str) + num; } 是一樣的。 二、函數(shù)作用域 static另外一個(gè)用途是函數(shù)內(nèi)部靜態(tài)變量,最常用的情況是 int *test() { int num = 100; int *ptr = # return ptr; } int main() { printf("%d\n", *test); return 0; } 該函數(shù)返回整數(shù)num的指針,在main函數(shù)中打印*test將會(huì)出現(xiàn)段錯(cuò)誤,因?yàn)閚um做為test函數(shù)內(nèi)部,只能在test內(nèi)部被訪(fǎng)問(wèn)。以下程序是正確的。 int *test() { static int num = 100; int *ptr = # return ptr; } int main() { printf("%d\n", *test); return 0; } 該程序中num變量加了關(guān)鍵字static,函數(shù)運(yùn)行結(jié)束后,依然可以在其他地方被引用,只是不能直接通過(guò)變量名訪(fǎng)問(wèn),而要間接通過(guò)指針訪(fǎng)問(wèn),原因是 static變量存儲(chǔ)在全局?jǐn)?shù)據(jù)段中而不是函數(shù)棧中。讀者可以將它看作特殊的全局變量,只是其他地方只能通過(guò)指針來(lái)訪(fǎng)問(wèn),而不能直接通過(guò)變量名訪(fǎng)問(wèn)。 |
|
來(lái)自: jinziyatoo > 《C學(xué)習(xí)》