static變數的作用
1,改變變數的生命期
對於static
全域性變數而言,生命期沒有改變,在整個程式執行過程中該變數一直存在。但其作用域反而減小,只有本檔案的函式可以引用該全域性變數。
對於static
區域性變數,其作用於沒有改變,只有定義該區域性變數的函式可以引用該變數。但其生命期發生了改變,在整個程式執行期間,該變數都存在。
下面程式演示static
區域性變數,該程式開啟若干個檔案並將檔案的內容輸出到螢幕中,每輸出
5行就會輸出
1個換行:
#include #include #include #define max 1024
int output(char *file_name)
//此處注意fgets函式的使用方法
while(fgets(buf, max, fp) != null) /*每次讀入檔案的一行*/}
fclose(fp); /*關閉檔案*/
return 0;}
int main(void);
int i;
i = 0;
while(i < 3)
i ++;
}return 0;
}
注意:如果將區域性變數count
的儲存型別設定為非
static
,每個檔案的輸出行數的累加就不會被儲存了。
當然,也可以使用全域性變數來代替靜態區域性變數,但不能保證程式中其他函式對全域性變數造成干擾。
2,實現封裝和模組化設計
static儲存型別的特性決定了使用
static
關鍵字宣告的全域性變數只有本檔案內的函式可以引用,因此在
c語言中乙個源程式檔案就是乙個模組。當使用者在乙個檔案中定義了乙個
static
全域性變數後,其他檔案(模組)只能通過該模組提供的介面函式來訪問這個
static
全域性變數,而不能直接對其進行操作。
下面程式演示乙個鍊錶模組的實現。
程式1,list.c:
#include typedef node* node; /*自定義結點指標型別*/
static node head; /*煉表頭*/
/*鍊錶結點結構
*val: 結點的值
*/struct node;
/*插入結點函式*/
int insert_node(int value)
q = (node)malloc(sizeof(struct node)); /*建立乙個新的結點*/
if(null == q)
q->next = null; /*對結點賦值*/
q->val = value;
if(null == p) /*空鍊錶*/
p->next = q; /* 結點插入鍊錶 */
return 1;}
/* 遍歷鍊錶,列印每個結點的值 */
void print()}
/* 遍歷鍊錶,釋放每乙個結點 */
void destroy()
head = null; /* 清空鍊錶的頭指標 */
}
程式2,
list.h:
#ifndef list_h_included
#define list_h_included
extern int insert_node(int val); /*插入節點函式*/
extern void print(); /*遍歷鍊錶,列印每個鍊錶的值*/
extern void destroy(); /*遍歷鍊錶,釋放每乙個節點*/
#endif // list_h_included
程式3,main.c
:
#include #include #include "list.h"
int main(void)
Static變數的作用
1.全域性變數宣告為static全域性變數 全域性變數是靜態儲存方式,static全域性變數也靜態儲存方式,儲存方式一樣。但是非靜態全域性變數的作用域是整個源程式,包括源程式中的各個單檔案 而static全域性變數的作用域是單檔案,源程式中的其他檔案不能使用它,也就是作用域不同。2.區域性變數和st...
C語言 static變數及其作用
在 c 語言中,static 關鍵字不僅可以用來修飾變數,還可以用來修飾函式。在使用 static 關鍵字修飾變數時,我們稱此變數為靜態變數。靜態變數的儲存方式與全域性變數一樣,都是靜態儲存方式。但這裡需要特別說明的是,靜態變數屬於靜態儲存方式,屬於靜態儲存方式的變數卻不一定就是靜態變數。例如,全域...
static作用 靜態變數的生存週期和作用域
首先要理解生存週期與作用域的區別 生存週期 變數從定義到銷毀的時間範圍。存放在全域性資料區的變數的生存週期存在於整個程式執行期間,而存放在棧中的資料則隨著函式等的作用域結束導致出棧而銷毀,除了靜態變數之外的區域性變數都存放於棧中。作用域 變數的可見 域 塊作用域,函式作用域,類作用域,程式全域性作用...