const 和 volatile 指標
const 和 volatile 關鍵字會變更指標的處理方式。 const
關鍵字會指定初始化之後無法修改指標;指標之後會受到保護,免于修改。
volatile
關鍵字會指定與下列名稱相關聯的值,可由使用者應用程式中以外的動作修改。 因此, volatile
關鍵字適用于在共用記憶體中宣告物件,這些物件可由多個進程或全域資料區域用來與插斷服務常式通訊。
當名稱宣告為 volatile
時,編譯器會在每次程式存取時,從記憶體重載值。 這將可大幅減少進行最佳化的次數。 不過,當物件的狀態可能遭到意外變更時,它仍是確保可預測程式效能的唯一方式。
若要將指標指向的物件宣告為 const
或 volatile
,請使用表單的宣告:
const char *cpch;
volatile char *vpch;
若要宣告指標的值,也就是儲存在指標 const
volatile
中的實際位址,請使用 或 格式的宣告:
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
的指標,或 做為 和 volatile
的 const
混合,遵守相同的規則。
const
物件的指標通常用於函式宣告,如下所示:
errno_t strcpy_s( char *strDestination, size_t numberOfElements, const char *strSource );
上述語句會宣告函式, strcpy_s,其中三個引數中有兩個 屬於 的型別指標 char
。 由於引數會以傳址方式傳遞,而不是以傳值方式傳遞,因此函式可以自由修改, strDestination
strSource
如果未 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;
}
另請參閱
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應