網站首頁 編程語言 正文
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
相關推薦
- 2023-01-05 使用sqlplus連接Oracle數據庫問題_oracle
- 2022-08-11 python中@Property屬性使用方法_python
- 2023-08-15 vite打包報錯 Rollup failed to resolve
- 2024-02-29 UNI-APP頁面跳轉時(uni.navigateTo),參數傳遞
- 2023-11-17 Linux CentOS如何修改root用戶密碼
- 2022-07-08 Android?iOS常用APP崩潰日志獲取命令方法_Android
- 2022-04-09 Windows 環境配置Github 的SSH key
- 2022-02-26 slf4日志,指定位置格式輸出,保存日志
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支