常量指針、指針常量和指向常量的指針常量


  在C/C++的學習中,有人經常搞不清楚“常量指針”和“指針常量”這兩個概念。其實簡單一點講,“常量指針”所指向的地址上的數據是常量,而“指針常量”所指向的地址是常量,地址上面的數據是可以變化的。

  首先,告訴大家一個小規則,就是像這樣連着的兩個詞,前面的一個通常是修飾部分,中心詞是后面一個詞,怎么說呢,就像這里的常量指針和指針常量。
 
  常量指針,表述為“是常量的指針”,它首先應該是一個指針。常量指針,就是指向常量的指針,關鍵字 const 出現在 * 左邊,表示指針所指向的地址的內容是不可修改的,但指針自身可變。


  指針常量,表述為“是指針的常量”,它首先應該是一個常量。指針常量,指針自身是一個常量,關鍵字 const 出現在 * 右邊,表示指針自身不可變,但其指向的地址的內容是可以被修改的。


  再分開細細說明,常量指針,它是一個指針,什么樣的指針呢?它是一個指向常量的指針,就是說我們定義了一個常量,比如 const int a=7; 那么我們就可以定義一個常量指針來指向它 const int *p=&a; 也可以分成兩步,即 const int *p; p=&a; 那么它有什么作用呢?首先我們來說說常量的屬性,因為我們的指針是指向常量的,常量和變量的變量的不同之處在於我們不能對其內容進行操作,具體說就是修改,而我們的指針是什么,它的內容本身是一個地址,設置常量指針指向一個常量,為的就是防止我們寫程序過程中對指針誤操作出現了修改常量這樣的錯誤,應該如果我們修改常量指針的所指向的空間的時候,編譯系統就會提示我們出錯信息。總結一下,常量指針就是指向常量的指針,指針所指向的地址的內容是不可修改的。

  再來說說指針常量,它首先是一個常量,再才是一個指針。常量的性質是不能修改,指針的內容實際是一個地址,那么指針常量就是內容不能修改的常量,即內容不能修改的指針,指針的內容是什么呀?指針的內容是地址,所以,說到底,就是不能修改這個指針所指向的地址,一開始初始化,指向哪兒,它就只能指向哪兒了,不能指向其他的地方了,就像一個數組的數組名一樣,是一個固定的指針,不能對它移動操作,比如你使用 p++; 系統就會提示出錯。但是它只是不能修改它指向的地方,但這個指向的地方里的內容是可以替換的,這和上面說的常量指針是完全不同的概念。作一下總結,指針常量就是是指針的常量,它是不可改變地址的指針,但是可以對它所指向的內容進行修改。對了,忘了說說它怎么用,舉個小例子 int a; int * const p=&a; 也可以分開寫 int a; int * const p; p=&a;

  當然,你也可以定義個一個指向常量的指針常量,就把上面的兩個綜合一下,表示如下
     const int a=7; const int * const p=&a;

 


     下面看幾個簡單的例子,可以說明他們的區別:
            第一個

 1 void main(){
 2     char *str1={"Hello"};
 3     char *str2={"Hello World"};
 4     char * const ptr1 =str1 ;
 5     //指針常量--指針本身是常量,指向的地址不可以變化,但是指向的地址所對應的內容可以變化
 6 
 7     ptr1 =str2; //錯誤 因為這是一個指針常量,改變指向的地址了
 8 
 9     printf("%s n",*ptr1);
10     }
11 
12 
13 // 編譯錯誤    error C3892: 'ptr1' : you cannot assign to a variable that is const    
14 


第二個

 1 void main(){
 2     char *str1={"Hello"};
 3     char *str2={"Hello World"};
 4     char * const ptr1 =str1 ;
 5     //指針常量--指針本身是常量,指向的地址不可以變化,但是指向的地址所對應的內容可以變化
 6 
 7     *ptr1 ='A';// 正確 因為指向的地址的內容是可以變化的
 8 
 9     printf("%c n",*ptr1);
10     }
11 
12 //輸出  A
13 

第三個

 1 void main(){
 2     char *str1={"Hello"};
 3     char *str2={"Hello World"};
 4     const char *ptr1 = str1;
 5     //常量指針--指向字符串常量,所指向的字符串內容不能變,但是指向的地址可以變化
 6     
 7     ptr1=str2;// 正確 因為指向的地址是可以變化的
 8 
 9     printf("%s n",ptr1);
10     }
11 
12 //輸出 Hello World

第四個

 1 void main(){
 2     char *str1={"Hello"};
 3     char *str2={"Hello World"};
 4     const char *ptr1 = str2;
 5     //常量指針--指向字符串常量,所指向的字符串內容不能變,但是指向的地址可以變化
 6     
 7     ptr1='A';// 錯誤 因為指向的地址是內容是不可以變化的
 8 
 9     printf("%c n",ptr1);
10     }
11 
12 
13 //編譯錯誤    error C2440: '=' : cannot convert from 'char' to 'const char *'
14 

相信從上面四個簡單的例子可以看出他們不一樣的地方把,在這里要請大家注意一下的地方是:

指針常量的申明:const 放在* 和指針名之間 Type * const pointer ;

常量指針的申明:const 放在在 * 左邊。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM