C 筆記之一 多級指標的型別轉換問題

2021-10-12 09:53:38 字數 1891 閱讀 1261

在c++標準中,規定了量化飾詞相關的型別轉換規則。在滿足以下條件的前提下,在型別轉換中允許向多級指標的非首級指標型別上新增cv-量化飾詞(const、volatile):

1、指標型別相似。指標具有相同的基型別,並且擁有相同的指涉級數(「*」的個數)。

2、對所有的j > 0,若const存在於「cv1,j」中,那麼const也要存在於「cv2,j」中。(對volatile也有同樣的要求)

3、對所有的j > 0,若「cv1,j」與「cv2,j」不同,那麼對於所有的0 < k < j,都要求const存在於「cv2,k」中。

考慮下面的3級指標:

// 0 <= j <= 3,注釋用cvj表示

int***

const cnnn =0;

// cv0=const, cv1=none, cv2=none, cv3=none

int*

*const

* ncnn =0;

// cv0=none, cv1=const, cv2=none, cv3=none

int*

const

** nncn =0;

// cv0=none, cv1=none, cv2=const, cv3=none

int*

const

*const

* nccn =0;

// cv0=none, cv1=const, cv2=const, cv3 = none

const

int*

** nnnc =0;

// cv0=none, cv1=none, cv2=none, cv3=const

那麼,有下面的結果:

ncnn = cnnn;

// 正確,在j=1時不同(cv1不同),由於不存在0nncn = cnnn;

// 錯誤,在j=2時不同,但是當k=1時,左側cv1不為const,不符合規則3。

nccn = cnnn;

// 正確,j=2時不同,但是左側對於所有的0ncnn = cnnn;

// 正確,在0nnnc = cnnn;

// 錯誤,在j=3時不同,但是當k=0,1時,左側cvk不為const,不符合規則3。

在實際中,上面多級的指標可能比較少見,更常見的是由於表示矩陣的二級指標,下面給出二級指標的轉換表。

int

** nnn =0;

int*

const

* ncn =0;

const

int*

* nnc =0;

const

int*

const

* ncc =0;

int*

*const cnn =0;

const

int*

*const cnc =

0;

那麼,有下面的結果:

ncc = nnc;

// 正確

nnn = cnn;

// 正確

ncc = ncn;

// 正確

ncn = nnn;

// 正確

nnn = ncn;

// 錯誤,不滿足規則2

nnc = ncc;

// 錯誤,不滿足規則2

nnn = cnc;

// 錯誤,不滿足規則2

nnn = nnc;

// 錯誤,不滿足規則2

nnc = nnn;

// 錯誤,不滿足規則3

[1] stephenc.dewhurst, 杜赫斯特, 高博. c++覆轍錄[m]. 人民郵電出版社, 2016.

C 的指標型別轉換

在c 中,指標的型別轉換是經常發生的事情,比如將派生類指標轉換為基類指標,將基類指標轉換為派生類指標。指標的本質其實就是乙個整數,用以記錄程序虛擬記憶體空間中的位址編號,而指標的型別決定了編譯器對其指向的記憶體空間的解釋方式。基於上面的理解,我們似乎可以得出乙個結論,c 中對指標進行型別轉換,不會改...

C語言 詳解多級指標與指標型別的關係

v推論 指標變數的步長只與 指標變數的值 的型別有關 指標的值的型別 指標指向資料的型別 指標型別跟指標的值有關,指標是佔據4個位元組大小的記憶體空間,但是指標的型別卻是各不相同的 指標的型別決定了指標指向的記憶體空間從哪個位置開始,從哪個位置結束 普通變數名是一段記憶體空間的標識,普通變數名代表的...

C語言學習筆記 指向指標的指標 多級指標

在指向指標的指標這一塊,從大一開c語言課的時候就沒弄明白,現在快畢業了,重新拾起c語言,多少是明白了一點 在這塊的介紹上,文字描述太難懂太繞了,咱直接上例子,看 debug一下,看看記憶體和位址的分配情況就差不多能明白了 例項程式 程式輸出 the value of myvar is 12.the ...