Re: [問題] 指標使用疑問

作者: LPH66 (-6.2598534e+18f)   2016-02-16 03:28:59
一切的問題都是指標型態
你對 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 * 變數特別處理
要他看到這種型態的變數時去印出那個指標指向的字串, 而不是指標值本身
作者: PhysiAndMath (老師說要愛數學)   2016-02-16 08:30:00
受教了
作者: ss780217 (Wade)   2016-02-19 21:33:00
push

Links booklink

Contact Us: admin [ a t ] ucptt.com