不過有些方法也可以透過指標處理得很乾淨,例如Swap
在這邊我大概把之前學得,指標和雙重指標以及三重指標大概寫上來,以免哪天忘記
指標顧名思義就是指標
指標的宣告方式就是在變數前頭加上*,例如:
int *ptr; int * ptr;
將變數加上&可取得到記憶體位置,例如:
int num = 100; int *ptr = #
以上面的例子來說,ptr就是指向num所在的記憶體位置,但ptr也會佔有相同大小的記憶體位置
ptr -> num
雙重指標也只是紀錄著指標以及指標指到的位置,例如:
int num = 100; int *ptr = # int **ptr2 = &ptr;
ptr2 -> ptr -> &num
三重指標也只是記錄著雙重指標內的位置,例如:
int num = 100; int *ptr = # int **ptr2 = &ptr; int ***ptr3 = &ptr2;
ptr3 -> ptr2 -> ptr -> &num
範例:
#include <stdio.h> #include <stdlib.h> int main() { int num = 100; int *ptr = # int **ptr2 = &ptr; int ***ptr3 = &ptr2; printf("num的值 \t%d\n", num); printf("num的位址\t%p\n", &num); printf("透過ptr取得到值 \t%d\n", *ptr); printf("ptr指到num的位址 \t%p\n", ptr); printf("ptr記憶體位址 \t%p\n\n\n", &ptr); printf("透過ptr2取得到num值 \t%d\n", **ptr2); printf("ptr2指到ptr位址 \t%p\n", *ptr2); printf("ptr2指到ptr的記憶體位置 \t%p\n", ptr2); printf("ptr2記憶體位址 \t%p\n\n\n", &ptr2); printf("透過ptr3取得到num值 \t%d\n", ***ptr3); printf("ptr3指到ptr位址 \t%p\n", **ptr3); printf("ptr3指到ptr的記憶體位置 \t%p\n", *ptr3); printf("ptr3指到ptr2的記憶體位置 \t%p\n", ptr3); printf("ptr3記憶體位址 \t%p\n\n\n", &ptr3); system("pause"); return 1; }
執行結果:
用指標時切記要小心指到不該指的,雖然方便,不過在學習上當然還是會很抽象
有錯麻煩大神糾正,謝謝
參考資料:
http://www.slideshare.net/shademoon/08-3475335
http://blog.sina.com.tw/erzengel/article.php?pbgid=115834&entryid=613476
http://openhome.cc/Gossip/CGossip/DoublePointer.html
http://pydoing.blogspot.tw/2010/09/c-ch0611.html
http://nknucc.nknu.edu.tw/~jwu/c/cpgch4.htm
http://www.eskimo.com/~scs/cclass/int/sx8.html
http://stackoverflow.com/questions/5814646/c-double-pointer
http://nknucc.nknu.edu.tw/~jwu/c/cpgch4.htm
圖片資料:
http://ezgo.coa.gov.tw/graph/spots/H_CHINHUA_20081104173334/H_CHINHUA_20081104173334_general_000004s2.jpg