C 之指標和常量的使用

2021-10-24 04:31:15 字數 3193 閱讀 2663

指標和const關係的基礎知識(英文更容易理解)

一級指標和const的使用

int

*p;//pointer p to int

intconst

*p;//pointer p to const int

int*

const p;

//const pointer p to int

intconst

*const p;

//const pointer p to const int

需要注意的是以下表達的意思是相同的

const int *p;==int const *p;

const int * const p;==int const * const p;

二級指標和const的使用

int

**p;

//pointer p to pointer to int

int*

*const p;

// a const pointer to a pointer to an int

int*

const

*p;//a pointer to a const pointer to an int

intconst

**p;

// a pointer to a pointer to a const int

int*

const

*const p;

// a const pointer to a const pointer to an int

指標和const的使用

可以令指標指向常量或者非常量,最重要的一點就是指向常量的指標(pointer to const)不能用於改變其所指物件的值,如

const

double pi =

3.14

;double

*ptr =

π//錯誤:ptr是乙個普通指標,不能用於指向常量

const

double

*cptr =

π//正確:cptr可以指向乙個雙精度常量

*cptr =42;

//錯誤:不能修改*cptr的值

在使用const指標(即常量指標)時,必須首先對其進行初始化,一旦初始化完成,則它的值(也就是存放在指標中的那個位址)就不能再改變了,把*放在const關鍵字之前用以說明指標是乙個常量,即不變的是指標本身的值而非指向的那個值,所以常量指標可以指向非常量變數,例如

int errnum =0;

int*

const curerr =

&errnum;

//curerr將一直指向errnum

頂層const和底層const

理解了第2點就很容易理解頂層和底層const了,都是對指標和常量而言的:

頂層const:指標本身是乙個常量。

底層const:指標所指向的物件是乙個常量

更廣泛的來說,頂層const可以表示任意的物件是常量,適用於任何資料型別;底層const則與指標、引用等復合型別的基本型別部分有關。例如

int i =0;

int*

const p1 =

&i;//不能改變p1的值,這是乙個頂層const

const

int ci =42;

//不能改變ci的值,這是乙個頂層const

const

int*p2 =

&ci;

//可以改變p2的值,這是乙個底層const

const

int*

const p3 = p2;

//右邊的const是頂層const,左邊的是底層const

在函式傳參中const的形參和實參轉換

當用實參初始化形參時會忽略掉頂層const。換句話說,形參的頂層const會被忽略掉。當形參有頂層const時,傳給它常量物件或者非常量物件都是可以的,如以下函式既能傳以惡搞常量i也能傳乙個非常量i,但是不能不能在函式中進行修好:

void

func

(const

int i)

乙個栗子用於理解

classa;

voidf(

const a *

*p)voidg(

const a *

const

*p)voidk(

const a *

&p)int

main()

執行上面的**可以看到f函式是錯誤的,報錯是error: invalid conversion from 『a**』 to 『const a**』

對於k函式來說,很簡單,形參就是乙個const a*型別的引用,實參ca可以用於初始化該形參,k執行正常

對於f函式來說,它的形參是乙個二級指標p,更細緻的解釋:非常量指標p指向乙個非常量指標,被指向的非常量指標又指向乙個常量a(a pointer to a pointer to a const a),細想一下就可以發現問題所在了,第二個指標是非常量的,它不能用於指向乙個常量物件a,所以問題就處在這裡

對於g函式分析下來和f函式同理,在這裡就不再贅述了。

更複雜的一些例子,比如說

a *

**p;

//正確

const a *

** p;

//錯誤

const a *

*const

*p;//錯誤

const a *

const

*const

*p;//正確

a *const

*const

*p;//正確

a *const

**p;

//錯誤

按照上面的規律其實很容易就分析出對錯,最主要的一點就是普通指標不能用於指向常量物件

C 之指標常量和常量指標區別

總結int a 1 整型變數 const int b 2 常量 intconst b 2 這裡定義和上面定義是乙個意思,建議按照上面的規範寫 int p 普通整型指標 p a 另一種形式,意思與上兩句定義完全一樣,只是為了和指標常量對比 int p a p 2 可以更改指標指向變數的值,相當於變數a...

c 指標常量 和 常量指標

指標常量 指向常量的位址,不允許改變指向位址,指向位置的變數值能被改變 p不可以變 const p 常量指標 指向常量的指標,指標指向的物件不能通過這個指標來修改,可是仍然可以通過原來的宣告修改,也就是說量指標可以被 賦值為變數的位址,之所以叫做常量指標,是限制了通過這個指標修改變數的值 cont ...

C 指標常量和常量指標

首先在c 目前我看到的型別宣告方式,該變數的型別都是由最後幾個字來確定,前面是定語,修飾詞。有其他不同的歡迎指出,共同學習 比如 指標陣列 是陣列,陣列裡存的是指標。陣列指標 是指標,指標指向陣列。所以指標常量 首先是常量,然後是乙個指標,即是該指標是乙個常量,指標的值即位址不會變。常量指標 首先是...