不同于其他關鍵字,他們都有多種用法,而且在一定環境下使用,可以提高程式的運行性能,優化程式的結構,這篇文章主要介紹了C語言中靜態關鍵字static的作用,對大家學習C語言非常有幫助,

靜態關鍵字static
C語言中,static關鍵字修飾變數和函式:
1、區域變數
2、全域變數
3、函式
static關鍵字最基本的用法是:
1、被static修飾的變數屬于類變數,可以通過類名.變數名直接參考,而不需要new出一個類來
2、被static修飾的方法屬于類方法,可以通過類名.方法名直接參考,而不需要new出一個類來
被static修飾的變數、被static修飾的方法統一屬于類的靜態資源,是類實體之間共享的,換言之,一處變、處處變,JDK把不同的靜態資源放在了不同的類中而不把所有靜態資源放在一個類里面,很多人可能想當然認為當然要這么做,但是是否想過為什么要這么做呢?個人認為主要有三個好處:
1、不同的類有自己的靜態資源,這可以實作靜態資源分類,比如和數學相關的靜態資源放在java.lang.Math中,和日歷相關的靜態資源放在java.util.Calendar中,這樣就很清晰了
2、避免重名,不同的類之間有重名的靜態變數名、靜態方法名也是很正常的,如果所有的都放在一起不可避免的一個問題就是名字重復,這時候怎么辦?分類放置就好了,
3、避免靜態資源類無限膨脹,這很好理解,

下面我們具體了解一下static關鍵字的用法,
修飾區域變數
1、用靜態關鍵字static修飾的區域變數,在編譯的程序中,會在資料區為該變數開辟空間,并對其進行初始化,如果代碼中未對其進行初始化,則系統默認初始化為0,
2、用static修飾的區域變數,會延長區域變數的壽命,超出函式的生存期,
3、對靜態關鍵字修飾的區域變數的初始化,
以下面兩個變數a和變數為b進行說明,在編譯程序中,發現變數a和b是靜態變數,會標識變數a與b,等到程式運行的時候,在主函式呼叫之前,對變數a和變數b分配空間,并對變數a進行初始化,由于變數b是由函式fun傳遞的引數進行初始化的,故會在程式呼叫函式時對變數b進行初始化,對變數b初始化之前,會檢查變數b的標識位,如果標識位為0,就會拿函式引數x對其進行初始化,標識位為1就不進行初始化,
static int a = 0;(編譯程序進行初始化)
static int b = x;(運行該代碼的時候進行初始化)
void fun(int x)
{
static int a = 10;
static int b = x;
a++;
b++;
}
修飾全域變數
全域變數定義在函式體外部,在全域資料區分配存盤空間,且編譯器會自動對其初始化,
普通全域變數對整個工程可見,其他檔案可以使用extern外部宣告后直接使用,也就是說其他檔案不能再定義一個與其相同名字的變數了(否則編譯器會認為它們是同一個變數),
靜態全域變數僅對當前檔案可見,其他檔案不可訪問,其他檔案可以定義與其同名的變數,兩者互不影響,
在定義不需要與其他檔案共享的全域變數時,加上static關鍵字能夠有效地降低程式模塊之間的耦合,避免不同檔案同名變數的沖突,且不會誤使用,
修飾函式
函式的使用方式與全域變數類似,在函式的回傳型別前加上static,就是靜態函式,其特性如下:
靜態函式只能在宣告它的檔案中可見,其他檔案不能參考該函式
不同的檔案可以使用相同名字的靜態函式,互不影響
非靜態函式可以在另一個檔案中直接參考,甚至不必使用extern宣告
下面兩個檔案的例子說明使用static宣告的函式不能被另一個檔案參考:
/* file1.c */
#include <stdio.h>
static void fun(void)
{
printf("hello from fun.\n");
}
int main(void)
{
fun();
fun1();
return 0;
}
/* file2.c */
#include <stdio.h>
static void fun1(void)
{
printf("hello from static fun1.\n");
}
使用 gcc file1.c file2.c編譯時,錯誤報告如下:
/tmp/cc2VMzGR.o:在函式‘main’中:
static_fun.c:(.text+0x20):對‘fun1’未定義的參考
collect2: error: ld returned 1 exit status
修改檔案,不使用static修飾符,可在另一檔案中參考該函式:
/* file1.c */
#include <stdio.h>
void fun(void)
{
printf("hello from fun.\n");
}
/* file2.c */
int main(void)
{
fun();
return 0;
}
同樣使用 gcc file1.c file2.c編譯,編譯通過,運行結果如下:
-> % ./a.out
hello from fun.
總結
static是一個很有用的關鍵字,使用得當可以使程式錦上添花,當然,有的公司編碼規范明確規定只用于本檔案的函式要全部使用static關鍵字宣告,這是一個良好的編碼風格,
無論如何,要在實際編碼時注意自己的編碼習慣,盡量體現出語言本身的優雅和編碼者的編碼素質,
以上就是關鍵字static的全部用法,希望對大家靈活運用關鍵字static有所幫助,

如果你想更好的提升你的編程能力,學好C語言C++編程!彎道超車,快人一步!
【C語言C++學習企鵝圈子】,分享(原始碼、專案實戰視頻、專案筆記,基礎入門教程)
歡迎轉行和學習編程的伙伴,利用更多的資料學習成長比自己琢磨更快哦!
編程學習書籍:

編程學習視頻:

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/248837.html
標籤:C
上一篇:C語言基礎知識:exit()函式
