[問題] 指標使用疑問

看板C_and_CPP作者 (藍廳)時間9年前 (2016/02/15 22:29), 編輯推噓3(307)
留言10則, 6人參與, 最新討論串1/2 (看更多)
之前是個只會用matlab的菸酒生 最近因興趣使然開始自學C++,對於指標(pointer)與陣列的配合有些疑問 我非相關科系畢業,目前所學皆為自己估狗跟翻公司圖書館的書得到 因此很怕有觀念搞錯! 還望各位先進指正,非常感謝! 使用平台 VS2010/2012 C++ 陣列為一維的時候,陣列名稱代表此元素第一個的位址 所以可以如下使用 int M[3]={1,2,3}; int *ptr ptr=M; 也等同於: ptr=&M[0]; ptr是一個指向整數型態的指標,所以可以記錄M陣列第一個值(是個整數)的位址 這樣理解沒錯吧? 但陣列變二維的時候就變得有點複雜了 int M[2][3]={{1,2,3},{4,5,6}} int *ptr 此時若讓 ptr=M; 此時會出現錯誤 "型別int(*)[3]的值無法指派至型別double*的實體" 以下是我目前的解釋,也是我想問的內容,請各位幫我看看我的理解對不對 M的型態是int(*)[3] 代表指向具有3個int變數的陣列的指標(這樣解釋不知對不對?) 而int*型態的宣告則沒有限定這個指標指向的陣列具有幾個變數 所以應該用 int (*)[3]型態的指標來指向M 必須要這樣是因為C++在儲存陣列時是以列優先 所以compiler必須先知道一列有幾個變數(即總共有幾行)好判斷哪時該換列 int+1即代表記憶體位址往前 1*3(sizeof(int)) 個bytes,也就是換到下一列 若要使用int *ptr來指向M陣列則必須改成 ptr=&M[0][0] 但是!! 我在C的書上有看到直接讓ptr=M的用法是可以通過的 實際上使用matlab內建的C compiler也是可行的 而且其效果跟ptr=&M[0][0]一模一樣 這是為什麼呢?? C跟C++的基本規則不是應該一樣的嗎? 還是這是不同compiler的問題? 另外補個小問題 char *ch="abc" cout<<ch; 跑出來的竟然是abc而非0018ABC0這種記憶體位址 這是為什麼呢 若將char*換成int*或double*這種 輸出時不加*解參考的話,出來的的確就是位址沒錯 為什麼唯獨char不一樣呢? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.225.116.185 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1455546598.A.7F2.html

02/15 23:30, , 1F
我記得幾個月前有類似的問題 http://goo.gl/qM355p
02/15 23:30, 1F

02/15 23:50, , 2F
為何會出現"..至型別double*的.."? 你沒有用double啊@@
02/15 23:50, 2F

02/15 23:50, , 3F
第一個例子的M是指標;第二個M是指標的指標
02/15 23:50, 3F

02/16 00:07, , 4F
抱歉因為我實際測試的程式是用double所以這邊打錯了@@
02/16 00:07, 4F

02/16 00:09, , 5F
但我輸出看M和*M和&(M[0][0])都是同一個位址耶
02/16 00:09, 5F

02/16 00:10, , 6F
若M是指標的指標那M應該要和*M不一樣不是嗎?
02/16 00:10, 6F

02/16 00:14, , 7F
這就超出我能力範圍了。不過我相信用**ptr=M,ptr[i
02/16 00:14, 7F

02/16 00:14, , 8F
][j] 是可以達到預期的結果的
02/16 00:14, 8F

02/19 10:26, , 9F
1維陣列用1個*,2維陣列當然要用2個*阿
02/19 10:26, 9F

02/19 17:53, , 10F
下面回文講了這邊再推一次, 二維陣列和指標的指標是不同的
02/19 17:53, 10F
文章代碼(AID): #1MmU3cVo (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1MmU3cVo (C_and_CPP)