看板 C_and_CPP 關於我們 聯絡資訊
一切的問題都是指標型態 你對 int (*)[3] 的理解是正確的 之所以不能做 ptr = M 的原因正是因為 int* 和 int (*)[3] 是兩種指標 雖然都是指標, 但指向的東西不一樣 至於是哪裡不一樣這一點, 你也已經理解的差不多了 也因此, 要能做 ptr = M 就要讓 ptr 也宣告成這種指標 宣告法有點醜, 長成這樣→ int (*ptr)[3]; 我沒有實際看過 matlab 的 C compiler 是怎麼回事 不過我想裡面可能是對矩陣有一些處理 使得它能夠被轉成一個 int * 指標, 才能寫出 ptr = M; 這種東西 至於你在推文問的
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