看板 C_and_CPP 關於我們 聯絡資訊
想請教關於 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
cplusplus:int nA[3][2]; int (*pA)[2]=nA[1]; 這樣有提示到你嗎 06/08 06:45
cplusplus:PU 看錯你的問題了 你已經打出error了 一維比較例外... 06/08 06:54
cplusplus:寫出名字可以看成少一維度 A[x]=>* A[x][y]=>(*)[y] 06/08 06:57
謝謝這位前輩的指導,小弟瞭解了。 我是用下中斷點後,用 Visual C++ 2008 的監看功能去檢查 nA 而得到其資料型態是 int [2] 這個結論。 但實際上,nA的語意應該是等於nA[0]的記憶體位址,即視為 int * 故 int *p = nA; 是正確無誤的。 也就是說,單純去認為 nA 代表 int [2] 不太正確,畢竟如果取出他的值 是會得到一個記憶體位址,而記憶體位址當然不會是陣列。 謝謝
POSIX:記得沒錯的話, declaration 的 '=' 和一般assign 的'=' 不同 06/08 07:25
POSIX:尤其在用pointer declaration 時常會造成混淆 06/08 07:26
這部份的討論就沒看過了,不知道有沒有人可提示相關資訊。 -- 再補充一下結論 (以下 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)