C說話中static的感化及C說話中應用靜態函數有何利益。本站提示廣大學習愛好者:(C說話中static的感化及C說話中應用靜態函數有何利益)文章只能為提供參考,不一定能成為您想要的結果。以下是C說話中static的感化及C說話中應用靜態函數有何利益正文
想懂得Java中static症結字的感化和用法具體引見,請點擊此處懂得概況。
在C說話中,static的字面意思很輕易把我們導入邪路,其實它的感化有三條,分離是:
一是隱蔽功效,關於static潤飾的函數和全局變量而言
二是堅持耐久性功效,關於static潤飾的部分變量而言。
三是由於寄存在靜態區,全局和部分的static潤飾的變量,都默許初始化為0
上面我一一給年夜家引見:
(1)先來引見它的第一條也是最主要的一條:隱蔽。
當我們同時編譯多個文件時,一切未加static前綴的全局變量和函數都具有全局可見性。為懂得這句話,我舉例來講明。我們要同時編譯兩個源文件,一個是a.c,另外一個是main.c。
上面是a.c的內容
char a = 'A'; // global variable void msg() { printf("Hello\n"); }
上面是main.c的內容
int main(void) { extern char a; // extern variable must be declared before use printf("%c ", a); (void)msg(); return 0; }
法式的運轉成果是:
A Hello
你能夠會問:為何在a.c中界說的全局變量a和函數msg能在main.c中應用?後面說過,一切未加static前綴的全局變量和函數都具有全局可見性,其它的源文件也能拜訪。此例中,a是全局變量,msg是函數,而且都沒有加static前綴,是以關於別的的源文件main.c是可見的。
假如加了static,就會對其它源文件隱蔽。例如在a和msg的界說前加上static,main.c就看不到它們了。應用這一特征可以在分歧的文件中界說同名函數和同名變量,而不用擔憂定名抵觸。Static可以用作函數和變量的前綴,關於函數來說,static的感化僅限於隱蔽,而關於變量,static還有上面兩個感化。
(2)static的第二個感化是堅持變量內容的耐久。存儲在靜態數據區的變量會在法式剛開端運轉時就完成初始化,也是獨一的一次初始化。共有兩種變量存儲在靜態存儲區:全局變量和static變量,只不外和全局變量比起來,static可以掌握變量的可見規模,說究竟static照樣用來隱蔽的。固然這類用法不罕見,但我照樣舉一個例子。
#include <stdio.h> int fun(void){ static int count = 10; // 現實上此賦值語句歷來沒有履行過 return count--; } int count = 1; int main(void) { printf("global\t\tlocal static\n"); for(; count <= 10; ++count) printf("%d\t\t%d\n", count, fun()); return 0; }
法式的運轉成果是:
global local static
1 10
2 9
3 8
4 7
5 6
6 5
7 4
8 3
9 2
10 1
(3)static的第三個感化是默許初始化為0。其實全局變量也具有這一屬性,由於全局變量也存儲在靜態數據區。在靜態數據區,內存中一切的字節默許值都是0x00,某些時刻這一特色可以削減法式員的任務量。好比初始化一個稀少矩陣,我們可以一個一個地把一切元素都置0,然後把不是0的幾個元素賦值。假如界說成靜態的,就省去了一開端置0的操作。再好比要把一個字符數組當字符串來用,但又認為每次在字符數組末尾加'\0'太費事。假如把字符串界說成靜態的,就省去了這個費事,由於那邊原來就是'\0'。無妨做個小試驗驗證一下。
#include <stdio.h> int a; int main(void) { int i; static char str[10]; printf("integer: %d; string: (begin)%s(end)", a, str); return 0; }
法式的運轉成果以下
integer: 0; string: (begin)(end)
最初對static的三條感化做一句話總結。起首static的最重要功效是隱蔽,其次由於static變量寄存在靜態存儲區,所以它具有耐久性和默許值0。
以上內容是關於c說話中static的感化。
上面給年夜家引見C說話中應用靜態函數的利益。
C說話中應用靜態函數的利益:
靜態函數會被主動分派在一個一向應用的存儲區,直到加入運用法式實例,防止了挪用函數時壓棧出棧,速度快許多。
症結字“static”,譯成中文就是“靜態的”,所之內部函數又稱靜態函數。但此處“static”的寄義不是指存儲方法,而是指對函數的感化域僅局限於本文件。 應用外部函數的利益是:分歧的人編寫分歧的函數時,不消擔憂本身界說的函數,能否會與其它文件中的函數同名,由於同名也沒有關系。
c說話中static的語義1.static變量:1).部分a.靜態部分變量在函數內界說,生計期為全部源法式,但感化域與主動變量雷同,只能在界說該變量的函數內應用。加入該函數後, 雖然該變量還持續存在,但不克不及應用它。b.對根本類型的靜態部分變量若在解釋時未賦以初值,則體系主動付與0值。而對主動變量不賦初值,則其值是不定的。2).全局全局變量自己就是靜態存儲方法, 靜態全局變量固然也是靜態存儲方法。然則他們的感化域,非靜態全局 變量的感化域是全部源法式(多個源文件可以配合應用); 而靜態全局變量則限制了其感化域, 即只在界說該變量的源文件內有用, 在統一源法式的其它源文件中不克不及應用它。2.static函數(也叫外部函數)只能被本文件中的函數挪用,而不克不及被統一法式其它文件中的函數挪用。差別於普通的非靜態函數(內部函數) static在c外面可以用來潤飾變量,也能夠用來潤飾函數。 先看用來潤飾變量的時刻。變量在c外面可分為存在全局數據區、棧和堆裡。其實我們日常平凡所說的客棧是棧而不包括對,不要弄混。