日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

一文搞懂C語言static關鍵字的三個作用_C 語言

作者:野豬佩奇` ? 更新時間: 2022-06-12 編程語言

static修飾局部變量

圖一:test 函數里面定義的 a 是局部變量,局部變量在棧區上開辟空間,棧區的使用特點是進入變量的生命周期時自動為其開辟空間,離開變量的生命周期時自動銷毀對應空間,所以這里每次調用 test 函數時 a 都會被重新定義并初始化為0,所以屏幕上打印的是10個1;

圖二:我們把 a 用 static 修飾后發現屏幕打印的是1到10,就好像每次調用完 test 函數后 a 并沒有被銷毀,而是繼續使用,下次調用 test 函數時 a 直接在之前的基礎上進行 ++ 操作。
所以 static 修飾局部變量的作用是:改變局部變量的生命周期,本質上是改變了局部變量的存儲位置,讓局部變量不再是在棧區上開辟空間,而是直接在靜態區上開辟空間,從而使得局部變量擁有和全局變量一樣的生命周期,即隨著整個程序生成和銷毀。

更深入的理解 static 修飾局部變量的作用:圖三,我們的程序從源文件(.c文件)變成可執行程序(.exe文件)需要經過編譯鏈接運行三個環節,而編譯環節又分為預處理、編譯、匯編三個階段,在匯編階段,編譯器會把我們的C語言代碼轉換成匯編代碼,而每一條C語言語句都對應著多句匯編代碼,然而在圖三中,我們可以觀察到,只有 static int a = 0; 這條語句沒有對應的匯編代碼,也就是說,C語言在編譯的時候會直接跳過這條語句。
本質上是:在編譯環節的編譯階段編譯器就會為被 static 修飾的局部變量分配空間,所以C程序在運行的過程中會直接跳過 static 修飾的語句,也就是說,在第二次及以上甚至第一次調用 test 函數時 static int a = 0; 這條語句都不會被執行。

static 修飾全局變量

圖一圖二對比分析:我在Add.c中定義了一個全局變量g_val,因為全局變量具有外部鏈接屬性,所以我只需要在test.c中對g_val進行聲明之后就可以正常使用了,但是當我用 static 來修飾g_val時,我們發現,編譯器說g_val是無法解析的外部符號;
所以 static 修飾全局變量的作用是:改變了全局變量的外部鏈接屬性(可以在其他源文件內被訪問),使其變成內部連接屬性(只能在本文件內部被訪問),給我們的感覺是全局變量的作用域變小了。

static 修飾函數

圖一圖二對比分析:這里和 static 修飾全局變量非常類似,我在Add.c中定義了一個Add函數,因為函數也具有外部鏈接屬性,所以我只需要在test.c中對Add函數進行聲明之后就可以正常使用了,但是當我用 static 來修飾Add函數時,我們發現,編譯器說Add是無法解析的外部符號;
所以 static 修飾函數的作用是:改變了函數的外部鏈接屬性(可以在其他源文件內被訪問),使其變成內部連接屬性(只能在本文件內部被訪問),給我們的感覺是函數的作用域變小了。

總結

  • static 修飾局部變量的作用:改變局部變量的生命周期,本質上是改變了局部變量的存儲位置,讓局部變量不再是在棧區上開辟空間,而是直接在靜態區上開辟空間,從而使得局部變量擁有和全局變量一樣的生命周期,即隨著整個程序生成和銷毀。
  • static 修飾全局變量的作用:改變了全局變量的外部鏈接屬性(可以在其他源文件內被訪問),使其變成內部連接屬性(只能在本文件內部被訪問)。
  • static 修飾函數的作用是:改變了函數的外部鏈接屬性(可以在其他源文件內被訪問),使其變成內部連接屬性(只能在本文件內部被訪問)。

原文鏈接:https://blog.csdn.net/m0_62391199/article/details/124093244

欄目分類
最近更新