1. 程式人生 > >C語言中static的作用及C語言中使用靜態函式有何好處

C語言中static的作用及C語言中使用靜態函式有何好處

在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裡面可分為存在全域性資料區、棧和堆裡。其實我們平時所說的堆疊是棧而不包含對,不要弄混。

相關推薦

C言中static作用C語言使用靜態函式好處

在C語言中,static的字面意思很容易把我們匯入歧途,其實它的作用有三條,分別是: 一是隱藏功能,對於static修飾的函式和全域性變數而言 二是保持永續性功能,對於static修飾的區域性變數而言。 三是因為存放在靜態區,全域性和區域性的static修飾的變數,都預設初始化為0 下面我逐一給

C言中static關鍵字的作用

編譯 size lac 所有 指針 變量 運行時 http 多個 在C語言中static的作用如下 第一、在修飾變量的時候,static修飾的靜態局部變量只執行一次,而且延長了局部變量的生命周期,直到程序運行結束以後才釋放。 第二、static修飾全局變量的時候,這個全局變

C言中static關鍵字的作用詳解

在C語言中,static的字面意思很容易把我們匯入歧途,其實它的作用有三條。 (1)先來介紹它的第一條也是最重要的一條:隱藏。 當我們同時編譯多個檔案時,所有未加static字首的全域性變數和函式都具有全域性可見性。為理解這句話,我舉例來說明。我們要同時編譯兩個原始檔,一個是a.c,另一個是

C言中static的常見作用

有興趣學習c/c++程式設計的小夥伴可以進群:941636044 一起交流哦~ C程式一直由下列部分組成: 1)正文段——CPU執行的機器指令部分;一個程式只有一個副本;只讀,防止程式由於意外事故而修改自身指令; 2)初始化資料段(資料段)——在程式中所有賦了初值的

C言中static修飾的函式和普通函式的區別

用static修飾的函式,本限定在本原始碼檔案中,不能被本原始碼檔案以外的程式碼檔案呼叫。而普通的函式,預設是extern的,也就是說,可以被其它程式碼檔案呼叫該函式。 在函式的返回型別前加上關鍵字static,函式就被定義成為靜態函式。普通 函式的定義和宣告預設情況下是extern的,但靜

C言中static全域性變數與普通的全域性變數區別

下面是中興通訊2012校招筆試題的一道問答題: 1. static全域性變數與普通的全域性變數有什麼區別 ?   全域性變數(外部變數)的說明之前再冠以static 就構成了靜態的全域性變數。   全域性變數本身就是靜態儲存方式, 靜態全域性變數當然也是靜態儲存方式。 這兩者在儲存方式上

c言中static關鍵字用法詳解

概述 static關鍵字在c語言中比較常用,使用恰當能夠大大提高程式的模組化特性,有利於擴充套件和維護。 但是對於c語言初學者,static由於使用靈活,並不容易掌握。本文就static在c語言中的應用進行總結,供參考使用。錯漏之處,請不吝指正。 在程

c言中static和auto的區別

1、static變數存放在靜態儲存區,在程式整個執行期間都不釋放;而auto變數存放在動態儲存區,隨著生命週期的結束而立即釋放。 2、static變數只賦值一次,以後就不用賦值;而auto變數在函式每呼叫一次都要賦初值

C言中static的含義和用法

———————————– 測試環境:linux 開發語言:c 編譯工具:gcc ———————————– static 顧名思義是靜態、靜止的意思 個人理解的含義是私有、靜態 私有就是隱藏-> 1.static函式只能聲明後的本文中呼叫

C言中static與extern的用法

在C語言中,static與extern的用法 (1)修飾區域性變數 a.一般情況下,對於區域性變數是存放在棧區的,並且區域性變數的生命週期在該語句塊執行結束時便結束了。但是如果用static進行修飾的話,該變數便存放在靜態資料區,其生命週期一直持續到整個程式

C言中static 函式除了不能再外部被呼叫外和普通函式還有什麼區別呢?

iThinks:本文來自CSDN論壇的討論,觀點不一定全對,但值得從這幾個方面考察static。 C程式一直由下列部分組成:       1)正文段——CPU執行的機器指令部分;一個程式只有一個副本;只讀,防止程式由於意外事故而修改自身指令;      2)初始化資料段

C言中 .h檔案和.c檔案的區別

要理解.c檔案與.h檔案有什麼不同之處,首先需要弄明白編譯器的工作過程,一般說來編譯器會做以下幾個過程: 1.預處理階段 2.詞法與語法分析階段 3.編譯階段,首先編譯成純彙編語句,再將之彙編成跟CPU相關的二進位制碼,生成各個目標檔案 4.連線階段,將各個目標檔案中的各段程式碼進行絕對地址定位,生成跟特定平

C言中 .h檔案和.c檔案的區別 (轉)

要理解.c檔案與.h檔案有什麼不同之處,首先需要弄明白編譯器的工作過程,一般說來編譯器會做以下幾個過程:1.預處理階段2.詞法與語法分析階段3.編譯階段,首先編譯成純彙編語句,再將之彙編成跟CPU相關的二進位制碼,生成各個目標檔案4.連線階段,將各個目標檔案中的各段程式碼進行絕對地址定位,生成跟特定平臺相關

C言中malloc/free和C++new/delete的區別

1. malloc()函式1.1 malloc的全稱是memory allocation,中文叫動態記憶體分配。原型:extern void *malloc(unsigned int num_bytes); 說明:分配長度為num_bytes位元組的記憶體塊。如果分配成功則返回指向被分配記憶體的指標,分配失敗

C言中的for迴圈和python的for迴圈的引數控制

最近在複習基礎演算法的時候對C語言中的for迴圈和python中的for迴圈的一個不同之處做了一個驗證:1、C語言中for(i=0;i<10;i++)裡的i受到for迴圈內部條件控制如下圖所示  可看到i因為for迴圈中的條件影響從1跳到了42、python中for i

C言中,當計算字符數組長度時,用sizeof 和strlen 的原理兩者的區別

指針 data- 編譯器 tracking 行處理 ews csdn 編譯 分配 字符數組的長度計算:必須以終止符’\0‘作為邊界,但對字符數組賦值時,有兩種方式: 1:定義時用字符初始化 (1)char chs[7] = {‘a‘, ‘c‘, ‘0‘, ‘z‘, ‘3

C++語言學習(五)——C++言中的CV限定符錯誤

val ber char 返回 names main code 3.1 類的靜態成員 C++語言學習(五)——C++語言中的CV限定符錯誤 ?一、CV限定符錯誤簡介 1、CV限定符簡介 CV限定符即cv-qualifier,C++語言中指const和volatile限定符。

C言中volatile關鍵字的作用

本文為轉載總結文章:點選進入原地址 用volatile修飾變數的時候,意指系統總是重新從它所在的記憶體讀取資料。遇到這個關鍵字宣告的變 量,編譯器對訪問該變數的程式碼就不再進行優化,從而可以提供對特殊地址的穩定訪問。 舉一個容易理解的例子: volatile int i=10;

c言中external,static關鍵字用法

static用法: 在C中,static主要定義全域性靜態變數、定義區域性靜態變數、定義靜態函式。 1、定義全域性靜態變數:在全域性變數前面加上關鍵字static,該全域性變數變成了全域性靜態變數。全域性靜態變數有以下特點。 a.在全域性區分配記憶體。 b.如果沒有初始化,其預設值為

C言中restrict的作用

    關鍵字restrict通過允許編譯器優化某幾種程式碼增強了計算支援。記住,它只能用於指標,並且表明指標是訪問一個數據物件的唯一且初始的方式。為了清楚為何這樣做,我們需要看一些例子: int ar[10]; int* restrict restar = (int*