網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
前言
static關(guān)鍵字不僅可以用來(lái)修飾變量,還可以用來(lái)修飾函數(shù)。在使用static關(guān)鍵字修飾變量時(shí),我們稱此變量為靜態(tài)變量。靜態(tài)變量的存儲(chǔ)方式與全局變量一樣,都是靜態(tài)存儲(chǔ)方式。靜態(tài)變量屬于靜態(tài)存儲(chǔ)方式,屬于靜態(tài)存儲(chǔ)方式的變量卻不一定就是靜態(tài)變量。
一、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++;
}
}
輸出結(jié)果:
這個(gè)結(jié)果沒(méi)問(wèn)題,下面咱們加個(gè)static對(duì)比一下:
#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;
}
輸出結(jié)果:
static 修飾局部變量的時(shí)候,其實(shí)改變的是局部變量的存儲(chǔ)位置,靜態(tài)的局部變量是放在靜態(tài)區(qū),放在靜態(tài)區(qū)的變量出了作用域是不會(huì)銷毀的,相當(dāng)于生命周期延長(zhǎng)了。
注:變量的作用域是不變的,只是生命周期延長(zhǎng)了。
2.修飾全局變量
創(chuàng)建一個(gè)源文件:a.c
int g_val=2022;//全局變量
引用全局變量:全局變量的作用域是整個(gè)工程
#include <stdio.h>
extern g_val;//extern 用來(lái)聲明外部命令
int main()
{
printf("%d\n", g_val);
return 0;
}
輸出結(jié)果:
static可以修飾全局變量,加上static看一下有什么不同:
static int g_val = 2022;//全局變量
主文件不變:
#include <stdio.h>
extern g_val;//extern 用來(lái)聲明外部命令
int main()
{
printf("%d\n", g_val);
return 0;
}
輸出結(jié)果:
此時(shí)會(huì)報(bào)錯(cuò):一個(gè)全局變量具有外部鏈接屬性的 (就是可以被其他源文件引用)但是被static 修飾后外部鏈接屬性就變成了內(nèi)部鏈接屬性 只能在自己所在的源文件內(nèi)部使用不能在其他文件內(nèi)部使用.
所以再次調(diào)試的時(shí)候就會(huì)報(bào)錯(cuò)
二、static修飾函數(shù)
源文件a.c中創(chuàng)建個(gè)函數(shù)名為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;
}
輸出結(jié)果:
其實(shí)一個(gè)函數(shù)本身具有外部鏈接屬性 被static修飾后外部鏈接屬性變成了內(nèi)部鏈接屬性 ,只能在源文件a.c 內(nèi)部使用了,其他源文件無(wú)法使用,使用上感覺(jué)作用域變小,我們可以發(fā)現(xiàn) static 修飾全局變量和修飾函數(shù)用法一樣 。
總結(jié) 在修飾變量的時(shí), static修飾的靜態(tài)局部變量只執(zhí)行一次,而且延長(zhǎng)了局部變量的生命周期,直到程序運(yùn)行結(jié)束以后才釋放。static修飾全局變量的時(shí),這個(gè)全局變量只能在本文件中訪問(wèn),不能在其它文件中訪問(wèn),即便是extern外部聲明也不可以。static修飾一個(gè)函數(shù),則這個(gè)函數(shù)的只能在本文件中調(diào)用,不能被其他文件調(diào)用。Static修飾的局部變量存放在全局?jǐn)?shù)據(jù)區(qū)的靜態(tài)變量區(qū)。
補(bǔ)充:static的好處是什么?
1、隱藏變量或函數(shù)、隔離錯(cuò)誤,有利于模塊化程序
在編程中,難免會(huì)用到全局變量,全局變量的作用域是整個(gè)源程序,當(dāng)一個(gè)源程序由多個(gè)源文件組成時(shí),全局變量在所有的源文件中都是有效的。如果希望全局變量?jī)H限于在本源文件中使用,在其他源文件中不能引用,也就是說(shuō)限制其作用域只在定義該變量的源文件內(nèi)有效,而在同一源程序的其他源文件中不能使用,這時(shí),就可以通過(guò)在全局變量上加static來(lái)實(shí)現(xiàn),使全局變量被定義成一個(gè)靜態(tài)全局變量。這樣就可以避免其他源文件使用該變量、避免其他源文件因?yàn)樵撟兞恳鸬腻e(cuò)誤。起到了對(duì)其他源文件隱藏該變量和隔離錯(cuò)誤的作用,有利于模塊化程序。
2、保持變量?jī)?nèi)容的持久性
?有時(shí)候,我們希望函數(shù)中局部變量的值在函數(shù)調(diào)用結(jié)束之后不會(huì)消失,仍然保留函數(shù)調(diào)用結(jié)束的值。即它所在的存儲(chǔ)單元不釋放。這時(shí),應(yīng)該將該局部變量用關(guān)關(guān)鍵字static聲明為靜態(tài)局部變量。當(dāng)局部變量被聲明為靜態(tài)局部變量的時(shí)候,也就改變了局部變量的存儲(chǔ)位置,從原來(lái)的棧中存放改為靜態(tài)存儲(chǔ)區(qū)存放,全局變量也存放在靜態(tài)存儲(chǔ)區(qū),靜態(tài)局部變量與全局變量的主要區(qū)別就在于可見(jiàn)性,靜態(tài)局部變量只在其被聲明的代碼塊中是可見(jiàn)的。
總結(jié)
原文鏈接:https://blog.csdn.net/happy_child_/article/details/124280981
相關(guān)推薦
- 2022-12-14 Python中shape[0]、shape[1]和shape[-1]分別的意思詳解(附代碼)_pyt
- 2022-03-12 Android導(dǎo)航欄功能項(xiàng)的顯示與屏蔽介紹_Android
- 2022-10-13 Python?lambda?匿名函數(shù)優(yōu)點(diǎn)和局限性深度總結(jié)_python
- 2022-05-04 詳解Python使用apscheduler定時(shí)執(zhí)行任務(wù)_python
- 2022-03-26 C語(yǔ)言goto語(yǔ)句簡(jiǎn)單使用詳解_C 語(yǔ)言
- 2023-07-24 表單默認(rèn)空白,無(wú)數(shù)據(jù)時(shí)賦默認(rèn)值,新增時(shí)賦默認(rèn)值
- 2022-05-11 Python實(shí)現(xiàn)圖書(shū)管理系統(tǒng)設(shè)計(jì)_python
- 2022-12-06 React?Hook中的useEffecfa函數(shù)的使用小結(jié)_React
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支