C語言指標常量和指向常量的指標

2021-10-09 15:56:31 字數 1669 閱讀 8783

指標常量本質是乙個常量,而用指標修飾它,那麼說明這個常量的值應該是乙個指標。指標常量 的值是指標,這個值因為是常量,所以不能被賦值。因為指標常量是乙個常量,在宣告的時候一定要給它賦初值。一旦賦值,以後這個常量再也不能指向別的位址。下面的例子展示了指標常量不同於指向常量的指標:

int var; // 乙個int型別的物件

int *const c_ptr = &var; // 乙個int型別指標常量

*c_ptr = 123; // 合法:我們可以修改它所引用的物件

++c_ptr; // 錯誤:我們不能修改指標

當乙個指標指向具有 const 限定的物件,稱為指向常量的指標,可以修改該指標的值。然而,只能使用這樣的指標來讀取所指向的物件,但不能修改所指向的物件。因此,指向常量的指標常常被稱為唯讀指標(read-only pointer)。所引用物件本身可以是常量,也可以不是常量。例子如下:

int var; //乙個int型別的物件

const int c_var = 100, // 乙個int型別的常量物件

*ptr_to_const; // 乙個指向常量的指標:指標本身不是常量!

ptr_to_const = &c_var; // 合法:使得ptr_to_const指向c_var

var = 2 * *ptr_to_const; // 合法:等效於var = 2 * c_var

ptr_to_const = &var; // 合法:使得ptr_to_const指向var

if ( c_var < *ptr_to_const ) // 合法:「唯讀」方式獲取

*ptr_to_const = 77; // 錯誤:我們不能使用ptr_to_const修改var,

// 儘管var不是常量

型別修飾符和型別限定符可以以任何順序排列。因此,下面的寫法是合法的:

int const c_var = 100, *ptr_to_const;

賦值表示式 ptr_to_const=&var 必需採用隱式轉換:int 指標值 &var 會自動地轉換成左運算元的型別,也就是指向 const int 的指標。對於與之類似的型別運算元的運算子,編譯器會隱式地將指向某一型別t的指標,轉換為具有更多限定符的型別 t 的指標。

如果想將乙個指標轉換為有較少限定符的型別,必須使用顯式的型別轉換。下面的程式**片段使用前面例子所宣告的變數:

int *ptr = &var; // 乙個指向var的int指標

*ptr = 77; // 合法:ptr 不是乙個唯讀指標

ptr_to_const = ptr; // 合法:隱式地將ptr從指向int的指標

// 轉換為指向int常量的指標

*ptr_to_const = 77; // 錯誤:不能通過乙個唯讀指標修改乙個變數

ptr = &c_var; // 錯誤:不能隱式地將指向int常量的指標轉換

// 為指向int 的指標

ptr = (int *)&c_var; // 合法:顯式的指標型別轉換總是可行的

*ptr = 200; // 嘗試修改c_var:可能會造成執行錯誤

如果編譯器將常量物件 c_var 放置在記憶體中的唯讀區域,那麼最後一條語句將會引發執行錯誤。

C 常量指標 指向常量的指標

常量指標 我們可以將指標宣告為常量指標,這樣指標是不可以改變的,但是指標指向的內容是可以改變。指標中儲存的位址是不可變的 include using namespace std class a void set int x private int i int main 指向常量的指標 我們定義乙個指...

常量指標和指向常量的指標

首先指出乙個錯誤,壓根就不應該有指標常量這個說法。經常聽到有關常量指標和指標常量的討論,也經常見到有關兩者區別的文章,然而,有些文章卻誤導了讀者,他們的結論根本就是錯的。例如關於指標常量和常量指標的討論,結果完全顛倒了 而其他一些文章呢,充其量只是火上加油,讓本來就很複雜的事情變得更加難於理解,例如...

常量指標和指向常量的指標

1 常量指標 指標本身的位址值不可修改,這個值是定義指標的時候確定的,以後不可再改變。定義 int const i new int i是常量,執行i 會出錯 const修飾的是i,所以i不能變。2 指向常量的指標 該指標指向的變數是不可修改的。定義 const int i new int 100 或...