静态变量与动态变量
0.靜態(tài)存儲(chǔ)與動(dòng)態(tài)存儲(chǔ)
1)靜態(tài)存儲(chǔ)變量通常是在變量定義時(shí)就分定存儲(chǔ)單元并一直保持不變,直至整個(gè)程序結(jié)束。靜態(tài)變量,全局動(dòng)態(tài)變量都是靜態(tài)存儲(chǔ)
2)動(dòng)態(tài)存儲(chǔ)變量是在程序執(zhí)行過程中,使用它時(shí)才分配存儲(chǔ)單元,使用完畢立即釋放
3)靜態(tài)存儲(chǔ)變量是一直存在的,而動(dòng)態(tài)存儲(chǔ)變量則時(shí)而存在時(shí)而消失。通常把由于變量存儲(chǔ)方式不同而產(chǎn)生的特性稱為變量的生存期
4)靜態(tài)存儲(chǔ)只會(huì)初始化一次
?
摘自于:百度百科
?
1.區(qū)別
定義或者聲明變量時(shí),沒有static修飾符的就是動(dòng)態(tài)變量,有static修飾符的就是靜態(tài)變量
?
2.動(dòng)態(tài)變量(一下簡稱變量)
2.1全局變量
1)在所有函數(shù)的外部定義(包括主函數(shù)),定義之后的所有函數(shù)都能使用,屬于靜態(tài)存儲(chǔ)
2)作用域?yàn)檎麄€(gè)項(xiàng)目,即最終編譯成可執(zhí)行文件的所有文件中均可以使用動(dòng)態(tài)全局變量。外部文件可以通過extern關(guān)鍵字來聲明另一個(gè)文件中存在的全局變量
3)生命周期為從程序運(yùn)行到程序退出,即貫穿整個(gè)運(yùn)行時(shí)間
4)無顯式初始化時(shí)默認(rèn)初始化值為0
看一個(gè)有關(guān)全局變量多文件的例子:
main.cpp
#include <iostream>
using namespace std;
?
int var_a = 0;
?
void fun1();
void fun2();
?
void fun0()
{
?? ?var_a = var_a + 1;
?? ?cout << "fun1:" << var_a << endl;
}
?
?
int main()
{
?? ?fun0();
?? ?fun1();
?? ?fun2();
?? ?fun0();
?
?? ?system("pause");
?? ?return 0;
}
variable1.cpp
#include <iostream>
using namespace std;
?
extern int var_a;
?
void fun1()
{
?? ?var_a = var_a + 1;
?? ?cout << "fun3:" << var_a << endl;
}
variable2.cpp
#include <iostream>
using namespace std;
?
extern int var_a;
?
void fun2()
{
?? ?var_a = var_a + 1;
?? ?cout << "fun3:" << var_a << endl;
}
運(yùn)行結(jié)果:
可以發(fā)現(xiàn),全局變量var_a在所有文件中都共享,每個(gè)文件都可以訪問它并修改它的值
2.2局部變量
1)在函數(shù)內(nèi)部定義,屬于動(dòng)態(tài)存儲(chǔ),其他函數(shù)不能訪問,外部文件也不能訪問,否則會(huì)出現(xiàn):
2)作用域?yàn)楫?dāng)前函數(shù),從定義位置,到其所在的{}的結(jié)束位置
3)生命周期為從函數(shù)調(diào)用到函數(shù)退出
4)無顯式初始化時(shí)默認(rèn)初始化值為隨機(jī)值
?
3.靜態(tài)變量
3.1靜態(tài)全局變量
1)作用域?yàn)楫?dāng)前文件,從定義/聲明位置到文件結(jié)尾
2)生命周期為從程序運(yùn)行到程序退出,即貫穿整個(gè)運(yùn)行時(shí)間
3)無顯式初始化時(shí)默認(rèn)初始化值為0
靜態(tài)全局變量與動(dòng)態(tài)全局變量的主要不同:
動(dòng)態(tài)全局變量可以通過extern關(guān)鍵字在外部文件中使用,但靜態(tài)全局變量不可以在外部文件中使用。靜態(tài)全局變量相當(dāng)于限制了動(dòng)態(tài)全局變量的作用域
看一個(gè)例子:
#include <iostream>
using namespace std;
?
static int b = 10;
?
void fun()
{
?? ?int b = 0;
?? ?cout << "b = " << b << endl;
?? ?b++;
}
?
int main()
{
?? ?for (int i = 0; i < 5; i++)
?? ??? ?fun();
?
?? ?system("pause");
?? ?return 0;
}
得到結(jié)果:
為什么得到5個(gè)0呢,為什么不是0,1,2,3,4呢
這是因?yàn)樵诤瘮?shù)fun中定義了一個(gè)動(dòng)態(tài)局部變量a,而a同時(shí)又是靜態(tài)全局變量,在這種情況下,作用域小的掩蓋作用域大的,所以局部變量會(huì)掩蓋全局變量。所以動(dòng)態(tài)局部變量a掩蓋了靜態(tài)全局變量a
3.2靜態(tài)局部變量
1)作用域?yàn)楫?dāng)前函數(shù),從定義位置,到其所在的{}的結(jié)束位置
2)生命周期為從程序運(yùn)行到程序退出,即貫穿整個(gè)運(yùn)行時(shí)間,當(dāng)下次函數(shù)調(diào)用時(shí),靜態(tài)局部變量不會(huì)被再次初始化,而是沿用上次函數(shù)退出時(shí)的值
靜態(tài)局部變量與動(dòng)態(tài)局部變量的主要不同:
兩者作用域相同,都在函數(shù)內(nèi)部,但是兩者生命周期不一樣,靜態(tài)局部變量的生命周期是到程序的結(jié)束,而動(dòng)態(tài)局部變量的生命周期是函數(shù)的結(jié)束,靜態(tài)局部變量的生命周期更長,同時(shí)靜態(tài)局部變量只會(huì)初始化一次,函數(shù)重復(fù)調(diào)用,但靜態(tài)局部變量不會(huì)被重新初始化
看一段代碼:
#include <iostream>
using namespace std;
?
void fun()
{
?? ?int a = 0;
?? ?static int b = 0;
?? ?cout << "a = " << a << endl;
?? ?cout << "b = " << b << endl;
?? ?a++;
?? ?b++;
}
?
int main()
{
?? ?for (int i = 0; i < 5; i++)
?? ??? ?fun();
?
?? ?system("pause");
?? ?return 0;
}
執(zhí)行結(jié)果:
得到這樣的結(jié)果也是自然的
參考來源:
C語言動(dòng)態(tài)變量與靜態(tài)變量的區(qū)別
C和C++中全局變量,局部變量,靜態(tài)變量和常量
————————————————
原文鏈接:https://blog.csdn.net/qq_33757398/article/details/81365475
總結(jié)
- 上一篇: 81级没有格蓝迪的任务 任务手册里面已没
- 下一篇: vs 2019编写汇编并运行调试