###### 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