2013/08/28

C/C++ 指標和雙重指標以及三重指標

指標在C語言內是一個很重要的元素,指標可以指到任何的位置,不過要小心使用,能指到記憶體位置,就代表可以透過指標去取得資料以及處理資料

不過有些方法也可以透過指標處理得很乾淨,例如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 = &num;
 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