[問題] C++ 的 int [2] 可指派給 int * 不能給 …

看板C_and_CPP (C/C++)作者 (洞房不敗)時間16年前 (2009/06/08 04:23), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/1
想請教關於 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
int nA[3][2]; int (*pA)[2]=nA[1]; 這樣有提示到你嗎
06/08 06:45, 1F

06/08 06:54, , 2F
PU 看錯你的問題了 你已經打出error了 一維比較例外...
06/08 06:54, 2F

06/08 06:57, , 3F
寫出名字可以看成少一維度 A[x]=>* A[x][y]=>(*)[y]
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
記得沒錯的話, declaration 的 '=' 和一般assign 的'=' 不同
06/08 07:25, 4F

06/08 07:26, , 5F
尤其在用pointer declaration 時常會造成混淆
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)
文章代碼(AID): #1AB274Gl (C_and_CPP)
文章代碼(AID): #1AB274Gl (C_and_CPP)