『壹』 簡述靜態局部變數和自動變數的區別,並舉例說明 c語言的 急求答案
生命周期不同:
1、動態變數生命周期僅為函數執行時間周期,該函數調用結束,變數銷毀;
2、靜態變數生命周期延長到整個程序執行結束(不是該函數調用結束,是main函數結束),本次函數調用結束,變數不銷毀,再次調用該函數
該變數保留上一次的值。
『貳』 C語言中的「局部變數」是什麼意思
局部變數是指在程序中,只在特定過程或函數中可以訪問的變數,是相對於全局變數而言的。
在C語言中,局部變數可以和全局變數重名,但是局部變數會屏蔽全局變數。
#include
int fun(int a)
{
int temp; // 變數temp就是定義的一個局部變數,在fun函數執行完後,其在內存中佔用的內存區就會釋放回收
temp = 2*a;
return temp;
}
int b; // 變數b就是一個全局變數,當程序執行完後,才釋放其佔用的內存
void main()
{
int a=2; // 變數a也是局部變數
b = fun();
}
『叄』 C語言中的全局變數和局部變數分別是指什麼
解答問題前,先說明一下,當全局變數和局部變數同名時,要看當前代碼所處的作用域,默認使用當前作用域內的同名局部變數。
分析你所提供的代碼:
#include
int a = 4;
//全局變數
int f(int n)
{
int t = 0;
static int a = 5;
//局部靜態變數
if( n%2 )
{
int a = 6;
// if作用域內局部變數
t += a++;
// 此處的a是指if作用域內的局部變數,該變數在作用
// 域結束後,生存周期結束。
}
else
{
int a = 7; // else作用域內局部變數
t += a++;
// 此處的a是指else作用域內的局部變數
// 作用域結束後,生存周期結束
}
return t+a++;
// 此外的a是指f函數作用域內的靜態局部變數,
// 每次f函數調用return後,此靜態局部變數a自增1
}
int main ( void )
{
int s=a, i=0;
// 根據作用域,此處的a是指全局變數,所以s初始值為4
for(;i<2;i++) s+=f(i);
printf("%d\n",s);
return 0;
}根據以上,分析運行流程:
由上可知,s初始值為4;
當i=0時,第一次循環,調用f()函數,由於0%2為0,會進入else後代碼,此時t=0+7=7,調用f()函數的return時,會返回7+5=12,同時f()函數的靜態局部變數a由5變為6(下次調用生效),s=4+12=16。
當i=1時,第二次循環,調用f()函數,由於1%2為1,會進入if後代碼,此時t=0+6=6,調用f()函數的return時,會返回6+6=12,同時f()函數的靜態局部變數a由6變為7(下次調用生效),s=16+12=28。
當i=2時,循環終止,列印s值為28。
關於最後的問題,是因為f()函數中if後面的變數a作用域只限制在if後的花括弧內,代碼退出該作用域後,該變數生存周期結束而被釋放,return中使用的a是f()函數中定義的靜態局部變數a,所以,不管前者如何賦值,對return中的a沒有影響。
『肆』 C語言中 局部變數和全局變數都是存儲在什麼區
C語言中局部變數存在棧里,全局變數存靜態存儲區。
局部變數在棧空間上分配,這個局部變數所在的函數被多次調用時,每次調用這個局部變數在棧上的位置都不一定相同。局部變數也可以在堆上動態分配,但是記得使用完這個堆空間後要釋放之。
全局變數全部存放在靜態存儲區,在程序開始執行時給全局變數分配存儲區,程序行完畢就釋放。在程序執行過程中它們占據固定的存儲單元,而不動態地進行分配和釋放;
(4)c語言自動變數和局部變數擴展閱讀
C語言中局部變數和全局變數示例:
#include<stdio.h>
#include<malloc.h>
staticints1=0,s2=0,s3=0;//靜態變數放在靜態區
intg1=0,g2=0,g3=0;//全局變數放在靜態區
voidmain()
{
staticints4=0,s5=0,s6=0;<spanstyle="font-family:Arial,Helvetica,simsun,u5b8bu4f53;"></span>//靜態變數
inta1=0,a2=0,a3=0;<spanstyle="font-family:Arial,Helvetica,simsun,u5b8bu4f53;"></span>//局部變數放在棧區
charc1[]="aabb";//局部變數放在棧區
char*c2="aabb";//字元常量放在靜態區
char*m1=(char*)malloc(1);//堆區
char*m2=(char*)malloc(1);//堆區
char*m3=(char*)malloc(1);//堆區
printf("動態數據區 ");
printf("a1 a2 a3 ",&a1,&a2,&a3);
printf("c1 ",c1);
printf("m1 m2 m3 ",&m1,&m2,&m3);
printf("靜態數據區 ");
printf("s1 s2 s3 ",&s1,&s2,&s3);
printf("g1 g2 g3 ",&g1,&g2,&g3);
printf("s4 s5 s6 ",&s4,&s5,&s6);
printf("c2 ",c2);
}
『伍』 關於c語言auto變數和static變數區別
一、主體不同
1、auto變數:是一個C/C++語言存儲類型,僅在語句塊內部使用。
2、static變數:在計算機編程領域指在程序執行前系統就為之靜態分配存儲空間的一類變數。
二、作用域范圍不同
1、auto變數:初始化可為任何錶達式,其特點是當執行流程進入該語句塊的時候初始化可為任何錶達式。
2、static變數:針對某一源文件的以static聲明的文件級變數與函數的作用域只限於文件內(只在文件內可見),也即「內部連接」,因而可以用來限定變數的作用域。
三、特點不同
1、auto變數:具有自動存儲期的變數在進入聲明該變數的程序塊時被建立,它在該程序塊活動時存在,退出該程序塊時撤銷。
2、static變數:在函數內以static聲明的變數雖然與自動局部變數的作用域相同,但存儲空間是以靜態分配而非默認的自動分配方式獲取的,因而存儲空間所在區域不同。
『陸』 C語言中的全局變數和局部變數
局部變數是在某一函數內定義的變數,有效區域在本函數里。
全局變數定義在函數外,全局起作用。
『柒』 c語言中什麼時候用全局變數什麼時候用局部變數
1)靜態局部變數在函數內定義,但不象自動變數那樣,當調用時就存在,退出函數時就消失。靜態局部變數始終存在著,也就是說它的生存期為整個源程序。
(2)靜態局部變數的生存期雖然為整個源程序,但是其作用域仍與自動變數相同,即只能在定義該變數的函數內使用該變數。退出該函數後, 盡管該變數還繼續存在,但不能使用它。
(3)對基本類型的靜態局部變數若在說明時未賦以初值,則系統自動賦予0值。而對自動變數不賦初值,則其值是不定的。
根據靜態局部變數的特點, 可以看出它是一種生存期為整個源文件的量。雖然離開定義它的函數後不能使用,但如再次調用定義它的函數時,它又可繼續使用, 而且保存了前次被調用後留下的值。 因此,當多次調用一個函數且要求在調用之間保留某些變數的值時,可考慮採用靜態局部變數。雖然用全局變數也可以達到上述目的,但全局變數有時會造成意外的副作用(尤其是短名全局變數的變數名污染很嚴重),因此仍以採用局部靜態變數為宜。
簡單的說靜態局部變數與全局變數最明顯的區別就在於:全局變數在其定義後所有函數都能用,但是靜態局部變數只能在一個函數裡面用。
『捌』 C語言中自動變數是什麼變數它是動態變數的意思嗎怎麼理解
局部變數,如不作專門說明為靜態變數,都是動態分配存儲空間,存儲在動態存儲區中。這種變數叫自動變數。這種變數只在定義它們的時候才創建,在定義它們的函數返回時系統回收變數所佔存儲空間。對這些變數存儲空間的分配和回收是由系統自動完成的,所以也叫自動變數。一般情況下,不作專門說明的局部變數,均是自動變數。
『玖』 C語言中的自動變數和寄存器變數是什莫
一、auto
auto稱為自動變數。
局部變數是指在函數內部說明的變數(有時也稱為自動變數)。用關鍵字auto進
行說明, 當auto省略時, 所有的非全程變數都被認為是局部變數, 所以auto實際上
從來不用。
局部變數在函數調用時自動產生, 但不會自動初始化, 隨函數調用的結束, 這
個變數也就自動消失了, 下次調用此函數時再自動產生, 還要再賦值, 退出時又自
動消失。
二、register
register稱為寄存器變數。它只能用於整型和字元型變數。定義符register說
明的變數被Turbo C2.0存儲在CPU的寄存器中, 而不是象普通的變數那樣存儲在內
存中, 這樣可以提高運算速度。但是Turbo C2.0隻允許同時定義兩個寄存器變數,
一旦超過兩個, 編譯程序會自動地將超過限制數目的寄存器變數當作非寄存器變數
來處理。因此, 寄存器變數常用在同一變數名頻繁出現的地方。
另外, 寄存器變數只適用於局部變數和函數的形式參數, 它屬於auto型變數,
因此, 不能用作全程變數。定義一個整型寄存器變數可寫成:
register int a;
『拾』 C語言中 自動變數 靜態變數 寄存器變數 外部變數 有可比性嗎區別在哪簡單易懂點吧~
c語言中變數分為四類,分別是
1.auto 自動變數
2.static 靜態存貯分配變數(又分為內部靜態和外部靜態)
3.extern 外部變數/全程變數(用於外部變數說明)
4.register 寄存器變數(分配在硬體寄存器中)
四大類,所有變數必須先說明(定義),後使用。
下面分別介紹
1.自動變數(局部變數)
局部變數:在一個函數開頭或段開頭處說明的變數,
它有幾個特徵,,
a、作用域為定義它的函數
b、編譯器不會對自動變數給予隱含的初值,故其值不確定,因此每次使用前必須明確的置初值。
c、形參是自動變數,作用域僅限於相應函數內
d、自動變數隨函數的引用而存在和消失,由一次調用到下一次調用之間不保持值。
2.外部變數:在函數外部定義的變數即為外部變數,它的作用域是整個程序(全程變數)。
a. c程序可以分別放在幾個文件上,每個文件可以作為一個編譯單位分別進行編譯。外部變數只需在某個文件上定義一次,其它文件若要引用此變數時,應用extern加以說明(外部變數定義時不必加extern關鍵字)。
b. 在同一文件中,若前面的函數要引用後面定義的外部(在函數之外)變數時,在函數里加extern加以說明。
引進外部變數的原因:解決函數單獨編譯的協調;與變數初始化有關;外部變數的值是永久的;解決數據共享;
注意:函數本身也被認為是外部變數
3.靜態變數:分為內部靜態變數和外部靜態變數
內部靜態變數:a.在局部變數前加上static就為內部靜態變數
b.靜態局部變數仍是局部變數,其作用域仍在定義它的函數范圍內,但它採用靜態存貯分配(由編譯程序在編譯時分配,而一般的自動變數和函數形參均採用動態存貯分配,即在運行時分配空間),當函數執行完,返回調用點時,該變數並不撤銷,再次調用時,其值將繼續存在。
外部靜態變數:a.在函數外部定義的變數前加static即為外部靜態變數
b.作用域為定義它的文件,即成為該文件的私有變數,其他文件上的函數一律不得直接訪問,除非通過它所在文件上的函數進行操作,這可實現數據隱 藏。
4.寄存器變數:只有自動(局部)變數和函數參數才能進一步指定為寄存器存貯類
a.使用register變數可以提高存取速度,但寄存器變數的數目依賴於具體機器,聲明多了也只有前幾個有效。
b.只限於int,char,short ,unsigned和指針類型用寄存類。
c.不能對register變數取地址(即&操作)