網站首頁 編程語言 正文
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
相關推薦
- 2022-10-22 Python?NumPy教程之數組的創建詳解_python
- 2022-10-17 Kotlin編程循環控制示例詳解_Android
- 2023-04-20 使用replaceAll()方法實現數字千分位逗號分隔
- 2022-09-13 go語言中切片Slice與數組Array對比以及panic:?runtime?error:?inde
- 2022-11-09 一文帶你了解Go語言中的類型斷言和類型轉換_Golang
- 2022-10-21 使用nginx進行負載均衡的搭建全過程_nginx
- 2023-04-11 pytest用例執行順序和跳過執行詳解_python
- 2022-11-27 Python?ORM數據庫框架Sqlalchemy的使用教程詳解_python
- 最近更新
-
- 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同步修改后的遠程分支