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

2020-12-08 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語言中的變量存儲類型——「extern」
    請看下文C語言中的變量有哪些存儲類型,你還記得嗎?extern如何使用你都掌握了嗎?看了本文你就清楚了。1、 回顧C語言變量C語言中變量值的存儲位置有兩類:CPU的寄存器和內存。變量存儲類型關係到其存儲位置,除了register型存儲在CPU寄存器中,C語言提供的其它三種存儲類型(auto型、static型、extern型)的變量均存儲在內存中。
  • C語言 | static靜態變量
    在編程方面有著天賦異稟的人畢竟是少數,我們大多數人想要從C語言小白進階到高手,需要經歷的是日積月累的學習。那麼如何學習呢?當然是每天都練習一道C語言題目!!作者閆小林白天搬磚,晚上做夢。我有故事,你有酒麼?例87:學習C語言static定義靜態變量的用法。
  • C語言中auto register static const volatile 區別
    1)auto這個關鍵字用於聲明變量的生存期為自動,即將不在任何類、結構、枚舉、聯合和函數中定義的變量視為全局變量,而在函數中定義的變量視為局部變量。這個關鍵字不怎麼多寫,因為所有的變量默認就是auto的。
  • C語言中static的常見作用
    定義靜態函數的好處:(1)其他文件中可以定義相同名字的函數,不會發生衝突(2)靜態函數不能被其他文件所用。 存儲說明符auto,register,extern,static,對應兩種存儲期:自動存儲期和靜態存儲期。 auto和register對應自動存儲期。
  • 單片機C語言中 static 用法小結
    一、c程序存儲空間布局C程序一般由下列部分組成:本文引用地址:http://www.eepw.com.cn/article/201611/315900.htm1)正文段——CPU執行的機器指令部分
  • C 語言學習之變量、數據類型
    語言是強數據類型語言,即聲明變量時,需要定義好變量的類型。變量相當於內存中一個數據存儲空間的表示,通過變量名可以訪問到該變量【值】,變量使用的基本步驟:int main(){ int a = 0;
  • C語言應用筆記(二):C語言static關鍵字及其使用
    前言:在C語言中,static的字面意思容易給我們帶來些許誤解,在開發過程中,我們經常會需要定義一些static類型的變量和函數,
  • C語言之 static
    頭文件中使用前面三個應該是很常見的,簡要說明即可,重要的是後面那一個不常見,作為重點講解內容。我們知道一個函數是可以被其他文件的函數調用的,但是現在加了這靜態屬性就不行了,這個函數只能被這個文件的函數調用,其他文件的函數是無法調用的,也正因為如此,所以其他文件也可以使用相同的函數名而不怕重複定義了,同理,全局靜態變量和局部靜態變量也是如此。全局靜態變量的話,可以在多個文件中定義同一個函數名,但實際他們的內存是不一樣的,可以放心使用。
  • C 中 static 的常見作用
    用static聲明的局部變量具有靜態存儲持續期(static storage duration),或靜態範圍(static extent)。雖然他的值在函數調用之間保持有效,但是其名字的可視性仍限制在其局部域內。靜態局部對象在程序執行到該對象的聲明處時被首次初始化。4.由於static變量的以上特性,可實現一些特定功能。
  • C語言中的變量詳解
    當然不僅僅是形參變量,在C中所有的量都有自己的作用域。C中的變量,按作用域可分為兩種,局部變量和全局變量。局部變量:也稱內部變量。局部變量是在函數內做定義說明的,其作用域僅限於函數內部,離開函數後再使用這種變量是非法的。
  • 第2節:常量、變量與C語言的數據類型
    1.常量常量是在程序運行過程中,其值不能被改變的量。在C語言中常量分為:整型常量、實型常量、字符常量(普通字符、轉義字符)、字符串常量、符號常量。符號常量:用#define指令指定用一個符號名稱代表一個常量。
  • C語言基本數據類型分析(一)
    通過變量的名字可以使用存儲空間outo,static,register分析C語言變量可以擁有自己的屬性auto是C語言中局部變量默認的屬性,編譯器默認所有的局部變量都是auto的。static修飾的局部變量存儲在程序的靜態區,static的另一個意義是文件作用域提示符。--static修飾的全局變量作用域只是在聲明的文件中。--static修飾的函數的作用域只是在聲明的文件中。--static靜態局部變量生命周期是全局的。
  • Win10 開發入門:C# 程式語言基礎之數據類型與變量
    在有些程式語言中,定義數據時並不嚴格區分數據的類型,在程序運行過程中,數據類型可根據實際情況發生變化,這種語言稱為弱類型語言,比如PHP、JavaScript這類腳本語言。而C#則是一種強類型語言,它對不同的數據類型都有不同的定義方法。數據類型又分為基本數據類型和自定義數據類型,後者是在前者基礎上由用戶自定義的一種數據類型,比如我們之前討論過的類。
  • Fluent UDF【4】:C語言
    Fluent UDF中還有real型,其實這是Fluent自定義的數據類型,在雙精度求解器中,real類型與double類型相同,而在單精度求解器中,real類型等同於float類型。UDF自動進行轉換,因此在需要浮點數時,可以全部採用real類型。3 常數在C語言中可以利用#define來定義常數。
  • 被 C# 的 ThreadStatic 標記的靜態變量,都存放在哪裡了?
    能不能幫我挖出來,其實這個問題問的挺深的,玩高級語言的朋友相信很少有接觸到這個的,雖然很多朋友都知道這個特性怎麼用,當然我也沒特別研究這個,既然要回答這個問題,我得研究研究回答之!為了更好的普適性,先從簡單的說起!
  • php變量是什麼?php變量的數據類型、命名規則等詳細介紹
    本篇將介紹「php變量是什麼?php變量的數據類型、命名規則以及php變量的使用教程」,有興趣的朋友可以了解一下!一、前言php是一門開源的腳本語言,它的語法簡單實用,利於學習,被廣泛的使用於Web開發領域。目前很多中小型網站都是使用php語言開發的,如果我們能學好php語言,也是很有前途的。今天小編為什麼要介紹php變量?
  • C語言中,全局變量濫用的後果竟如此嚴重?
    01啥是全局變量說起全局變量,就不得不提到「全局變量,局部變量,靜態全局變量,靜態局部變量」,這些都是程式語言中的基本概念。靜態全局變量也具有全局作用域,他與全局變量的區別在於如果程序包含多個文件的話,他作用於定義它的文件裡,不能作用到其他文件裡,即被static關鍵字修飾過的變量具有文件作用域。這樣即使兩個不同的源文件都定義了相同的靜態全局變量,他們也是不同的變量。
  • 總結嵌入式開發中的C語言知識點
    內存管理和存儲架構    C語言允許程序變量在定義時就確定內存地址,通過作用域,以及關鍵字extern,static,實現了精細的處理機制,按照在硬體的區域不同,內存分配有三種方式:從靜態存儲區域分配。內存在程序編譯的時候就已經分配好,這塊內存在程序的整個運行期間都存在。例如全局變量,static 變量。
  • C語言全局變量那些事兒
    b大小是4個字節,而foo.c是8個字節,因為sizeof關鍵字是編譯時決議,而源文件中對b類型定義不一樣。但令人驚奇的是無論是在main.c還是foo.c中,a和b都是相同的地址,也就是說,a和b被定義了兩次,b還是不同類型,但內存映像中只有一份拷貝。我們還看到,main.c中b的值居然就是foo.c中結構體第一個成員變量b.a的值,這證實了前面的推斷——即便存在多次定義,內存中只有一份初始化的拷貝。另外在這裡c是置身事外的一個獨立變量。為何會這樣呢?
  • C++中的static關鍵字的總結
    最近在備C++的課程,所以把在備課過程中遇到的問題進行了總結和梳理,先把C++中的static關鍵字的用法做以下總結。C++的static有兩種用法:面向過程程序設計中的static和面向對象程序設計中的static。前者應用於普通變量和函數,不涉及類;後者主要說明static在類中的作用。