變數儲存型別 作用域

2021-06-25 07:38:57 字數 1709 閱讀 1894

auto

——作用域和壽命:只能做區域性變數;

——在函式內或復合語句內定義的自動變數可以省略auto,而在外部定義的無auto的變數顯然不是自動變數;

(外部變數,即「全域性變數」,的壽命和作用域是全域性的)

register

——作用域和壽命:同auto,即「區域性可見」;

——分配通用暫存器的條件:1)有空閒的暫存器;2)變數所表示的資料的長度不超過暫存器的位長;

extern

——作用域和壽命:全域性存在,全域性可見;

——用來訪問跨檔案作用域的全域性變數,在引用之前,要用extern作外部宣告;

——如果外部變數不在檔案的開頭部分定義,則其有效的作用範圍只限於從定義處到檔案結束。如果定義點之前的函式想引用外部變數,則應該在引用前加extern。

——對外部變數做引用說明時不分配儲存,也不初始化。

(顯示初始化、非顯示初始化 可以顧名思義咯)

static

初始化:

全域性變數:如果不顯示初始化,則編譯器會自動初始化為預設值,比如int預設值0;

區域性static變數:static int a = 1; // 只會初始化一次,以後每次進入函式都不會重新賦值為1;初始化和賦值是不同的概念。

const

const int a;

int const a;

const int *a; // 是不是還有int const *a,兩者一樣???????????

int *const a;

int const *a const;//是這個格式嗎,應該是int const * const a吧????????????????

前兩個的作用是一樣的,a是乙個常整型數。

第三個a是乙個指向常整型數的指標。

第四個a是乙個指向整型數的常指標。

最後乙個a是乙個指向常整型數的常指標。

(原則就是const挨誰近就是修飾誰?)

volatile

volatile 是乙個變數宣告限定詞。

語法:要想給乙個變數加上volatile 限定,只需要在變數型別宣告附之前/後加入乙個volatile 關鍵字就可以了。

下面的兩個例項是等效的,它們都是將foo 宣告為乙個「需要被實時更新」的int型變數。

volatile int foo;

int volatile foo;

同樣,宣告乙個指向volatile 型變數的指標也是非常類似的。

下面的兩個宣告都是將foo 定義為乙個指向volatile integer 型變數的指標。

volatile int * foo;

int volatile * foo;

乙個volatile 型的指標指向乙個非volatile 型變數的情況非常少見,儘管如此,我還是要給出他的語法:

int * volatile foo;

最後一種形式,針對你真的需要乙個volatile 型的指標指向乙個volatile 型的情形:

int volatile * volatile foo;

最後,如果你將volatile 應用在結構體或者是公用體上,那麼該結構體/公用體內的所有內容就都帶有volatile 屬性了。

如果你並不想這樣(牽一髮而動全身),你可以僅僅在結構體/公用體中的某乙個成員上單獨使用該限定。

對變數儲存型別及作用域的小結

區域性變數指函式內部定義的變數,其只在乙個函式內部起作用,即函式外部的其它函式不能引用該變數。區域性變數預設儲存型別為auto,屬於動態儲存型別。在該函式完成一次呼叫後即釋放該變數的值。全域性變數指在程式內所有函式外部定義的變數,它可被程式中的所有函式呼叫。全域性變數的預設儲存型別為static,即...

型別轉換 變數 常量 作用域

低 高 byte,short,char int long float double注意點 1.不能對布林值進行轉換2.不能把物件型別轉化成不相干的型別 3.在高容量轉化成低容量的時候,進行強制轉化 4.轉化的時候存在記憶體溢位,或者精度問題 操作比較大的數的時候,注意溢位問題 jdk 7新特性,數字...

C C 中變數的作用域和儲存型別簡介

寫在開頭 對於很多c c 的初學者來說,很容易理不清變數的作用域和儲存型別這一塊的一些概念,也容易將其中的一些概念搞混淆。作為乙個c c 的初學者,筆者希望在這裡能夠嘗試著去理一理這些較為繁雜的概念,主要當作自己備忘之用。當然,由於筆者水平有限,經驗不足,在這裡也只能羅列一些常用概念和使用方法,且可...