[問題] 關於const與pointer

看板C_and_CPP作者 (動き出す時間...)時間12年前 (2014/01/21 12:46), 編輯推噓2(207)
留言9則, 5人參與, 最新討論串1/2 (看更多)
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) VC2013 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) No 問題(Question): const修飾字與pointer關係 程式碼(Code):(請善用置底文網頁, 記得排版) 1. pointer/variable 之間使用const 1-1 const int n = 1; int *p = &n; //Invalid 1-2 int n = 1; const int *p = &n; //Valid 2. pointer/pointer之間使用const 2-1 int n = 1; int *p1 = &n; const int **p2 = &p1; //Invalid 2-2 int n = 1; const int *p1 = &n; int **p2 = &p1; //Invalid 補充說明(Supplement): pointer一直是我這種程式新手的痛處,希望版上各位能指點一下小弟迷津。 我希望能找出每一個範例結果的理由, 用以去理解它為何被compiler判定是pass或reject, 而不是死背結果,這並沒有用處。 範例1-1與1-2我是這樣解釋的: 1-1: 變數n已經被宣告為const int,但用一個非const int型態去指向它的位址, 可能導致*p改變n本身的數值。 1-2: n被宣告為int型態,與指向它、型態為const int的*p無關。 *p被宣告為const int,表示p永遠指向n的位址,無法改變。 但是n本身的數值做任何修改,與p無關。若修改n=2,則*p=2。 請問以上我自己的理解是否有錯? 想來版上詢問的是範例2的兩個例子, 尤其是2-2,對照1-2可以,為何2-2不行呢? 可否請版上各位高手解釋它的理由?不勝感激。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 1.169.81.145

01/21 13:14, , 1F
1-2會過啊,沒什麼問題
01/21 13:14, 1F

01/21 13:24, , 2F
1-2會過沒錯阿,我註解Valid不是嗎?是其他三個不會過
01/21 13:24, 2F

01/21 13:57, , 3F
"p永遠指向n的位址,無法改變" 是 int* const 吧
01/21 13:57, 3F

01/21 13:58, , 4F
const int* p 是指向const int的const int*型態的變數p
01/21 13:58, 4F
翻了一下書,感謝B大糾正我的觀念錯誤。 原來p不是const,*p才是const。

01/21 13:58, , 5F
畫圖來看 把address跟data都標出來 對你理解會有幫助
01/21 13:58, 5F
好的。

01/21 13:59, , 6F
2-2 assign &(const int*) 到 int** 就不安全
01/21 13:59, 6F
compiler是給這樣的訊息 2-1 無法由int**轉換為const int** 2-2 無法由const int**轉換為int**

01/21 13:59, , 7F
有一部份的問題 以你自己的compiler實測結果為準
01/21 13:59, 7F

01/21 14:00, , 8F
換個編譯器很可能就不同了
01/21 14:00, 8F

01/21 15:01, , 9F
我不知道你說的reject是甚麼 但2-1,2-2gcc只是給warning
01/21 15:01, 9F
抱歉,我沒說清楚。我指的是VC2013發出error,不是warning。 ※ 編輯: Keitaro 來自: 1.169.81.145 (01/21 16:00)
文章代碼(AID): #1ItVkEN8 (C_and_CPP)
文章代碼(AID): #1ItVkEN8 (C_and_CPP)