看板 C_and_CPP 關於我們 聯絡資訊
開發平台(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
diabloevagto:1-2會過啊,沒什麼問題 01/21 13:14
Keitaro:1-2會過沒錯阿,我註解Valid不是嗎?是其他三個不會過 01/21 13:24
BlazarArc:"p永遠指向n的位址,無法改變" 是 int* const 吧 01/21 13:57
BlazarArc:const int* p 是指向const int的const int*型態的變數p 01/21 13:58
翻了一下書,感謝B大糾正我的觀念錯誤。 原來p不是const,*p才是const。
sardine:畫圖來看 把address跟data都標出來 對你理解會有幫助 01/21 13:58
好的。
BlazarArc:2-2 assign &(const int*) 到 int** 就不安全 01/21 13:59
compiler是給這樣的訊息 2-1 無法由int**轉換為const int** 2-2 無法由const int**轉換為int**
sardine:有一部份的問題 以你自己的compiler實測結果為準 01/21 13:59
sardine:換個編譯器很可能就不同了 01/21 14:00
jackace:我不知道你說的reject是甚麼 但2-1,2-2gcc只是給warning 01/21 15:01
抱歉,我沒說清楚。我指的是VC2013發出error,不是warning。 ※ 編輯: Keitaro 來自: 1.169.81.145 (01/21 16:00)