【C語言】類型限定詞
ANSI C 的類型限定詞有const、volatile以及restrict三個,以下分別介紹三個限定詞:
1、類型限定詞const
(1)、如果變量中帶有const關鍵字,則該變量無法進行賦值、增量及減量運算來修改改變量的值。
例如: const int nochange; //把nochange限定為常量
nochange = 12; //不允許
但是可以初始化:const int nochange = 12; //這是允許的
(2)、在指針和參量中使用const:
1 const float * pf; //pf可以改變,但pf指向的值不可改變 2 float* const pf; //pf只能指向一個唯一的地址,不可改變,但pf指向的值可以改變 3 const float * const pf; //pf與pf指向的值都不可改變
結論: 當 * 在const之前,意思是不變的是pf,也就是一個常量指針,表示pf不可變,pf指向的值可變;
當 * 在const之後,意思的是不變的是(*pf),所以pf可變,但pf所指向的值不可變。
(3)、對全局變量使用const:有兩種情況
a、在一個文件中定義聲明,在另一個文件中進行引用聲明(關鍵詞extern):
1 //file1.c 定義一個全局常量 2const double PI = 3.14 3 const char * MONTHS[12] = 4 {"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"}; 5 6 // file2.c 使用在其他文件中定義的全局常量 7 extern const double PI; 8 extern const * MONTHS[];
b、將常量放在一個include文件中,這是必須使用靜態外部存儲類:
1 //constant.h 定義一些全局常量 2 static constdouble PI = 3.14 3 static const char * MONTHS[12] = 4 {"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"}; 5 6 // file1.c 使用在其他文件中定義的全局常量 7 #include "constant.h" 8 9 // file2.c 使用在其他文件中定義的全局常量 10 #include "constant.h"
註:使用頭文件的好處就是不必惦記著在一個文件中進行定義聲明,在下一個文件中進行引用聲明:全部文件都包含在一個頭文件中;缺點就是在於復制數據,若數據很大,這就回造成問題了
2、類型限定詞volatile:
限定詞volatile告訴編譯器,該變量除了可被程序改變外,還可以被其他代理改變。
一個值可以同時被const和volatile修飾,表示不能由程序改變,但是可以被其他代理改變:
例如:volatile const int loc; //volatile和const 的順序無所謂
3、類型限定詞restrict:
關鍵字restrict允許編譯器優化某幾種代碼以增加計算支持;它只可用於指針,並表明指針是訪問一個數據對象的唯一且初始的方式。
例如:int * restrict restar = (int *) malloc(10 * sizeof(int)); //指針restar是訪問malloc()分配內存的唯一且初始化的方式
例如:
1 int arr[10];int * par = arr; 2 for (n = 0; n < 10; n++){ 3 restar[n]+=5; 4 arr[n]+=3 5 restar[n]+=3; 6 par[n]*=2; arr[n]+=5; 7 }
其中restar是訪問它所指數據塊的唯一初始方式,所以可以用 restar[n]+=8代替。但是arr就不能,因為它不能確定有沒有其他的指針改變了該處的值。
【C語言】類型限定詞