Re: [問題] 關於const與pointer

看板C_and_CPP作者 (永遠睡不著 @@)時間12年前 (2014/01/21 17:31), 編輯推噓3(308)
留言11則, 5人參與, 最新討論串2/2 (看更多)
這個問題印象中版上很久以前有討論過. [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)

01/21 18:00, , 1F
超詳細的解說 非常感謝!!!
01/21 18:00, 1F

01/21 18:01, , 2F
小弟先拜讀您的詳解 有問題在回來請版上各位指點^^
01/21 18:01, 2F

01/21 18:42, , 3F
int**轉const int**在Ansi C中是合法但unsafe 見n1124.pdf
01/21 18:42, 3F

01/21 18:43, , 4F
確實, 要考慮是 C 還是 C++ 會有差異
01/21 18:43, 4F

01/21 18:44, , 5F
6.5.16.1 但C++的有增加rule去禁止 n1905.pdf 4.4
01/21 18:44, 5F

01/21 18:45, , 6F
不過應該是語言差異而不是實作差異?
01/21 18:45, 6F

01/21 18:45, , 7F
qualification conversion中第四點的第三項條件導致了此種
01/21 18:45, 7F

01/21 18:46, , 8F
conversion的禁止
01/21 18:46, 8F

01/21 18:46, , 9F
對 不是實作差異 是語言差異
01/21 18:46, 9F

01/22 15:44, , 10F
01/22 15:44, 10F

02/07 17:56, , 11F
推~
02/07 17:56, 11F
文章代碼(AID): #1ItZvO1L (C_and_CPP)
文章代碼(AID): #1ItZvO1L (C_and_CPP)