作者Feis (永遠睡不著 @@)
看板C_and_CPP
標題Re: [問題] 關於const與pointer
時間Tue Jan 21 17:31:02 2014
這個問題印象中版上很久以前有討論過.
[2-1]
int n = 1;
int *p1 = &n;
const int **p2 = &p1;
// Invalid (const int **) = (int **)
問題是
int ** 是否可轉型為
const int **
答案是不可以. 理由是這樣可能會造成問題:
如果我們允許這個轉型的話則下面都會合法:
const int c = 1;
*p2 = &c;
// (const int *) = (const int *) 合法
*p1 = 10;
// (int) = (const int) 合法
這樣的話因為 p2 指向 p1, 所以 *p2 就是 p1, 而 *p2 = &c 會讓 p1 指向 c
這時 *p1 就是 c, 那 *p1 = 10 會改 c 的值為 10.
最後 c 的值因此會成為 10 而違反一開始 const 的性質.
[2-2]
int n = 1;
const int *p1 = &n;
int **p2 = &p1;
// Invalid (int **) = (const int **)
問題是
const int * 是否可以轉型為
int **
這個問題比較單純.
因為 p1 不只可以指向 n 也可以指向另一個 const 變數, 例如:
const int a = 3;
p1 = &a; // 我們讓 p1 改成指向 a (合法)
**p2 = 10; // 會把 a 改成 10, 這違反 a 是 const 的性質是不應該發生的的
--
我之前有寫過 const 相關的 blog:
http://goo.gl/C58Lv6 (參考第 36 行)
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.29.148
※ 編輯: Feis 來自: 140.112.29.148 (01/21 17:52)
推 Keitaro:超詳細的解說 非常感謝!!! 01/21 18:00
→ Keitaro:小弟先拜讀您的詳解 有問題在回來請版上各位指點^^ 01/21 18:01
推 jackace:int**轉const int**在Ansi C中是合法但unsafe 見n1124.pdf 01/21 18:42
→ Feis:確實, 要考慮是 C 還是 C++ 會有差異 01/21 18:43
→ jackace:6.5.16.1 但C++的有增加rule去禁止 n1905.pdf 4.4 01/21 18:44
→ Feis:不過應該是語言差異而不是實作差異? 01/21 18:45
→ jackace:qualification conversion中第四點的第三項條件導致了此種 01/21 18:45
→ jackace:conversion的禁止 01/21 18:46
→ jackace:對 不是實作差異 是語言差異 01/21 18:46
推 BlazarArc:推 01/22 15:44
→ johnjohnlin: 推~ 02/07 17:56