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

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

指針常量本質是一個常量,而用指針修飾它,那么說明這個常量的值應該是一個指針。指針常量 的值是指針,這個值因為是常量,所以不能被賦值。因為指針常量是一個常量,在聲明的時候一定要給它賦初值。一旦賦值,以后這個常量再也不能指向別的地址。下面的例子展示了指針常量不同于指向常量的指針:
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 放置在內存中的只讀區域,那么最后一條語句將會引發運行錯誤。

也可以聲明指向常量的常量指針,如下面函數原型的參數聲明:
void func( const int * const c_ptr_to_const );

該函數的參數是只讀指針,當該函數被調用時該只讀指針參數會被初始化,并且在函數執行過程中保持該值不變。

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

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

底部Logo