在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 ...