一、定義和聲明
靜態變數是一種在程序執行期間內保持其值不變的變數。static關鍵字用於定義靜態變數和函數。靜態變數可以在函數內,也可以在全局作用域內聲明,其作用域都在聲明點之後的整個程序期間內有效。
在函數內聲明的靜態變數,該變數只會被初始化一次,並且僅在該函數被第一次調用時分配存儲空間。之後,該變數的值將保持其上一次的值,而不管該函數被調用了多少次。
#include<stdio.h>void func(){ static int count = 0; // 聲明靜態變數 count++; printf("count: %d\n", count);}int main(){ func(); // 輸出count: 1 func(); // 輸出count: 2 func(); // 輸出count: 3 return 0;}
二、生命周期
靜態變數的生命周期為整個程序期間。也就是說,靜態變數一旦被分配了存儲空間,就一直存在於程序的數據區中,直到程序結束才會被釋放。這與自動變數不同,自動變數的生命周期僅在函數執行期間內。
因此,在使用靜態變數時需要注意變數的值在不同函數調用之間是否需要保持一致,以避免出現不可預料的結果。
三、作用域
靜態變數的作用域和自動變數的作用域相同。在函數內聲明的靜態變數,只能在該函數內部使用,不能在函數外部被訪問。在全局作用域內聲明的靜態變數,可以在整個程序中被訪問,但只能在定義該變數的文件中被使用。
#include<stdio.h>static int a = 1; // 聲明全局靜態變數void func(){ static int count = 0; // 聲明函數內靜態變數 count++; printf("count: %d, a: %d\n", count, a);}int main(){ func(); // 輸出count: 1, a: 1 func(); // 輸出count: 2, a: 1 a++; func(); // 輸出count: 3, a: 2 return 0;}
四、可見性
靜態變數的作用域內可見,但在作用域外是不可見的,這種特性對於實現模塊化編程非常有用。
在一個源文件中,可以定義多個靜態變數,這些變數是不可見的,只有定義它們的函數才能訪問到它們。這樣可以避免因為變數重名而引起的命名衝突。
五、初始化
靜態變數可以被初始化,也可以不被初始化。如果不被初始化,靜態變數的初值為0。
在函數內聲明的靜態變數,其初始值只被設定一次。在下一次調用該函數時,該變數仍然具有上次執行結束時的值。
#include<stdio.h>void func(){ static int count; // 聲明未被顯式初始化的靜態變數 count++; printf("count: %d\n", count);}int main(){ func(); // 輸出count: 1 func(); // 輸出count: 2 func(); // 輸出count: 3 return 0;}
原創文章,作者:FPPQJ,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/333706.html