在C語言中,對變數的存儲類型說明有以下四種:
1、auto 自動變數
2、register 寄存器變數
3、extern 外部變數
4、static 靜態變數
所謂存儲類型是指變數佔用內存空間的方式,也稱為存儲方式。
變數的存儲方式可分為「靜態存儲」和「動態存儲」兩種。
1、靜態存儲變數通常是在變數定義時就在存儲單元並一直保持不變,直至整個程序結束。
2、動態存儲變數是在程序執行過程中,使用它時才分配存儲單元,使用完畢立即釋放。典型的例子是函數的形式參數,在函數定義時並不給形參分配存儲單元,只是在函數被調用時,才予以分配,調用函數完畢立即釋放。
如果一個函數被多次調用,則反復地分配、釋放形參變數的存儲單元。從以上分析可知,靜態存儲變數是一直存在的,而動態存儲變數則時而存在時而消失。
(1)全局變數存儲類型是擴展閱讀:
變數根據定義的位置的不同的生命周期,具有不同的作用域,作用域可分為6種:全局作用域,局部作用域,語句作用域,類作用域,命名空間作用域和文件作用域。
一、從作用域看:
1、全局變數具有全局作用域。全局變數只需在一個源文件中定義,就可以作用於所有的源文件。當然,其他不包含全局變數的定義的源文件需要用extern關鍵字再次聲明這個全局變數。
2、靜態局部變數具有局部作用域,它只被初始化一次,自從第一次被初始化直到程序運行結束一直存在,它和全局變數的區別在於全局變數對所有函數都是可見的,而靜態局部變數只對定義自己的函數體始終可見。
3、局部變數也只有局部作用域,它是自動對象(auto),它在程序運行期間不是一直存在,而是只在函數執行期間存在,函數的一次調用執行結束後,變數被撤銷,其所佔用的內存也被收回。
4、靜態全局變數也具有全局作用域,它與全局變數的區別在於如果程序包含多個文件的話,它作用於定義它文件里,不能作用到其他文件里,即被static關鍵字修飾過的變數具有文件作用域。這樣即使兩個不同的源文件都定義了相同名字的靜態全局變數,它們也是不同的變數。
二、從分配空間看:
全局變數,靜態局部變數,靜態全局變數都在靜態存儲區分配空間,而局部變數在棧里分配空間。
全局變數本身就是靜態存儲方式,靜態全局變數當然也是靜態存儲方式。這兩者在存儲方式上並無不同。這兩者的區別雖在於非靜態全局變數的作用域是整個源程序,當一個源程序由多個源文件組成時,非靜態的全局變數在各個源文件中都是有效的。
而靜態全局變數則限制了其作用域,即只在定義該變數的源文件內有效,在同一個源程序的其他源文件中不能使用它。由於靜態全局變數的作用域局限於一個源文件內,只能為該源文件內的函數公用,因此可以避免在其他源文件中引起錯誤。
1、靜態變數會放在程序的靜態數據存儲區(全局可見)中,這樣可以在下一次調用的時候還可以保持原來的賦值。這一點是它與堆棧變數和堆變數的區別。
2、變數用static告知編譯器,自己僅僅在變數的作用范圍內可見。這一點是它與全局變數的區別。
參考資料來源:網路-變數-存儲類型
⑵ 全局變數為何是靜態存儲類型,它的值不能被改變嗎
每個程序運行的時候,系統會為程序分配4個區(棧區、堆區、靜態區、代碼區),(對於c語言而言)。
棧區存放auto變數,也就是臨時變數。堆區存放堆變數(也就是malloc的地址,手動分配內存的方式)。代碼區存放你寫的程序代碼。而靜態區存放的就是全局變數和常量的,(靜態區也細分為全局區和常量區(在linux下))。
所以常量的存儲方式為靜態存儲。這種層的東西國人也就是理解層面的,不深。
你可以自己查查有關內存四區的知識,或者看看嗨翻c這本書。
⑶ C語言中全局變數的儲存類別是
C語言中全局變數的儲存類別是靜態存儲區。
由某對象或某個函數所創建的變數通常都是局部變數,只能被內部引用,而無法被其它對象或函數引用。
全局變數既可以是某對象函數創建,也可以是在本程序任何地方創建。全局變數是可以被本程序所有對象或函數引用。
(3)全局變數存儲類型是擴展閱讀:
使用全局變數會佔用更多的內存(因為其生命期長),不過在計算機配置很高的今天,這個不應該算什麼問題,除非使用的是巨大對象的全局變數,能避免就一定要避免。
使用全局變數程序運行時速度更快一些(因為內存不需要再分配),同樣也快不了多少。對於局部變數的名字空間污染,這個在不使用太多變數時是可以避免的。
當全局變數與局部變數重名的時候,起作用的是局部變數,全局變數被屏蔽掉。還可以用extern在函數外對全局變數聲明,使全局變數的作用域從聲明處到文件的結束。
⑷ 在C語言中,全局變數的存儲類別是什麼
內存中供用戶使用的存儲空間分為代碼區與數據區兩個部分。變數存儲在數據區,數據區又可分為靜態存儲區與動態存儲區。
靜態存儲是指在程序運行期間給變數分配固定存儲空間的方式。如全局變數存放在靜態存儲區中,程序運行時分配空間,程序運行完釋放。
動態存儲是指在程序運行時根據實際需要動態分配存儲空間的方式。如形式參數存放在動態存儲區中,在函數調用時分配空間,調用完成釋放。
C語言中對變數的說明包括兩方面的內容:變數類型以及變數的存儲類型。變數類型如:int(整形),char(字元型)是用來說明變數所佔用的內存空間的大小。變數存儲類型用來說明變數的作用范圍。
⑸ static類型的變數在函數內說明,而在整個程序運行期間都存在,因此c語言中全局變數的存儲類別是static
錯,
雖然static聲明的變數生存周期是整個程序運行期間,但它的作用域並不是全局的
⑹ 局部變數、全局變數、外部變數個採用什麼存儲方式
局部變數是指在函數內部,臨時申請的內存空間,函數執行完成後就自動被釋放掉,也在程序RAM空間;全局變數是指在函數外部聲稱的變數,程序執行過程中不會被釋放,程序未退出之前,一直在程序的RAM空間;外部變數,指的是不在本文件中聲稱的全局變數。
⑺ 在一個C程序中,若要定義一個只允許本源程序文件中所有函數使用的全局變數,則該變數需要定義的存儲類別
在一個C程序中,若要定義一個只允許本源程序文件中所有函數使用的全局變數,則該變數需要定義的存儲類別是靜態變數static。
全局變數(外部變數)的說明之前再冠以static 就構成了靜態的全局變數。全局變數本身就是靜態存儲方式, 靜態全局變數當然也是靜態存儲方式。這兩者在存儲方式上並無不同。這兩者的區別雖在於非靜態全局變數的作用域是整個源程序, 當一個源程序由多個源文件組成時,非靜態的全局變數在各個源文件中都是有效的。
而靜態全局變數則限制了其作用域, 即只在定義該變數的源文件內有效, 在同一源程序的其它源文件中不能使用它。由於靜態全局變數的作用域局限於一個源文件內,只能為該源文件內的函數公用, 因此可以避免在其它源文件中引起錯誤。
(7)全局變數存儲類型是擴展閱讀
除明確標識出變數的生命周期外,將變數聲明為static存儲類還會根據變數屬性不同而有一些特殊的作用:
1、對於靜態全局變數來說,針對某一源文件的以static聲明的文件級變數與函數的作用域只限於文件內(只在文件內可見),也即「內部連接」,因而可以用來限定變數的作用域;
2、對於靜態局部變數來說,在函數內以static聲明的變數雖然與自動局部變數的作用域相同(即作用域都只限於函數內),但存儲空間是以靜態分配而非默認的自動分配方式獲取的,因而存儲空間所在區域不同。
一般來說,靜態分配時存儲空間於編譯時在程序數據段分配,一次分配全程有效;而自動分配時存儲空間則是於調用棧上分配,只在調用時分配與釋放,且兩次調用間變數值始終保持一致;必須注意,靜態局部變數只能初始化一次,這是由編譯器來保證實現。
⑻ c語言的題~
二1、 在C語言中,全局變數的存儲類別是: (a)
A) static B) extern
C) void D) register
2、 有如下函數調用語句 func(rec1,rec2+rec3,rec4,rec5);
該函數調用語句中,含有的實參個數是(B)
A) 3 B) 4
C) 5 D) 有語法錯誤
3、 以下函數返回a數組中最小值所在的下標,在劃線處應
填入的是________。(D)
fun( int a[],int n)
{ int i,j=0,p;
p=j;
for(i=j;i<n;i++)
if(a[i]<a[p])_______________;
return (p); }
A) i=p B) a[p]=a[i]
C) p=j D) p=i
4、 下列程序的輸出結果是________。(D)
int t(int x,int y,int cp,int dp)
{ cp=x*x+y*y; dp=x*x-y*y; }
main()
{ int a=4,b=3,c=5,d=6;
t(a,b,c,d);
printf("%d %d\n",c,d); }
A) 16 9 B) 4 3
C) 5 6 D) 25 9
5、 請讀程序:
#include <stdio.h>
f(int b[ ],int n)
{ int i,r;
r=1;
for (i=0;i<=n;i++) r=r*b[i];
return r; }
main()
{ int x,a[]={3,4,5,6,7,8,9};
x=f(a,2);
printf("%d\n",x); }
上面程序的輸出結果是________。(C)
A) 720 B) 120
C) 60 D) 24
6、 以下程序的輸出結果是________。(B)
int a,b;
void fun()
{ a=100; b=200; }
main()
{ int a=5,b=7;
fun();
printf("%d%d\n",a,b); }
A) 100200 B) 57
C) 200100 D) 75
7、 函數f的功能是:測定字元串的長度,空白處應填入________。(C)
int f(char s[ ])
{ int i=0;
while(s[i]!='\0') i++;
return (________); }
main( )
{ printf("%d\n",f("goodbye!")); }
A) i-1 B) i
C) i+1 D) s
8、 請讀程序:
#include<stdio.h>
f(char s[ ])
{ int i,j;
i=0;j=0;
while( s[ j]!= '\0') j++;
return (j-i); }
main()
{printf("%d\n",f("ABCDEF"));}
上面程序的輸出結果是________。(B)
A) 0 B) 6
C) 7 D) 8
9、 下面程序的輸出是________。(B)
int m=13;
int fun2(int x, int y)
{ int m=3;
return(x*y-m); }
main()
{ int a=7, b=5;
printf("%d\n",fun2(a,b)/m);}
A) 1 B) 2
C) 7 D) 10
10、 以下敘述中錯誤的是________。(C)
A) 在C中,函數中的自動變數可以賦初值,每調用一次,賦一次初值
B) 在C中,在調用函數時,實參和對應形參在類型上只需賦值兼容
C) 在C中,外部變數的隱含類別是自動存儲類別
D) 在C中,函數中的靜態變數可以賦初值,只在編譯時賦一次初值
⑼ 解釋什麼是全局變數,如何定義
其實,變數根據其在程序中的定義點不同,分為局部和全局變數。
在函數內部定義的變數為局部變數;
在所有函數外部定義的變數為全局變數。
全局變數的作用域是從該變數定義的位置開始,直至源文件借宿。在同一文件中的所有函數都可以引用為全部變數。
全局變數存儲類型一般可以定義為:static型和exterm型,默認為extern型。
而其static型全局變數作用域定義點開始至本源文件內的所有函數,其他源文件內的函數不能使用;extern型全局變數作用域為定義點開始至源文件內的所有函數,同時可以被其他源文件內的函數使用,在使用之前要加外部說明,關鍵字仍然是extern.
⑽ 【求助c語言】,凡是函數中未指定存儲類別的全局變數,其隱含的存儲類別為
全局變數其默認儲存類型都是extern
,
而局部變數的默認儲存類型是
auto,
函數中聲明的變數是局部變數,所以原題中說
「函數中未指定存儲類別的全局變數」
這句本身就有問題。
記著:
全局變數
extern
局部變數
auto