###### tags: `C/C++` `pointer` # C語言: Pointer 一種指向某個儲存位址的變數。 ## 變數宣告 ``` int *ptr; ``` ``` int a = 10; int *ptr = &a; ``` ### "&": 取址運算子 (Address-of operator) ``` int a = 10; int *ptr = &a; ``` 取出變數a的位址。 ### "*": 取值運算子 (Dereference operator) ``` int b = *ptr; ``` 和宣告一樣是*但出現在等號右邊。 取出ptr所存的記憶體位址的變數值。 ## 針對Pointer賦值 vs. 透過Pointer賦值 ``` string s1("some value"); string *sp1 = &s1; string s2("another"); string *sp = &s2; *sp1 = "new value"; // 透過pointer賦值 // pointer所指的值改變 sp1 = sp2; // 針對pointer賦值 // pointer改指另一物件 ``` ## Pointer初始化 ``` int *ptr = 0; ``` 也可以使用<stdlib.h>定義的NULL預處理器。 在C++叫做<cstdlib>。 ``` int *ptr = NULL; ``` ## Pointer vs. Array Array再宣告時,變數名稱就代表了整個Array開頭的指標。 ``` char a[100]; scanf("%s", a); printf("%s\n", a); ``` 這是為什麼a前面沒加&的原因,因為a是本來就是位址(address)。 所以我們可以用一個Pointer去指住一個Array。 ``` int a[10] = {0,1,2,3,4,5,6,7,8,9}; int* ptr = a; ``` 陣列當作呼叫值傳入function時,是以Pointer的形式傳入: ``` int function(int a[], int n); int function(int* a, int n); ``` ## References: [1] C++ Primer 4/e p.121 [2] http://hackgrass.blogspot.com/2018/03/c-pointerint-foo-int-bar.html [3] https://github.com/htchen/i2p-nthu/blob/master/%E7%A8%8B%E5%BC%8F%E8%A8%AD%E8%A8%88%E4%B8%80/pointer/Pointer.md