之前是個只會用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不一樣呢?