→ w0005151: 抱歉因為我實際測試的程式是用double所以這邊打錯了@@02/16 00:07
→ w0005151: 但我輸出看M和*M和&(M[0][0])都是同一個位址耶02/16 00:09
→ w0005151: 若M是指標的指標那M應該要和*M不一樣不是嗎?02/16 00:10
這兩個的差別依然是型態不同
即使指向同一個地方, 型態不同對它們的操作就會有所不同
但只印出值時沒辦法告訴你它的型態是什麼而已
=====
順帶一提, 你上面推文提到指標的指標
這裡正好有一個相關的狀況:
在 C 語言裡, 動態宣告二維陣列基本上會開兩塊空間
一塊是「列指標」陣列, 這陣列會存放指向各列的陣列開頭的指標:
int **matrix = (int **)malloc(sizeof(int *)*3);
int *elements = (int *)malloc(sizeof(int)*(3*5));
for(i = 0; i < 3; i++) matrix[i] = &elements[i*5];
在這種狀況下, 這個 matrix 變數的型態才真正的是「指標的指標」 int **
如果你去印出 matrix 和 *matrix 的值的話會看到你所預期的「不同的值」
但這只是因為 *matrix 會變成往這個列指標陣列裡取值而已
和一開始的 int M[3][3]; 的狀況是完全不同的
=====
cout << char* 的問題
這個是因為自 C 語言以來, 一個 char 指標很多時候是代表一個 C 字串的
尤其對於字串實字 (string literal) 語言規定上它的型態就是 char *
例如寫上 "Hello, World!" 會在程式中劃一塊空間長 14 byte
填入 {'H', 'e', 'l' ,'l', 'o', ',', ' ', 'W', 'o', 'r', 'l', 'd', '!', '\0'}
然後把指向這塊空間的開頭的指標做為這個 literal 的「值」, 其型態為 char *
也因為大多數時候 char * 是指字串, 因此 cout 的 << 就對 char * 變數特別處理
要他看到這種型態的變數時去印出那個指標指向的字串, 而不是指標值本身
--
LPH [acronym]
= Let Program Heal us
-- New Uncyclopedian Dictionary, Minmei Publishing Co.
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.195.39.85
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1455564542.A.B6E.html
推 PhysiAndMath: 受教了 02/16 08:30
推 ss780217: push 02/19 21:33