【转载】C语言变量详解
原鏈接:http://gaga.yo2.cn/articles/detailed-c-language-variables-review.html
?剛做題時(shí)發(fā)現(xiàn)全局變量會自動初始化,如int型則自動初始化為0,double則初始化為0.000000....。而局部變量如果沒有初始化的話,初值為一隨機(jī)數(shù)。于是很好奇,找了點(diǎn)資料,發(fā)現(xiàn)果然如此。
?
一。變量的存儲類型
C語言中的變量存儲類型有4種,分別為auto(自動變量),static(靜態(tài)變量),extern(外部變量),register(寄存器變量)
1.全局變量的存儲類型:
static和extern兩種,其中extern是缺省的全局變量存儲類型。
int x,y=5;//默認(rèn)為外部全局變量
extern int a=1,b=2;//定義外部全局變量,使用關(guān)鍵字extern后,必須進(jìn)行初始化!
static float f1,f2;//靜態(tài)全局變量
void main()
{
..........
}
extern型全局變量通過外部全局變量說明可以被其他源程序引用,而static星的全局變量只能局限在本源程序文件中使用
如果使用了關(guān)鍵字extern,則必須對這個(gè)外部全局變量進(jìn)行出示化,否則編譯程序會把它當(dāng)作外部變量的聲明(說明)??????
2.局部變量的存儲類型:
C語言種的局部變量的存儲類型有如下3種:auto,static,register。其中auto是缺省的局部變量存儲類型!
void main()
{
??? auto int a;//自動變量
??? fioat f;//自動變量
??? static int i;//靜態(tài)變量
??? register double d;//寄存器變量,要求編譯器使用CPU寄存器來存儲變量值
}
C語言函數(shù)定義中的形參也是局部變量,形參的默認(rèn)存儲類型是auto,也可以指定形參的存儲類型是register,但不允許指定形參的村塾類型為static!
二。變量的生存期
C語言的變量生存期有2種:全程生存期,動態(tài)生存期。
1.全程生存期
指變量在程序運(yùn)行一開始就被建立,而在程序運(yùn)行結(jié)束后才從內(nèi)存中刪除。
具有全程生存期的變量是全局變量和靜態(tài)變量??
具有全程生存期的變量存儲在程序的靜態(tài)數(shù)據(jù)存儲區(qū)中
2.動態(tài)生存期
指變量在程序運(yùn)行過程中,因需要使用才建立,而使用結(jié)束就被刪除
具有動態(tài)生存期的變量有:局部自動變量,寄存器變量
具有動態(tài)生存期的變量存儲在程序的動態(tài)數(shù)據(jù)區(qū)中
對于復(fù)合語句種定義的auto型的局部變量,每當(dāng)程序運(yùn)行至該語句時(shí),就會在動態(tài)數(shù)據(jù)區(qū)建立這些局部變量的存儲空間,而一旦程序流程離開該復(fù)合語句時(shí),該復(fù)合語句種的局部變量將被系統(tǒng)從內(nèi)存種刪除
3.變量的初始化
具有全局生存期的變量(包括數(shù)組)在定義時(shí)如果沒有初始化,則初值自動為0;而具有動態(tài)生存期的變量未初始化時(shí),初值為一隨機(jī)數(shù)!
??? 具有全局生存期的變量在定義時(shí)如有初始化,則初始化在程序剛開始運(yùn)行建立靜態(tài)數(shù)據(jù)區(qū)時(shí)會被執(zhí)行一次,以后再也不會執(zhí)行初始化操作。而動態(tài)生存期的變量在定義時(shí)如有初始化,則每當(dāng)程序創(chuàng)建該變量時(shí)都會執(zhí)行初始化。
static double a[10];
int b[5];double x,y;static char ch;
void main()
{
???? static long p[8];
???? static float g;
}
上述變量都為全局生存期變量,所以初值都時(shí)0!
注意:如果在函數(shù)中使用靜態(tài)局部變量,由于靜態(tài)局部變量的初始化只執(zhí)行一次,故當(dāng)?shù)?次調(diào)用該函數(shù)時(shí),不會對靜態(tài)局部變量進(jìn)行再次初始化;又由于靜態(tài)局部變量時(shí)全程生存期的,所以靜態(tài)局部變量的值為上次結(jié)束函數(shù)調(diào)用時(shí)的值!
#include "stdio.h"
void f()
{
??? int a =0;//自動局部變量
??? static int c;//靜態(tài)局部變量
??? a++;c++;
??? printf("%d,%d,",a,c)
}
void main()
{
??? int k;
??? for(k=1;k<=4;k++)
??????? f();
}
輸出結(jié)果:1,1,1,2,1,3,1,4
解析:
由于a時(shí)自動變量,即為動態(tài)生存期變量,所以每次調(diào)用函數(shù)f()時(shí)都要進(jìn)行初始化,故每次輸出都時(shí)1。
而b為靜態(tài)局部變量,即為全局生存期變量,所以只是在第一次調(diào)用函數(shù)f()時(shí)進(jìn)行初始化,在接下來函數(shù)f的調(diào)用中
b的值為上次函數(shù)結(jié)束時(shí)的值
?
轉(zhuǎn)載于:https://www.cnblogs.com/zen_chou/archive/2009/05/19/1460227.html
總結(jié)
以上是生活随笔為你收集整理的【转载】C语言变量详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 摩尔庄园手游霜天红叶怎么获得?
- 下一篇: 安装ATi显卡驱动后增加的鼠标右键菜单的