[問題] 指標使用疑問

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

Links booklink

Contact Us: admin [ a t ] ucptt.com