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

2021-09-08 23:29:29 字數 1583 閱讀 5325

---------------------------------

1)先看const常量的情況:

const int a=2;

int const b=c; // c是已經宣告過的整型

兩者都可以。本地的const常量必須在第一次宣告時就初始化,用變數或常量初始化都可以,只是初始化一次以後它的值就不能再改變了,此所謂const的含義。

2)接著看指向常量的指標:

const int *pa;

int const *pa;

兩者也等價。因為指向常量的指標有時候會指向常量,所以它具有這個性質:「不能靠解引用改變它指向的物件的值」,以此保護它所指向的常量的常量性:

*pa =d; // 不可行(d是已經宣告過的整型)

但指標本身的值是可變的:

pa=& d; // 可行(d是已經宣告過的整型)

而且指向常量的指標有時候也會指向變數,如下:

int t,u;

const int *pa;

pa =&t; //可行,指向變數t

pa =&u; //也可行,指向變數u

我們可以把它理解成:「為了指向常量而發明的指標」,這樣比較貼切。

3)然後看常量指標的情況:

int *const pa =&n; // n是之前已經宣告過的整型變數,注意必須是變數,理由見下

「常量指標」即指標本身的值是常量,但「能靠解引用改變它指向的物件的值」,如下:

pa=&d; // 不可行(d是已經宣告過的整型)

*pa =d; // 可行(d是已經宣告過的整型)

因為常量指標也是一種const常量,所以它同樣必須在第一次宣告時就初始化,不過它的初始值縮小為只能是變數(的位址),因為只有變數才能確保以後能靠解引用而改變它指向的物件的值。這使得常量指標不象一般的const常量,用變數或常量初始化都可以。

也就是說,常量指標反而總是指向變數的。

4)最後,是前面兩者的結合:指向常量的常量指標

const int *const c=&e; //e是已經宣告過的整型,整型常量或整型變數都可以

把它理解成乙個普通的const常量,同時被剝奪了「靠解引用改變它指向的物件的值」的性質的就行。

5)關於記憶技巧:

對於區分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中推薦的劃線分左右法更好記。

另2:const和typedef在一起時容易讓人陷入陷阱,具體見《typedef的用途和陷阱》。

const指標和指向常量的指標

1.const int p 2.const int p 3.int const p 4.int const p 5.const int const p 6.int const const p 乙個簡便方法 從由往左讀,遇到p就替換為 p is a 遇到 就替換為 point to 其餘不變。1.co...

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

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

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

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