const 和 volatile 指標

const volatile 關鍵字會變更指標的處理方式。 const關鍵字會指定初始化之後無法修改指標;指標之後會受到保護,免于修改。

volatile關鍵字會指定與下列名稱相關聯的值,可由使用者應用程式中以外的動作修改。 因此, volatile 關鍵字適用于在共用記憶體中宣告物件,這些物件可由多個進程或全域資料區域用來與插斷服務常式通訊。

當名稱宣告為 volatile 時,編譯器會在每次程式存取時,從記憶體重載值。 這將可大幅減少進行最佳化的次數。 不過,當物件的狀態可能遭到意外變更時,它仍是確保可預測程式效能的唯一方式。

若要將指標指向的物件宣告為 constvolatile ,請使用表單的宣告:

const char *cpch;
volatile char *vpch;

若要宣告指標的值,也就是儲存在指標 constvolatile 中的實際位址,請使用 或 格式的宣告:

char * const pchc;
char * volatile pchv;

C++ 語言會防止指派允許修改宣告為 const 的物件或指標。 這類指派會移除用來宣告物件或指標的資訊,因此違反了原始宣告的用意。 請考慮下列宣告:

const char cch = 'A';
char ch = 'B';

假設上述兩個 物件的宣告( cch const char 類型 為 和 ch ,類型 為 char), 下列宣告/初始化是有效的:

const char *pch1 = &cch;
const char *const pch4 = &cch;
const char *pch5 = &ch;
char *pch6 = &ch;
char *const pch7 = &ch;
const char *const pch8 = &ch;

下列宣告/初始化是錯誤的。

char *pch2 = &cch;   // Error
char *const pch3 = &cch;   // Error

pch2 的宣告會宣告一項指標,但是常數物件可能會透過該指標而遭到修改,因此不允許此宣告。 的 pch3 宣告會指定指標是常數,而不是 物件;因為不允許宣告的相同原因 pch2 ,不允許宣告。

下列八個指派顯示透過指標進行的指派,以及變更上述宣告的指標值;現在,我們可以假設透過 pch1 進行 pch8 的初始化是正確的。

*pch1 = 'A';  // Error: object declared const
pch1 = &ch;   // OK: pointer not declared const
*pch2 = 'A';  // OK: normal pointer
pch2 = &ch;   // OK: normal pointer
*pch3 = 'A';  // OK: object not declared const
pch3 = &ch;   // Error: pointer declared const
*pch4 = 'A';  // Error: object declared const
pch4 = &ch;   // Error: pointer declared const

宣告為 volatile 的指標,或 做為 和 volatileconst 混合,遵守相同的規則。

const物件的指標通常用於函式宣告,如下所示:

errno_t strcpy_s( char *strDestination, size_t numberOfElements, const char *strSource );

上述語句會宣告函式, strcpy_s,其中三個引數中有兩個 屬於 的型別指標 char 。 由於引數會以傳址方式傳遞,而不是以傳值方式傳遞,因此函式可以自由修改, strDestinationstrSource 如果未 strSource 宣告為 const ,則為 。 的 const 宣告 strSource 可確保呼叫端 strSource 無法由呼叫的函式變更。

注意

因為有標準從 typename 轉換成 const typename ** ,所以將 類型的 char * 引數傳遞至 strcpy_s 是合法的。 不過,反向不是 true;不存在隱含轉換,無法從物件或指標中移除 const 屬性。

const指定類型的指標可以指派給相同類型的指標。 不過,無法 const 指派給指標的 const 指標。 下列程式碼顯示正確和不正確的指派:

// const_pointer.cpp
int *const cpObject = 0;
int *pObject;

int main() {
pObject = cpObject;
cpObject = pObject;   // C3892
}

下列範例顯示在您有一個指標指向物件的指標時,如何將物件宣告為常數。

// const_pointer2.cpp
struct X {
   X(int i) : m_i(i) { }
   int m_i;
};

int main() {
   // correct
   const X cx(10);
   const X * pcx = &cx;
   const X ** ppcx = &pcx;

   // also correct
   X const cx2(20);
   X const * pcx2 = &cx2;
   X const ** ppcx2 = &pcx2;
}

另請參閱

指標原始指標