1樓:手機使用者
c語言學習之變數儲存
c語言中對變數的說明包括兩方面的內容:變數型別以及變數的儲存型別。變數型別如:
int(整形),char(字元型)是用來說明變數所佔用的記憶體空間的大小。變數儲存型別用來說明變數的作用範圍。
c語言的變數儲存類有:自動類、暫存器類、靜態類和外部類。
關鍵字auto加在變數名及其型別前,用來說明它是自動變數。區域性變數是指在函式內部說明的變數(有時也稱為自動變數)。用關鍵字auto進 行說明, 當auto省略時, 所有的非全程變數都被認為是區域性變數, 所以auto實際上 從來不用。
區域性變數在函式呼叫時自動產生, 但不會自動初始化, 隨函式呼叫的結束, 這個變數也就自動消失了, 下次呼叫此函式時再自動產生, 還要再賦值, 退出時又自動消失。
static稱為靜態變數。根據變數的型別可以分為靜態區域性變數和靜態全程變數。
1. 靜態區域性變數
它與區域性變數的區別在於: 在函式退出時, 這個變數始終存在, 但不能被其它
函式使用, 當再次進入該函式時, 將儲存上次的結果。其它與區域性變數一樣。
2. 靜態全程變數
靜態 全程變數就是指只在定義它的原始檔中可見而在其它原始檔中不可見的變數。它與
全程變數的區別是: 全程變數可以再說明為外部變數(extern), 被其它原始檔使用,而靜態全程變數卻不能再被說明為外部的, 即只能被所在的原始檔使用。
extern稱為外部變數。為了使變數除了在定義它的原始檔中可以使用外, 還要 被其它檔案使用。因此, 必須將全程變數通知每一個程式模組檔案, 此時可用 extern來說明。
暫存器變數to能夠長在執行速度很重要的情況下使用。其思想是告訴編譯程式把該變數放在一個cpu暫存器中。因為資料在暫存器中操作比在記憶體中快,這樣就提高了程式**的執行速度。
暫存器變數的說明是在變數名及型別之前加上關鍵字register。值得注意的是取地址運算子&不能作用於暫存器變數。
file1.c
#include
#include
int reset();
int next();
int last();
int sum(int );
int i=1;
void main()
}file2.c檔案
static int i=10;
int next()
int last()
int sum(int i)
file3.c檔案
extern int i;
reset()
執行結果:
i=1 j=1
next(i)=11
last(i)=10
sum(i+j)=7
i=1 j=2
next(i)=11
last(i)=10
sum(i+j)=10
i=1 j=3
next(i)=11
last(i)=10
sum(i+j)=14
具體分析一下三個檔案中的變數的種類。
在file1.c的開頭宣告i是外部變數,並出示化為1。而在main函式內部,說明了兩個自動變數i和j,這樣在main內部出現的i就是自動量。
在file3.c的開頭說明i是外部的,表明它與file1.c定義的i是同一個變數,所以reset的值返回的就是這個i的當前值1。
file2.c檔案已開始就定義了變數i,並宣告為靜態變數,因此它的使用範圍只在當前檔案中使用。然而從函式sum中定義來看,其內部用到的i是形式引數,j是內部靜態變數,它們與以前的i,j都不同。
具體執行過程分析如下:
首先程式經過編譯後聲稱可執行檔案,執行可執行檔案後,函式從main函式體進入,在初始化的過程中得到i為全域性變數,初值為1。進入main函式後首先呼叫函式reset(),進入檔案file3.c,檔案file3.
c宣告i為外部變數,所以此時i的值為1,則返回的值為1。函式reset()執行完後返回主函式,繼續執行迴圈體中的程式。迴圈體首先呼叫函式next(),程式進入file2.
c檔案,判斷i為靜態變數,所以此時i的值為10,執行next()之後i的值為11,返回值為11,並將11作為i的值。當呼叫last()函式時,判斷i的值為11,執行函式後,i的值變為10,並將10作為i的值。最後執行函式sum(i),此時值的注意的是執行程式時傳遞的是形參,即第一次呼叫時實際計算的值為sum(i+j=2),這樣呼叫函式sum(i)後執行的結果為i=5+2=7,即為執行的結果。
依次類推,分別為7,10,14。
通過以上的程式可以理解不同的儲存型別的作用範圍不同,在程式設計中如何靈活的使用各種不同的儲存型別是能夠使程式更靈活。
2樓:健身動起來
一、auto
auto稱為自動變數。
區域性變數是指在函式內部說明的變數(有時也稱為自動變數)。用關鍵字auto進
行說明, 當auto省略時, 所有的非全程變數都被認為是區域性變數, 所以auto實際上
從來不用。
區域性變數在函式呼叫時自動產生, 但不會自動初始化, 隨函式呼叫的結束, 這
個變數也就自動消失了, 下次呼叫此函式時再自動產生, 還要再賦值, 退出時又自
動消失。
二、register
register稱為暫存器變數。它只能用於整型和字元型變數。定義符register說
明的變數被turbo c2.0儲存在cpu的暫存器中, 而不是象普通的變數那樣儲存在內
存中, 這樣可以提高運算速度。但是turbo c2.0只允許同時定義兩個暫存器變數,
一旦超過兩個, 編譯程式會自動地將超過限制數目的暫存器變數當作非暫存器變數
來處理。因此, 暫存器變數常用在同一變數名頻繁出現的地方。
另外, 暫存器變數只適用於區域性變數和函式的形式引數, 它屬於auto型變數,
因此, 不能用作全程變數。定義一個整型暫存器變數可寫成:
register int a;
3樓:匿名使用者
1、auto[自動]儲存型別 在**塊之間傳遞資訊的一種方法就是使用外部變數。 當一個變數在函式的外部被宣告時,它的儲存空間是永久分配的, 它的儲存型別是extren. 外部變數的宣告看上去和函式或**塊內部所宣告的變數一樣。
外部變數對於它之後的所有函式都有效。在**塊或函式後, 外部變數仍然存在。
2、register[暫存器] 儲存型別告訴編譯器相關的變數應該改量儲存在高速度的暫存器中。 使用register儲存型別的目的一般是為了提高執行速度, 但是,register宣告只是向編譯器所提出的“建議”, 並非強制要求。
4樓:韌性第一
自動變數就是auto型變數,一般作為區域性變數;
暫存器變數是儲存在cpu內的,所以它的呼叫別自動、靜態變數都快。
c語言中自動變數是什麼變數?它是動態變數的意思嗎?怎麼理解?
5樓:匿名使用者
區域性變數,如不作專門說明為靜態變數,都是動態分配儲存空間,儲存回在動態儲存區中。這答種變數叫自動變數。這種變數只在定義它們的時候才建立,在定義它們的函式返回時系統**變數所佔儲存空間。
對這些變數儲存空間的分配和**是由系統自動完成的,所以也叫自動變數。一般情況下,不作專門說明的區域性變數,均是自動變數。
6樓:
自動變數包括函式形參和非static區域性變數,他也不是說動態變數的意思。自動變數說明這個變數是再棧上在執行時自動建立自動撤銷。
c語言中 自動變數 靜態變數 暫存器變數 外部變數 有可比性嗎?區別在哪?簡單易懂點吧~
c語言遞迴函式中的自動變數是什麼?
7樓:
就是你遞迴回去的那個數,在遞迴找到出口前,一直隨著遞迴次數增加改變
c語言中,全域性變數和外部變數有什麼區別
外部變數也是全域性變數,被定義成外部變數是指這個變數沒有在當前 中,而是在另乙個 或二進位制檔案中。比如我在a.c中定義了變數myvar,還有乙個檔案b.c,它要用a.c中的myvar,這就要讓b.c知道myvar怎麼定義的,有兩種方法,一種是include a.c,但一般不這麼做 還有一種方法是在...
C語言中,全域性變數和外部變數有什麼區別
舉個生動的例子 全域性變數就像你們這棟樓 樓道裡的垃圾桶 外部變數相當於其他樓裡的垃圾桶 全域性變數的作用域是當前整個檔案 其他檔案要使用它,應該用extern來宣告它此時對於要用它的檔案來說,它就變成了外部變數了。全域性變數也稱為外部變數,它是在函式外部定義的變數。它不屬於哪乙個函式,它屬於乙個源...
c語言中int型變數與char型變數什麼情況下不能互換
其實這種問題,從表面說也沒有什麼特別的意義,因為本來就沒有什麼嚴格意義上的能不能互換的問題。只要能在使用過程中,滿足本來的要求就可以了。例如 在將int型變數轉換為char型時,要考慮到資料的溢位問題等 char轉換為int時,要考慮到它的符號問題。在根本上只要認清它們兩者之間的區別就可以了。int...