C語言中的變量存儲類型static老手都這樣用

2020-12-19 C語言知識傳播者
請看正文

C語言中的變量有哪些存儲類型,你還記得嗎?static老手都這樣用。

1、 先來回顧C語言變量

C語言中變量值的存儲位置有兩類:CPU的寄存器和內存。變量存儲類型關係到其存儲位置,除了register型存儲在CPU寄存器中,C語言提供的其它三種存儲類型(auto型、static型、extern型)的變量均存儲在內存中。存儲位置不同,決定了變量的生存期和作用域。

具體變量介紹請見作者的另一篇文章,名為《說一說C語言中的變量存儲類型——「extern」》。

下面我們直接講乾貨,static關鍵字用法。

2、 Static關鍵字用法

C語言中,無論是變量還是函數都可以用static關鍵字來修飾。具體用法我們分別來看。

1) 修飾函數

我們知道函數的聲明(定義)也可以包括存儲類型,但只有extern/static兩種。當函數聲明為extern,說明函數具有外部連結,其它文件可以調用此函數;當函數聲明為static,說明函數是內部連結,即只能在定義函數的文件內部調用函數。當不指明函數存儲類型,則默認該函數具有外部連結。

這種情況適用於多文件編程(大多數程序都是這樣的)。當某個文件中定義的函數不希望被其它源文件調用,就可以把它聲明為static,對其它文件來說該函數不可見。例如,你在file1.c文件中定義了多個函數,如果你不允許函數名為fun2的函數被其它文件的函數調用,只需要將其聲明為static即可,這樣fun2函數隻允許被file1.c中的其它函數調用,其它源文件中的函數無法調用fun2,起到了隱藏的作用。

static int fun2(char c); //內部連結,對外不可見

2) 修飾全局變量

我們知道,全局變量存儲在靜態存儲區,但是它不是靜態變量,它的作用範圍從定義處到所在源文件末尾。但是它對其它源文件都是有效的,只需要通過extern聲明一下即可,詳見作者的另一篇文章《說一說C語言中的變量存儲類型——「extern」》。

但是有些情況下,某些全局變量不想被同程序的其它源文件使用,那麼我們就可以使用static關鍵字聲明一下即可。例如,在file1.c中我們定義的整型全局變量g_a不想被其它源文件中函數使用,只需要在定義g_a時加上static關鍵字修飾。

static int g_a;

這樣g_a對其它源文件比如file2.c是不可見的,當然,file2.c中也可以定義一個同名的靜態全局變量,這是沒有問題的。

3) 修飾局部變量(靜態局部變量)

我們知道,在C語言中,局部變量通常定義在函數內部,編譯時不分配空間,只有函數調用運行階段分配空間,局部變量存儲在動態存儲區,函數調用結束時所佔用空間被收回。對於變量介紹,詳見作者的另一篇文章《說一說C語言中的變量存儲類型——「extern」》。

有時,根據程序需要,我們希望某個局部變量的值一直保持,且每次函數調用時(除第一次調用分配空間外)不再分配空間,直接讀取上次的值。該怎麼做呢?

很簡單,只需要在定義局部變量時,用static修飾。例如,file1.c文件中funx函數定義了一個靜態局部變量t,我們可以如下定義:

Int funx(void)

{

static int t;

其它語句

……

return t;

}

定義之後,t變成了一個靜態局部變量,其存儲在靜態存儲區,與全局變量存儲區域相同。因此,在t被分配空間後,空間是固定的,其生存期直到程序運行結束,而不是所在函數調用結束。

static定義靜態局部變量的另一個好處是,變量被分配空間後,默認初始化值為0。其原因就是靜態局部變量存儲在靜態存儲區,該區域內存中所有字節默認為0x00。

今天留個作業,「如果要在定義某靜態全局變量位置之前使用它,該如何操作呢?」請大家留言回答,謝謝!

好了,關於static的用法今天就總結到這,如果大家有任何疑問請留言探討。我是「C語言知識傳播者」,志在瞄準C語言,挖掘和總結C語言的難點和痛點,給C語言編程愛好者和本領域從業人員提供參考,我會用心總結C語言知識的點點滴滴,您的關注是我持續創作的動力,請收藏本文、轉發並點讚,希望得到您的持續關注,謝謝!

相關焦點

  • C++中的static
    C++的static有兩種用法:面向過程程序設計中的static和面向對象程序設計中的static。前者應用於普通變量和函數,不涉及類;後者主要說明static在類中的作用。
  • (精華)C語言為什麼一般不在.h中定義函數或者變量?
    大部分C編程愛好者都知道,在我們的.h文件裡面經常看到的是函數的聲明、變量的聲明、以及各種各樣的宏等等,而且在我前面的文章中我也提到過C語言的模塊化設計中常常說到對應的.h和.c文件認為是一個對象,那麼.h文件主要是對外的一些接口
  • Java中static變量作用和用法詳解
    Java語言中沒有全局變量的概念。  用public修飾的static成員變量和成員方法本質是全局變量和全局方法,當聲明它類的對象市,不生成static變量的副本,而是類的所有實例共享同一個static變量。
  • 「原創」為什麼java中一切都是對象,還要有static?
    接下來我們通過內存示意圖來觀察下:從上圖中我們可以注意到紅色框中的內容是重複存在於堆中的。倘若對象越建越多,那麼堆中的重複數據也會越來越多,這樣就會導致內存造成不必要的消耗。既然各個對象中都存在同樣的數據,那麼何不將這些相同的數據單獨拿出來並且單獨存放呢?
  • 一步帶您了解C語言中的「register」關鍵字
    寄存器比內存訪問要快,因此可以使用register關鍵字將C程序中最常用的變量放入寄存器中。關鍵字register會向編譯器提示可以將給定變量放入寄存器中。編譯器可以選擇是否將其保存在寄存器中。通常,編譯器自己進行優化,然後將變量放入寄存器中。
  • C語言 關鍵字(32+5+7)
    extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while1999年12
  • 單片機c語言教程:建立你的第一個KeilC51項目
    KEIL uVISION2 是眾多單片機應用開發軟體中優秀的軟體之一,它支持眾多不一樣公司的MCS51架構的晶片,它集編輯,編譯,仿真等於一體,同時還支持,PLM,彙編和C語言的程序設計,它的界面和常用的微軟 VC++的界面相似,界面友好,易學易用,在調試程序,軟體仿真方面也有很強大的功能。本站提供的單片機c語言教程都是基於keilc51的。
  • 單片機C語言模塊化編程方法
    extern INT32U OSIdleCtr;extern INT32U OSIdleCtrRun;extern INT32U OSIdleCtrMax;在這種情況下,不產生內存分配,而任何 .C文件都可以使用這些變量。這樣的就只需在 .H文件中定義一次就可以了。
  • C語言關鍵字 -(typedef關鍵字)
    這並不是說 typedef 會真正影響對象的存儲特性;它只是說在語句構成上,typedef 聲明看起來象 static,extern 等類型的變量聲明。下面將帶到一個陷阱:  typedef static int FAST_COUNTER;   編譯通不過。問題出在你不能在聲明中有多個存儲類關鍵字。
  • 快速上手系列-C語言之基礎篇(一)
    吃飯用的筷子,到現在我都不知道它的由來,不知道它是在什麼歷史背景下誕生的有些東西還是有必要了解一下,比如,C語言所產生的代碼運行速度比彙編語言編寫的代碼運行速度稍慢一點,但還是有得一拼,同時C語言要比彙編語言編寫的代碼可讀性高,可移植性好。另外,相對於其他高級語言,比如C++、java、C#等來說,C語言編寫的代碼運行效率要高。
  • C/C++編程筆記:C 語言編程面試常見問題,大廠面試必備
    答:變量/函數的聲明僅聲明變量/函數存在於程序中的某個位置,但未為其分配內存。但是變量/函數的聲明起著重要的作用。這就是變量/函數的類型。因此,在聲明變量時,程序會知道該變量的數據類型。在聲明函數的情況下,程序知道該函數的參數是什麼,它們的數據類型,參數的順序和函數的返回類型。這就是聲明。
  • 學員問:C語言入門要掌握哪些基礎知識?
    01C語言程序的結構認識用一個簡單的c程序例子,介紹c語言的基本構成、格式、以及良好的書寫風格,使小夥伴對c語言有個初步認識。4、在{ }裡面每一句話後面都有一個分號(;),在c語言中,我們把以一個分號結尾的一句話叫做一個c語言的語句,分號是語句結束的標誌。
  • R語言數據實戰 | R中的數據類型
    比如,本月上映了幾部電影,動作戲偏多還是喜劇為主,主演是不是當紅花旦等,這些信息,都可以通過簡單的R語言操作來一一獲得。在這裡,我們搜集了2016年1—5月間上映的19部熱門電影共10個變量的基本信息,將以此為例說明如何在R語言中進行相關操作。
  • C/C++中常用的編程關鍵字
    2. autoauto(自動,automatic)是存儲類型標識符,表明變量"自動"具有本地範圍,塊範圍的變量聲明(如for循環體內的變量聲明)默認為auto存儲類型。在 C++ 中,用 const 聲明一個變量,意味著該變量就是一個帶類型的常量,可以代替 #define,且比 #define 多一個類型信息,且它執行內連結,可放在頭文件中聲明;但在 C 中,其聲明則必須放在源文件(即 .C 文件)中,在 C 中 const 聲明一個變量,除了不能改變其值外,它仍是一具變量。
  • java中static, final, 內部類的具體運用
    static概念:static它是靜態修飾符,一般用來修飾類中的成員。當在定義類的時候,類中都會有相應的屬性和方法。而屬性和方法都是通過創建本類對象調用的。static特點:static是靜態修飾符,一般修飾成員。被static修飾的成員屬於類,不屬於單個這個類的某個對象。
  • C語言基礎(下)
    C語言的世界結構體類型什麼是結構體我們觀察現實世界的時候,可以發現很多的東西它都是由不同的部分組合起來的可以理解成是對現實世界的抽象結構體不僅可以記錄不同類型的數據,而且使得數據結構是「高內聚,低耦合」的,更利於程序的閱讀理解和移植,而且結構體的存儲方式可以提高CPU對內存的訪問速度。
  • keil C語言與彙編語言混合編程
    有參數傳遞的函數調用 記住哦,c文件和A51文件不能使用同一個文件名,不過我還不知道為什麼會這樣,有高手知道得話請告知。 今天說說帶參數傳遞的函數調用,在C51和彙編之間傳遞參數的方式有兩種,一種是通過寄存器傳遞參數,C51中不同類型的實參會存入相應的寄存器,在彙編中只需對相應寄存器進行操作,即達到傳遞參數的目的。
  • V63.VBA中聲明變量的四種方法public,private,dim和static有何區別?
    VBA中聲明變量的四種方法public,private,dim和static有何區別?答:變量的適用有效範圍不同,分別對應:全局/本模塊/本過程/靜態不可修改,最後一個用的很少。1、Public和Private一般用於定義全局變量,也可以在類中使用。區別在於:[Public]定義的是公共變量,如果在一個模塊中使用,那麼整個應用程式都能使用它所定義的變量,如果在類中使用,那麼它就是一個共有屬性。
  • 單片機的程式語言:彙編語言、C語言、PL/M和BASIC語言
    而單片機的BASIC編譯器是直接將程序代碼編譯成相應晶片的機器碼,不需要在單片機的內存中駐留RUNTIME程序,執行效率與其他編譯器編譯出來的一樣。此外初學者還需要注意,BASIC為簡化使用變量,所有變量都用浮點值。其特點如下:(1)構成簡單。 BASIC語言的最基本語句只有17種,而且它們都是常見的英文單詞或其變形,如READ、END等,很容易學習和掌握。
  • 如何用C語言實現面向對象編程OOP?
    如何用C語言實現面向對象編程OOP? 其實這個也不難理解,無論是fBird還是Bird,他們在內存中只有一個變量,就是那個函數指針,而void表示任何類型的指針,當我們將它強制轉換成struct Bird類型時,p-》print指向的自然就是傳入實參的print地址。 OOP真的那麼重要?