作者Keitaro (動き出す時間...)
看板C_and_CPP
標題[問題] 關於const與pointer
時間Tue Jan 21 12:46:04 2014
開發平台(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)