1. 程式人生 > >【C語言】類型限定詞

【C語言】類型限定詞

變量 可變 oct 包含 一個數 sta ans eof 方式

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   定義一個全局常量
2
const 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 const
double 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語言】類型限定詞