亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么將“指向非const的指針”轉換為“指向const的指針”是不合法的?

為什么將“指向非const的指針”轉換為“指向const的指針”是不合法的?

C++
溫溫醬 2019-07-08 12:37:24
為什么將“指向非const的指針”轉換為“指向const的指針”是不合法的?它是將指針到非Const轉換為指針到Const的合法行為。那么,為什么轉換指向非連續的指針轉到指向Const的指針?例如,為什么下列代碼是非法的:char *s1 = 0;const char *s2 = s1;  // OK...  char *a[MAX]; // aka char **  const char **ps = a; // error!
查看完整描述

3 回答

?
波斯汪

TA貢獻1811條經驗 獲得超4個贊

從標準:


const char c = 'c';

char* pc;

const char** pcc = &pc;   // not allowed

*pcc = &c;

*pc = 'C';                // would allow to modify a const object


查看完整回答
反對 回復 2019-07-08
?
倚天杖

TA貢獻1828條經驗 獲得超3個贊

忽略代碼并回答問題的原則,請參閱comp.lang.c常見問題中的以下條目:為什么我不能將char*傳遞給期望const char*的函數?

不能分配char **值到const char **指針有點模糊。鑒于const存在限定符,編譯器希望幫助您遵守不修改的承諾。const價值。這就是為什么您可以分配一個char *轉到const char *,但事實并非如此:“添加”顯然是安全的。const-指向一個簡單的指針,但把它拿走是危險的。但是,假設您執行了以下更復雜的一系列任務:

const char c = 'x';    /* 1 */char *p1;              /* 2 */const char **p2 = &p1; /* 3 */*p2 = &c;             
 /* 4 */*p1 = 'X';             /* 5 */

在第3行中,我們分配了一個char **轉到const char **..(編譯器應該會抱怨。)在第4行中,我們分配了一個const char *轉到const char *這顯然是合法的。在第5行中,我們修改了char *指向-這應該是合法的。然而,p1最后指向c,也就是const..這發生在第4行,因為*p2是真的p1..這是在第3行中設置的,它是不允許的表單的賦值,這正是不允許第3行的原因。

當你的問題被標記為C+而不是C時,它甚至解釋了const改為使用限定符:

(C+有更復雜的規則來分配Const限定的指針,這些規則允許您在不引起警告的情況下執行更多類型的賦值,但仍然可以防止無意中修改Const值的嘗試。C+仍然不允許分配char **轉到const char **,但它可以讓您通過分配char **轉到const char * const *.)


查看完整回答
反對 回復 2019-07-08
  • 3 回答
  • 0 關注
  • 1231 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號