變數的儲存類別,變數的儲存型別是什麼?

2022-06-26 09:30:06 字數 4894 閱讀 8361

1樓:

1全部應該選b

a是自動變數。用auto(或省略)來區分說明的區域性變數。當執行進入區域性變數所在的塊時,在棧上為變數分配儲存,退出塊時,儲存單元被**。

b,外部變數,在程式被編譯時分配儲存,在整個程式結束後外部變數佔用的儲存被**。因此,外部變數的生命週期是整個程式的一次執行過程。外部變數的作用域從外部變數定義開始,通過作引用說明,外部變數的作用域可以擴大到整個程式的所有檔案。

c是靜態變數。靜態變數的生命週期也是整個程式的一次執行過程。但靜態變數不能被定義靜態變數的檔案之外的其他檔案所引用。

d是暫存器變數。通常只是為了存放程式中使用頻率較高的資料,用以提高程式的執行效率。

2樓:匿名使用者

a,auto

確切的說應該時全域性變數auto變數

在使用時要用extern宣告

extern,外部的,可以被不同檔案使用

static ,靜態,只能被本檔案中使用

register ,暫存器型別,編譯器視情況而定a.c檔案

static int a1 = 0;只能被a.c使用int a2 = 0;可以被其他檔案使用

b.c檔案

extern int a2;可以使用a2變數

3樓:匿名使用者

選b變數在一個檔案中定義。別的檔案呼叫用extern宣告是外部變數才能使用

變數的儲存型別是什麼?

什麼是變數的儲存型別

4樓:匿名使用者

1全部c語言的變數有4種儲存型別,分別是auto(自動型)、static(靜態型)、register(暫存器型)和extern(外部型)。在定義或說明一個變數時可以加上儲存型別關鍵字,以限定其儲存類別。

儲存型別決定了系統將在哪一個資料儲存區為變數分配儲存空間。auto型將在堆疊區分配儲存空間;static型將在靜態資料區分配儲存空間;register型將在cpu內部的暫存器中分配儲存空間;而extern將不為變數分配儲存空間,extern宣告該變數在別的地方已經分配了儲存空間。

變數儲存型別關鍵字只需加在變數定義語句型別關鍵字前面即可。

char ch1;/*定義了一個char型變數ch1,其儲存型別預設為自動型(必須是內部變數)*/

static char ch2;/*定義了一個char型變數ch2,其儲存型別指定為靜態型*/

注意:以上auto型是對內部變數而言,對於外部變數不存在自動型的問題。內部變數自動在堆疊區分配空間。事實上,內部變數預設為自動型,所以auto限定詞沒有任何用處。

1.自動型變數

定義一個內部變數時,如果將auto加在定義語句前面,則該變數是自動型變數;定義內部變數時,如果沒有加任何儲存型別限定,該變數預設為自動型變數。

auto只能修飾內部變數,不能修飾外部變數。也就是說只有內部變數可以定義為自動型變數,外部變數不能定義為自動型變數。

事實上,auto沒有什麼實際用處。內部變數已經預設為自動型變數。

2.靜態型變數

外部變數和內部變數都可以定義為靜態型變數。

如果在定義一個內部變數時,在定義語句最前面加上static儲存型別限定詞,那麼該變數將是一個靜態型變數。該變數將在靜態資料區分配儲存空間。這種變數作用域雖然只在函式內部,但是該變數將一直在靜態資料區佔據儲存空間,直到程式執行結束。

定義外部變數時,如果不加儲存型別限定詞,它將在靜態資料區分配儲存空間。它的作用域除了本檔案以外,其他檔案通過extern語句宣告後也可訪問。

但是,如果在定義一個外部變數時,加上static限定詞,其作用域將變窄,該變數只在本檔案中可見,在其他檔案中將不可見,此時在其他檔案中即使用extern宣告也不能擴充套件其作用域。這是一個外部靜態型變數,也在靜態資料區分配儲存空間。

注意:對於函式的作用域也是這樣,如果在函式定義時加上了static限定詞,那麼該函式也只在其定義檔案內可見(「可見」的意思就是在在該範圍內可以使用)。在其他檔案中即使宣告瞭也不可以呼叫。

另外,對於函式宣告而言可以省略extern關鍵字。

一個檔案中加了static的同名外部變數將隱藏其他檔案中定義的未加static的外部變數。也就是說,static變數能夠遮蔽其他檔案中的同名外部變數,這功能有點像函式的內部變數能夠遮蔽同名的外部變數一樣。但是,不同檔案中如具有未加static的多個同名外部變數則是非法的。

static限定詞常用於外部變數,也可用於函式。正常情況下,函式名字是全域性的,對程式的任何部分都是可見的。如果在定義一個函式時用static限定,該函式將在其定義檔案以外不可見。

static限定詞同樣能夠應用於內部變數。此時,該變數將是一個內部靜態型變數。內部靜態型變數就像自動變數一樣是屬於某個特定函式的內部變數。

但是,同自動型變數不同,它們一直在記憶體中存在,而不是隨著函式的每次呼叫而存在,隨著函式呼叫結束而消失。這意味著內部靜態型變數提供了單個函式內部私有的、持久的儲存。也就是說內部靜態型變數只在函式被呼叫時起作用,但是它將在程式的整個執行時間內一直佔據記憶體空間。

3.暫存器型變數

register限定詞通知編譯器--程式中的變數將頻繁使用。它的意思是建議編譯器將程式中用register限定的變數放置在計算機的內部寄存其中,這樣可能得到更小更快的程式。但是,編譯器將根據實際情況考慮是否採納該建議--是否將register變數處理為暫存器變數最終決定權還是在編譯器。

如下使用register:

register int x;/*x必須是內部變數*/

register char ch;/*ch必須是內部變數*/

register只能用於限定自動型變數和函式的形式引數。也就是說register只對內部變數起作用,而且只能限定內部非靜態型變數,不能限定內部靜態型變數。

register也可以應用於形式引數,格式如下:

f(register unsigned m,register long n) /*register應用於形式引數*/

在傳統c中,register變數的使用有諸多限制,它決定於硬體的實現方式。在每一個函式中只有少數幾個變數可以儲存在暫存器中,而且也只有特定的型別才行。過量的register變數看起來是無害的,但是超量以後,編譯器將忽略新的register變數。

另外不管register變數實際上是否被編譯器設定為暫存器型變數,都不可能取得該變數的地址。暫存器型變數的型別和數量的多少隨計算機不同而異。register變數一般只能夠設定幾個。

傳統c的register型別限定於char、int等型別。像float、double、陣列等是不可以設定為register型變數的。但是,在最新c99標準中,任何型別都可以定義為register變數,register宣告的目的只是告訴編譯器以儘快的速度處理該變數,編譯器不見得非把它處理為register變數。

4.外部型變數

如extern用於變數定義語句前面,那麼該語句就只能是一個宣告語句了,他不再是一個變數定義語句。它僅僅是一個宣告--宣告該變數已經在別的地方定義,只是告訴編譯器該變數的型別。

extern int sp;/* sp在別的地方定義,並分配儲存單元,本語句只是宣告它已經定義過*/

該語句宣告瞭sp在別的地方已經定義,並分配了儲存空間,本語句只是說明sp已經定義過的型別為int,並不再為它分配記憶體空間。這樣宣告以後,在本檔案餘下部分就可以使用sp了。

5樓:匿名使用者

turbo c2.0支援四種變數儲存型別。說明符如下:

auto static extern register

下面分別來介紹。

一、auto

auto稱為自動變數。

區域性變數是指在函式內部說明的變數(有時也稱為自動變數)。用關鍵字auto進

行說明, 當auto省略時, 所有的非全程變數都被認為是區域性變數, 所以auto實際上

從來不用。

區域性變數在函式呼叫時自動產生, 但不會自動初始化, 隨函式呼叫的結束, 這

個變數也就自動消失了, 下次呼叫此函式時再自動產生, 還要再賦值, 退出時又自

動消失。

二、static

static稱為靜態變數。根據變數的型別可以分為靜態區域性變數和靜態全程變數。

1. 靜態區域性變數

它與區域性變數的區別在於: 在函式退出時, 這個變數始終存在, 但不能被其它

函式使用, 當再次進入該函式時, 將儲存上次的結果。其它與區域性變數一樣。

2. 靜態全程變數

turbo c2.0允許將大型程式分成若干獨立模組檔案分別編譯, 然後將所有模組

的目標檔案連線在一起, 從而提高編譯速度, 同時也便於軟體的管理和維護。靜態

全程變數就是指只在定義它的原始檔中可見而在其它原始檔中不可見的變數。它與

全程變數的區別是: 全程變數可以再說明為外部變數(extern), 被其它原始檔使用,

而靜態全程變數卻不能再被說明為外部的, 即只能被所在的原始檔使用。

三、extern

extern稱為外部變數。為了使變數除了在定義它的原始檔中可以使用外, 還要

被其它檔案使用。因此, 必須將全程變數通知每一個程式模組檔案, 此時可用

extern來說明。

四、register

register稱為暫存器變數。它只能用於整型和字元型變數。定義符register說

明的變數被turbo c2.0儲存在cpu的暫存器中, 而不是象普通的變數那樣儲存在內

存中, 這樣可以提高運算速度。但是turbo c2.0只允許同時定義兩個暫存器變數,

一旦超過兩個, 編譯程式會自動地將超過限制數目的暫存器變數當作非暫存器變數

來處理。因此, 暫存器變數常用在同一變數名頻繁出現的地方。

另外, 暫存器變數只適用於區域性變數和函式的形式引數, 它屬於auto型變數,

因此, 不能用作全程變數。定義一個整型暫存器變數可寫成:

register int a;

對於以上所介紹的變數型別和變數儲存型別將會在以後的學習中, 通過例行程

序中的定義、使用來逐漸加深理解。

中介效應中的自變數可以是類別變數嗎

自變數是類別變數的話,應該分別計算中介變數到因變數的係數,比如a類別算一次,b類別算一次。但這樣你模型中的中介變數這個角色就變為自變數的角色了,自變數的角色變成了調節變數的角色。可以 參考邏輯迴歸 理科男的世界讓我們這些俗人不能懂呀,你就不能好好說話啊 兩個自變數怎麼做中介效應?急!中介產量和自變數...

cstring型別的變數中存放的是指向字串的指標

首先 指標的變數 字首 統一報錯,其次,想列印出地址對於非指標物件的變數統一使用 string 是字串,想訪問地址得用 或者也可以。樓主,還是複習下指標和變數吧。string型別的變數中存放的是指向字串的指標,string s 12345 那s就是存放那個指標的,既然s存放了那個指標,那麼你為何還要...

C語言中強制型別轉換會改變原來變數的型別麼?比如a float b,那麼b的也會變成浮點型麼

題主的關注點應該在強制型別轉換後原地址的型別不會變上,但如果a也是整型,這樣把一個浮點數賦值給一個整型,也會進行強制型別轉換,即我認為a還是整型。thx 不會,你宣告b是什麼型別,強制型別轉換賦值後,b還是原來的型別的 a float b,是將b的型別強制裝換為浮點型後給a,但b的型別沒有發生改變....