C++ 指針與const的組合複習

因爲最近在筆試的時候遇到C++中的指針使用,頭疼的很。今天剛好又重新溫固了一下C++的指針和const的組合,現在將看到的知識重新梳理一下。


一、const變量


我們知道,在C++中,const是經常使用到的一個關鍵字。因爲使用它可以提高系統的安全性和程序員編程的可靠性。被const修飾的符號說明是常量,即不可變的。一般來說const在C++中的使用有以下的組合:
1. const與一般的變量(除指針)
2. const與指針(比較複雜)
3. const與函數參數和返回值
4. const與類成員(數據成員和函數成員)

其實第一種和第三種、第四種都比較好理解,就是被修飾的值是一個常量,在編譯期間就確定了的,在運行期間是無法改變的。
照理來說,第二種,const與指針也是這個關係,只是說一方面指針和const的聲明比較讓人眼花繚亂;另外方面就是指針比較特殊,它本身就是一個變量,變量內部裝的是另一個變量的“地址”,地址呢本來就是一個固定的值,所以就比較混亂。

二、const與指針


對於這個問題,我覺得首先要把指針變量和對象變量搞清楚。指針本身是一個變量,對象本身是一個變量,兩者內存空間是不一樣的,只是說指針通過存儲對象變量的地址,然後將兩者聯繫起來。弄清楚了這個,那麼理解起來就會方便很多,也就可以分開看了。
注意: * 是間接取地址符,表示將該指針所存儲的地址的內容取出來。

int a = 10;
int * p = a;
printf("%d%d",p,&a);  //輸出的是同一個地址 
printf("%d%d",*p,a);  //輸出的是同一個數
printf("%d",&p);         //輸出的是p的地址

const與指針的組合有以下三種:

 (1):指向常量的指針———— const int *p;
 (2):常指針     ———— int * const pc = "a";
 (3):指向常量的常指針———— int const * const pc = "a";

上面的形式中,以 * 間接取址符爲邊界,左邊的const(與int的位置左右都可以)修飾的是所指向的變量是否是常量,右邊的const修飾的是指針是否是常量。

總結來說:指針本身是一個變量,所指向的對象是另一個變量。因此左邊的const修飾的是所指對象的可變性,右邊的const修飾的是指針的可變性。


(1)指向常量的指針


這裏的const限定的是所指向的對象是一個常量。而該處的指針是可以指向常量也可以指向變量的,即指針本身沒有被限定。
理解了上面那句話,我們再看看下面的僞代碼:

int const a = 10;//常量在申明的同時就要初始化
int const * p = a; //此處p就是一個指向常量的指針
char * p1 = "abcde"; //雖然沒有申明const,因爲"abcde"字符串本身就是常量,存儲在常量區,因此這裏的p也是指向常量的指針。
*p = 3;   //錯誤,*p是一個常整型,因此不能修改;
*p1 = "aqw"; //錯誤,*p是一個常字符串常量,不能修改;

上面的例子說明了常量的不可變性。下面再看看指針的可變性:

char * p = "avcsd";//申明瞭一個指向常量字符串的指針;
char a[] = "asdfw";//數組中的字符串是一個可變字符串,存在棧中
p = a;   //改變了p的指向,p指向了一個新的字符串

通過上面兩段僞代碼的說明,我們把指針變量和對象變量分開來看的話,那麼就會很清晰了。兩者並不干擾對方的規則,都是遵從const下的各自的規則。


(2)常指針


這裏的常指針就是對指針來說的了,該指針是一個常量,它在定義的時候就要初始化,但是它指向的對象就沒有規定,可以是常量也可以是變量。也就是說,指針是不能變的,但是對象是可以變的。
我們來看一看指針的不可變:

int * const p = 3;   //該常指針,指向了一個整型數3
p = 4;        //錯誤,不能修改指針的內容,即指針指向的地址不能被修改

再來看一看變量的可變:

int a = 3;   //一個可變的整型
const int b = 4; //一個不可變的整型;
int * const p = a;  //這裏常指針p指向了一個可變的整型
int * const p1 = b; //這裏常指針p1指向了一個常量不可變的整型

看了上面兩個對比之後,其實也清晰了,這裏的const是對指針加以限定的。它限定了指針裏面的內容是一個常量,是不能被重新賦值的。在開始定義(編譯期間)的時候就已經定下來了。


(3)指向常量的常指針


理解了上面兩個之後,這裏也就很好理解了。顧名思義,就是指針和對象兩者都是一個常量,也就是兩着都不能被改變,都需要在編譯期確定。
我們來看看它的定義代碼:

const char * const pc = "asdg"; //前面的const可以不要,因
                                //爲"asdg"字符串本就是一個常量。
pc[3] = 'a';   //錯誤,指針指向的是常量,p[3]是'g','g'是不可修改的
pc = "sdfw";   //錯誤,指針是一個常量,其內容(即指向)是不能改變的

三、總結


總結一下,對於const和指針,只要把指針變量和對象變量分開看,各自被const修飾,那麼就不會混淆。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章