網站首頁 編程語言 正文
前言
static關鍵字不僅可以用來修飾變量,還可以用來修飾函數。在使用static關鍵字修飾變量時,我們稱此變量為靜態變量。靜態變量的存儲方式與全局變量一樣,都是靜態存儲方式。靜態變量屬于靜態存儲方式,屬于靜態存儲方式的變量卻不一定就是靜態變量。
一、static修飾變量
1.修飾局部變量
先看段代碼:
#include <stdio.h>
void test()
{
int m = 0;
m = m + 1;
printf("%d", m);
}
int main()
{
int n = 0;
while (n < 10)
{
test();
n++;
}
}
輸出結果:
這個結果沒問題,下面咱們加個static對比一下:
#include <stdio.h>
void test()
{
static int m = 0;
m = m + 1;
printf("%d", m);
}
int main()
{
int n = 0;
while (n < 10)
{
test();
n++;
}
return 0;
}
輸出結果:
static 修飾局部變量的時候,其實改變的是局部變量的存儲位置,靜態的局部變量是放在靜態區,放在靜態區的變量出了作用域是不會銷毀的,相當于生命周期延長了。
注:變量的作用域是不變的,只是生命周期延長了。
2.修飾全局變量
創建一個源文件:a.c
int g_val=2022;//全局變量
引用全局變量:全局變量的作用域是整個工程
#include <stdio.h>
extern g_val;//extern 用來聲明外部命令
int main()
{
printf("%d\n", g_val);
return 0;
}
輸出結果:
static可以修飾全局變量,加上static看一下有什么不同:
static int g_val = 2022;//全局變量
主文件不變:
#include <stdio.h>
extern g_val;//extern 用來聲明外部命令
int main()
{
printf("%d\n", g_val);
return 0;
}
輸出結果:
此時會報錯:一個全局變量具有外部鏈接屬性的 (就是可以被其他源文件引用)但是被static 修飾后外部鏈接屬性就變成了內部鏈接屬性 只能在自己所在的源文件內部使用不能在其他文件內部使用.
所以再次調試的時候就會報錯
二、static修飾函數
源文件a.c中創建個函數名為add:
代碼如下:
static int add(int x, int y)
{
int z = x + y;
return z;
}
主文件test.c如下:
extern add(int x, int y);
int main()
{
int a = 2;
int b = 3;
int c = add(a, b);
printf("%d\n", c);
return 0;
}
輸出結果:
其實一個函數本身具有外部鏈接屬性 被static修飾后外部鏈接屬性變成了內部鏈接屬性 ,只能在源文件a.c 內部使用了,其他源文件無法使用,使用上感覺作用域變小,我們可以發現 static 修飾全局變量和修飾函數用法一樣 。
總結 在修飾變量的時, static修飾的靜態局部變量只執行一次,而且延長了局部變量的生命周期,直到程序運行結束以后才釋放。static修飾全局變量的時,這個全局變量只能在本文件中訪問,不能在其它文件中訪問,即便是extern外部聲明也不可以。static修飾一個函數,則這個函數的只能在本文件中調用,不能被其他文件調用。Static修飾的局部變量存放在全局數據區的靜態變量區。
補充:static的好處是什么?
1、隱藏變量或函數、隔離錯誤,有利于模塊化程序
在編程中,難免會用到全局變量,全局變量的作用域是整個源程序,當一個源程序由多個源文件組成時,全局變量在所有的源文件中都是有效的。如果希望全局變量僅限于在本源文件中使用,在其他源文件中不能引用,也就是說限制其作用域只在定義該變量的源文件內有效,而在同一源程序的其他源文件中不能使用,這時,就可以通過在全局變量上加static來實現,使全局變量被定義成一個靜態全局變量。這樣就可以避免其他源文件使用該變量、避免其他源文件因為該變量引起的錯誤。起到了對其他源文件隱藏該變量和隔離錯誤的作用,有利于模塊化程序。
2、保持變量內容的持久性
?有時候,我們希望函數中局部變量的值在函數調用結束之后不會消失,仍然保留函數調用結束的值。即它所在的存儲單元不釋放。這時,應該將該局部變量用關關鍵字static聲明為靜態局部變量。當局部變量被聲明為靜態局部變量的時候,也就改變了局部變量的存儲位置,從原來的棧中存放改為靜態存儲區存放,全局變量也存放在靜態存儲區,靜態局部變量與全局變量的主要區別就在于可見性,靜態局部變量只在其被聲明的代碼塊中是可見的。
總結
原文鏈接:https://blog.csdn.net/happy_child_/article/details/124280981
相關推薦
- 2022-03-18 AndroidStudio集成OpenCV的實現教程_Android
- 2023-04-13 react native 配置路徑別名alias
- 2022-11-24 PyTorch?Dataset與DataLoader使用超詳細講解_python
- 2023-02-15 PyQt5頁面跳轉問題及解決方式_python
- 2022-05-28 python按列索引提取文件夾內所有excel指定列匯總(示例代碼)_python
- 2022-04-18 將stylus 樣式 轉換成sass,scss
- 2022-08-27 C#實現截圖幫助類_C#教程
- 2022-02-07 ifconfig顯示沒有網卡,nmtui運行提示NetworkManaer 未運行
- 最近更新
-
- 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同步修改后的遠程分支