C語言中文網 目錄
首頁 > 編程筆記 > C語言筆記 > 指針 閱讀:1,016

C語言類型限定符

通過類型限定符可以修改聲明中的類型,類型限定符有 const、volatile、restrict 和 _Atomic。聲明中可使用多個類型限定符,它們的順序沒有限制。

類型限定符列表內可以多次出現相同的類型限定符,或者通過限定 typedef 名稱的方式,反復使用同一個限定符。編譯器會忽略重復出現的限定符,將它們視為只出現一次。

各種類型限定符的含義如下:

(1) const
對象的類型如果采用了限定符  const,則該對象就是常量。在定義該對象之后,程序無法修改它。

(2) volatile
對象的類型如果采用了限定符 volatile,則該對象可以被其他進程或事件修改。關鍵字 volatile 告訴編譯器在每次使用該對象值時,都要重新讀取它,即便程序本身自上一次獲取后再沒有修改過它的值。這種限定符通常用于硬件接口編程,以防止變量值被外部事件修改后,未能及時更新。

(3) restrict
限定符 restrict 只適用于對象指針類型。這種類型限定符是 C99 新增加的,用來告訴編譯器,一個被指針所引用的對象,如果它可以被修改,那么只能被 restrict 限定的指針修改,不能被除該指針以外的其他任何方式修改,無論是直接方式還是間接方式。該特性允許編譯器采用特定優化技術,而該技術可能需要 restrict 特性的支撐。編譯器也有可能會忽略限定符 restrict,而不對程序結果造成任何影響。

(4) _Atomic
采用類型限定符 _Atomic 聲明的對象是一個原子對象(atomic object)。數組不能是原子對象。對原子對象的支持是可選的:C11 實現版本中,如果定義了宏 _STDC_NO_ATOMICS_,則表示程序不能聲明原子對象。

編譯器也可以將 const 對象存儲在內存中的只讀區域,但是 volatile 對象不能。如果程序不使用 volatile 對象的地址,也有可能編譯器干脆不為該對象分配內存。

對象如果同時使用了限定符 const 和 volatile,如下例中 ticks 對象所示,它不能被程序本身修改,但可以被其他事件修改,例如時鐘芯片的中斷處理程序:
extern const volatile int ticks;

下面是使用類型限定符聲明的更多示例:
const int limit = 10000;                      // 一個int常量對象
typedef struct { double x, y, r; } Circle;      // 一個結構類型
const Circle unit_circle = { 0, 0, 1 };         // 一個Circle常量對象
const float v[] = { 1.0F, 0.5F, 0.25F };        // 一個具有float常量元素的數組
volatile short * restrict vsPtr;                // 一個限定指針,指向volatile short

對指針類型來說,在星號右邊的類型限定符,其限定的是指針本身,而在星號左邊的類型限定符,其限定的是指針所指向的對象類型。在最后一個示例中,指針 vsPtr 使用限定符 restrict,該指針所指向的對象使用限定符 volatile。

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo