C語言中static的作用(精煉)

2021-07-26 05:04:25 字數 2313 閱讀 9219

static的作用

(精闢分析

)

在c語言中,

static

的字面意思很容易把我們匯入歧途,其實它的作用有三條。

1)先來介紹它的第一條也是最重要的一條:隱藏。

當我們同時編譯多個檔案時,所有未加

static

字首的全域性變數和函式都具有全域性可見性。為理解這句話,我舉例來說明。我們要同時編譯兩個原始檔,乙個是

a.c,另乙個是

main.c

。下面是

a.c的內容

char

a = 'a'; 

// global variable

void

msg() 

下面是main.c

的內容int

main(

void)

程式的執行結果是:

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

intfun(

void

)int

count = 1;

intmain(

void)

程式的執行結果是:

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

inta;

intmain(

void)

程式的執行結果如下

integer: 0; string: (begin)(end)

最後對static

的三條作用做一句話總結。首先

static

的最主要功能是隱藏,其次因為

static

變數存放在靜態儲存區,所以它具備永續性和預設值0。

c語言中static作用

本文根據多篇網路部落格整合而成一.c程式一直由下列部分組成 1 正文段 cpu執行的機器指令部分 乙個程式只有乙個副本 唯讀,防止程式由於意外事故而修改自身指令 2 初始化資料段 資料段 在程式中所有賦了初值的全域性變數,存放在這裡。3 非初始化資料段 bss段 在程式中沒有初始化的全域性變數 核心...

C語言中static 作用

在c語言中static的作用如下 版本一 include char a a 普通全域性函式 void fun 普通全域性函式 include extern void fun 宣告外部函式為全域性函式 int main void 編譯 gcc c gcc a.c b.c 輸出 a hello worl...

c語言中static作用

1 在函式體,乙個被宣告為靜態的變數在這一函式被呼叫過程中維持其值不變。include stdio.h int main return0 int fac int n 我們通過這個例子可以看到static 作為靜態儲存在每次函式呼叫完畢並不釋放。2 在模組內 但在函式體外 乙個被宣告為靜態的變數可以被...