[問題] 指標使用疑問
之前是個只會用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
02/15 23:30, 1F
→
02/15 23:50, , 2F
02/15 23:50, 2F
推
02/15 23:50, , 3F
02/15 23:50, 3F
→
02/16 00:07, , 4F
02/16 00:07, 4F
→
02/16 00:09, , 5F
02/16 00:09, 5F
→
02/16 00:10, , 6F
02/16 00:10, 6F
推
02/16 00:14, , 7F
02/16 00:14, 7F
→
02/16 00:14, , 8F
02/16 00:14, 8F
→
02/19 10:26, , 9F
02/19 10:26, 9F
推
02/19 17:53, , 10F
02/19 17:53, 10F
討論串 (同標題文章)