[問題] C++ 的 int [2] 可指派給 int * 不能給 …
想請教關於 C++ 檢查資料型態的判斷邏輯?
int nA[2] = {1,2}; //nA 資料型態是 int [2]
int *p = nA; //p 資料型態是 int * 且這行可編譯通過,無警告
int (*pA)[2] = nA; //pA 資料型態是 int [2] * 則編譯錯誤
//error C2440: '正在初始化' : 無法由 'int [2]' 轉換為 'int (*)[2]'
--
如下,改成相同的資料型態,都是 int [2] * 後才可通過編譯
int (*pA)[2] = &nA;
--
如果要求很嚴格,規定需完全相同,那 int *p = nA; 就不該沒有錯誤才符合這種邏輯
所以想請詢問其中的細節是? (編譯器為 Visual C++ 2008)
謝謝
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 124.8.129.95
推
06/08 06:45, , 1F
06/08 06:45, 1F
推
06/08 06:54, , 2F
06/08 06:54, 2F
推
06/08 06:57, , 3F
06/08 06:57, 3F
謝謝這位前輩的指導,小弟瞭解了。
我是用下中斷點後,用 Visual C++ 2008 的監看功能去檢查 nA 而得到其資料型態是
int [2] 這個結論。
但實際上,nA的語意應該是等於nA[0]的記憶體位址,即視為 int *
故 int *p = nA; 是正確無誤的。
也就是說,單純去認為 nA 代表 int [2] 不太正確,畢竟如果取出他的值
是會得到一個記憶體位址,而記憶體位址當然不會是陣列。
謝謝
推
06/08 07:25, , 4F
06/08 07:25, 4F
→
06/08 07:26, , 5F
06/08 07:26, 5F
這部份的討論就沒看過了,不知道有沒有人可提示相關資訊。
--
再補充一下結論 (以下 AM 08:42 修文)
1. 以前在版上跟學校都聽過「陣列名稱」=「&陣列名稱」的說法
記憶體位址值上這沒有錯,但是從此例可以看出,資料型態會不同,進而有潛在的
編譯錯誤可能性。
2. 若有 int nAA[3][2]; 則 int *p = nAA; 會錯誤。不像 p = nA; 可通過
應為 int (*pp)[2] = nAA; 或 int (&r)[3][2] = nAA;
規則一般化:
陣列名稱的資料型態,視為兩種 a.本身的陣列 (故r可以等於nAA)
b.減掉一層維度後的指標 (故pp可以等於nAA)
※ 編輯: zlw 來自: 124.8.129.95 (06/08 08:42)
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章