常量指標和指標常量

2022-07-17 17:18:13 字數 3412 閱讀 9548

c/c++的學習中,有人經常搞不清楚

「常量指標」和

「指標常量

」這兩個概念。其實簡單一點講,

「常量指標

」所指向的位址上的資料是常量,而

「指標常量

」所指向的位址是常量,位址上面的資料是可以變化的。

首先,告訴大家乙個小規則,就是像這樣連著的兩個詞,前面的乙個通常是修飾部分,中心詞是後面乙個詞,怎麼說呢,就像這裡的常量指標和指標常量。

常量指標,表述為

「是常量的指標

」,它首先應該是乙個指標。

常量指標,就是指向常量的指標,關鍵字

const 

出現在*

左邊,表示指標所指向的位址的內容是不可修改的,但指標自身可變。

指標常量,表述為

「是指標的常量

」,它首先應該是乙個常量。

指標常量,指標自身是乙個常量,關鍵字

const 

出現在*

右邊,表示指標自身不可變,但其指向的位址的內容是可以被修改的。

再分開細細說明,常量指標,它是乙個指標,什麼樣的指標呢?它是乙個指向常量的指標,就是說我們定義了乙個常量,比如 

const int 

那麼我們就可以定義乙個常量指標來指向它 

const int *p=&a;

也可以分成兩步,即 

const int *p; p=&a;

p++;

對了,忘了說說它怎麼用,舉個小例子 

int a; int * const p=&a;

也可以分開寫 

const int a=7; const int * const p=&a;

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

:第乙個

1void

main();

3char

*str2=;

4char

* const

ptr1 =str1 ;5//

指標常量--指標本身是常量,指向的位址不可以變化

,但是指向的位址所對應的內容可以變化67

ptr1 =str2; 

//錯誤

因為這是乙個常量指標,改變指向的位址了89

printf("%s \n",*ptr1);10}

1112

13// 

編譯錯誤

error c3892: 'ptr1' : you cannot assign to a variable that is const    

14第二個

1void

main();

3char

*str2=;

4char

* const

ptr1 =str1 ;5//

指標常量--指標本身是常量,指向的位址不可以變化

,但是指向的位址所對應的內容可以變化67

*ptr1 ='a';

// 正確

因為指向的位址的內容是可以變化的89

printf("%c \n",*ptr1);10}

1112

//輸出a13

第三個1

void

main();

3char

*str2=;

4const

char

*ptr1 = str1;5//

常量指標--指向字串常量,所指向的字串內容不能變,但是指向的位址可以變化67

ptr1=str2;

// 正確

因為指向的位址是可以變化的89

printf("%s \n",ptr1);10}

1112

//輸出

hello world

第四個1

void

main();

3char

*str2=;

4const

char

*ptr1 = str2;5//

常量指標--指向字串常量,所指向的字串內容不能變,但是指向的位址可以變化67

ptr1='a';

// 錯誤

因為指向的位址是內容是不可以變化的89

printf("%c \n",ptr1);10}

1112

13//

編譯錯誤

error c2440: '=' : cannot convert from 'char' to 'const char *'

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

指標常量的申明:

const

放在*

和指標名之間

type * const pointer ;

對於區分

const int *pa

和int *const pa

這兩者,

前者中,

const

直接修飾

*(不考慮

int,因為型別在這裡是沒影響的),說明

*(解引用)這種行為具有常量性,即

「不能靠解引用改變它指向的物件的值

」,即指向常量的指標。

後者中,

const

直接修飾

pa,說明

pa本身的值具有常量性,即常量指標。

或者也可以這樣來記憶:

const int a;       // const

常量const int *a; //

指向常量的指標

int *const a=&n; //

常量指標

你在紙上按順序寫下以上三行,記住它們的注釋長度:短——長

——短,

分別對應著:

const

常量、指向常量的指標、常量指標這三種,應該就不會混淆了。

個人認為以上記憶法比《

effective ++

》條款21

中推薦的劃線分左右法更好記。

最後再舉個例子,與迭代器經常在一起用。

若希望迭代器所指向的東西不可變,則需要的是

const_iterator

。例:std::vector<

int>::const_iterator iter = vec.begin();

*iter = 10;

//錯誤,

iter

是常量指標

iter++;

//正確,

iter

本身可變

若希望迭代器本身不可變,指向的內容可變,則可以這樣寫:

const

std::vector<

int>::iterator iter = vec.begin();

*iter = 

10; 

//正確,指標常量

iter++;     

//錯誤,指標本身不可變

指標 常量指標和指標常量

const關鍵字宣告乙個常量,常量宣告後不能修改。類似的,我們可以宣告常量指標 double radius 5 double const pvalue radius pvalue 4 可以修改其中pvalue是乙個常量指標,其宣告和初始化必須在同一條語句中,後面的程式不能為其賦予新的位址。注意,雖然...

常量指標 和 指標常量

在c 的學習中,有人經常搞不清楚 常量指標 和 指標常量 這兩個概念。其實簡單一點講,常量指標 所指向的位址上的資料是常量,而 指標常量 所指向的位址是常量,位址上面的資料是可以變化的。常量指標,表述為 是常量的指標 它首先應該是乙個指標。指標常量,表述為 是指標的常量 它首先應該是乙個常量。指標常...

常量指標和指標常量

定義 具有只能夠讀取記憶體中資料,卻不能夠修改記憶體中資料的屬性的指標,稱為指向常量的指標,簡稱常量指標。宣告 const int p int const p 注 可以將乙個常量的位址賦值給乙個對應型別的常量指標,因為常量指標不能夠通過指標修改內粗資料。只能防止通過指標引用修改記憶體中的資料,並不保...