作者w0005151 (藍廳)
看板C_and_CPP
標題[問題] 指標使用疑問
時間Mon Feb 15 22:29:55 2016
之前是個只會用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
→ overhead: 為何會出現"..至型別double*的.."? 你沒有用double啊@@ 02/15 23:50
推 PhysiAndMath: 第一個例子的M是指標;第二個M是指標的指標 02/15 23:50
→ w0005151: 抱歉因為我實際測試的程式是用double所以這邊打錯了@@ 02/16 00:07
→ w0005151: 但我輸出看M和*M和&(M[0][0])都是同一個位址耶 02/16 00:09
→ w0005151: 若M是指標的指標那M應該要和*M不一樣不是嗎? 02/16 00:10
推 PhysiAndMath: 這就超出我能力範圍了。不過我相信用**ptr=M,ptr[i 02/16 00:14
→ PhysiAndMath: ][j] 是可以達到預期的結果的 02/16 00:14
→ suwako: 1維陣列用1個*,2維陣列當然要用2個*阿 02/19 10:26
推 LPH66: 下面回文講了這邊再推一次, 二維陣列和指標的指標是不同的 02/19 17:53