c語言中變數的宣告一般特指以extern
修飾的變數,表明該變數在其他檔案中定義。這裡宣告是更一般的概念,包括變數的定義、宣告和函式的原型等。
宣告的通用格式如下:
[儲存型別] [型別限定符] [型別說明符] 宣告符;
宣告符包括以下四種:
宣告符號也可能是上述四種的混合,對於複雜的宣告符(例如int *(*x[10])(void)
,採用以下原則:
為了避免這種複雜性,最好使用型別定義來簡化宣告。
宣告符之間與逗號分開。表示變數的宣告符可以後接初始化式。建議在定義變數的同時將其初始化。
c語言中變數的特性
其中在塊(函式體或復合語句)中不宣告儲存型別的變數預設使用auto
儲存型別,具有自動儲存期限、塊作用域,並且無鏈結。在所有函式的最外層,不宣告儲存型別的變數預設使用extern
儲存型別,具有靜態儲存期限、檔案作用域和外部鏈結。
auto
儲存型別
auto
儲存型別只對塊內的變數有效,宣告的變數具有自動儲存期限、塊作用域,且無鏈結。不需明確指出,在塊內不指明儲存型別的變數都預設是auto
型的。
static
儲存型別
當static
用於所有函式的最外層的變數時,該變數具有靜態儲存期限、檔案作用域和內部鏈結。利用這個性質,可以利用static
進行資訊隱藏。
當static
用於塊內變數時,說明該變數具有靜態儲存期限、塊作用域且無鏈結。
extern
儲存型別
extern
使多個檔案共享同乙個變數,當編譯器編譯到這裡是,就會知道不用給這個變數分配空間,這個變數的定義是在外部的某個檔案內。注意:在程式內可以多次宣告同乙個變數,但只能有一次定義。
register
儲存型別
register
儲存型別的變數要求把變數儲存在暫存器中,而不是像其他儲存型別的變數儲存在記憶體中。但這只是一種請求,實際上由編譯器來決定實際使用哪種方式。
register
儲存型別只對塊(函式體或復合語句)內的變數有效,具有自動儲存許可權、塊作用域、無鏈結,但是由於不存在記憶體中,所以沒有位址就不能使用取位址符&
獲取位址。常用於頻繁訪問和更新的變數。
當前編譯器已非常強大,可自動選擇記憶體和暫存器來作為變數的儲存方式,register
已不再常用。
函式的儲存型別
函式的儲存型別只能使用extern
和static
,extern
是其預設的儲存型別,說明函式是外部鏈結的,而static
說明函式是內部鏈結的,只能在定義函式的檔案內使用該函式。
型別限定符包括const
和volatile
兩種。
const
宣告一些唯讀變數,可以訪問但是不能改變它們的值。
volatile
用於指向那些「易變」的儲存空間。所謂易變的儲存空間,是指該記憶體空間可能在程式自身並未試圖存放新值的情況下在執行期間改變內容,例如儲存來自輸入裝置資料的記憶體空間。volatile
的乙個用途是用於避免編譯器的不適當的優化。
/***************************************
* different_declarations.c *
* *
* c語言中的不同的宣告 *
***************************************/
#include
typedef
char * name;
static
void sayhello();
int main()
; int i = 0;
for (; i < 3; i++)
printf(",%s", names[i]);
printf("\n");
return0;}
void sayhello()
1.k.n. king 著,呂秀峰 譯. c語言程式設計-現代方法. 人民郵電出版社 C語言宣告
怎樣定義和宣告全域性變數和函式最好。首先,儘管乙個全域性變數或函式可以有多處宣告但是定義卻最多隻允許出現一次,對於全域性變數,定義是真正分配空間並賦初值的宣告,對於函式,定義是提供函式體的宣告。例如 這些是宣告 extern int i extern int f 而這些是定義 int i 1 int...
c語言變數宣告
1.右左法則 int a 整型變數 int a 整型指標變數 int a 整型指標的指標變數 int a 整型陣列 int a 整型指標陣列 int a int 函式指標陣列 2.int fp1 int 10 fp1 是乙個函式指標變數,指向乙個形參為int 返回值為陣列指標,該指標指向乙個整型指標...
C語言基礎宣告
int a a是乙個變數 呼叫返回 賦值 型別為int int a a是乙個變數 返回型別為指標 a返回型別為int int a a是乙個變數 返回型別為指標 a返回型別為指標 a返回型別為int int a a是乙個變數 返回型別為指向陣列指標 a返回陣列某乙個int int a a是乙個變數 返...