---
# System prepended metadata

title: Pointer 筆記
tags: [學習筆記, 演算法, 競程, C++]

---

**簡介**
---
+ 指標(Pointer)是**儲存位置**的變數
+ **" * "** 為取值運算子，**" & "** 為取址運算子
+ 宣告
```cpp=
int *ptr1;              //宣告一個int指標
int *ptr2 = nullptr;    //宣告一個int空指標
char *ptr3 = &a;        //宣告一個char指標，其值為變數a的位置
```
+ 指標操作
```cpp=
int a = 0, b = 10;
int *ptr = &a;
(*ptr)++;         //a = 1, b = 10
(*ptr) = 10       //a = 10, b = 10
ptr = &b;         //ptr改指向b
(*ptr)++;         //a = 10, b = 11
```
:::warning
+ 指標要初始化
+ 檢查是否為nullptr
+ 要記得括號，不然容易出錯
:::

**指標和陣列**
---
+ 陣列其實也是指標
```cpp=
int arr[10];
int *ptr1 = arr;       //ptr1指向arr的第一個元素
int *ptr2 = &arr[0];   //ptr2指向arr的第一個元素
```
+ 指標遞增
```cpp=
int arr[10];
int *ptr = arr;        //ptr指向arr的第一個元素
ptr++;                 //ptr指向arr的第二個元素
```
:::warning
維護指標不要指到奇怪的地方
:::

範例試題 [neoj 9999. Easy As F*ck](https://neoj.sprout.tw/problem/9999/)

:::spoiler  程式碼 

```cpp=
char *opchar = ops;
char *opend = ops + opnumber - 1;
while (opchar <= opend)
{
    int temp = *opchar - '0' + 1;
    switch (*opchar)
    {
    	case '>':
    	    if ((cur >= left) && (cur < right))    cur++;
    		opchar ++;
    		break;
    	case '<':
    		if ((cur > left ) && (cur <= right))   cur --;
    		opchar ++;
    		break;
    	case '+':
    		(*cur) ++;
    		opchar ++;
    		break;
    	case '-':
    		(*cur) --;
    		opchar ++;
    		break;
    	case '?':
    		cout << *cur << "\n";
    		opchar ++;
    		break;
        case 48:case 49: case 50: case 51: case 52: 
    	case 53: case 54: case 55: case 56: case 57:
    		opchar += temp;
    		break;
    }
}
cout << *left;
left++;
for (int *i = left; i <= right; i++)
{
   	cout << " " << *i;
}
cout << "\n";
```
:::
**Reference**
---
+ 幫變數取別名
+ 操作參照等同操作變數本身
+ 不占記憶體空間
```cpp=
int a = 0;
int &ref = a;
ref++;            //ref = 1, a = 1;
```
:::warning
reference雖然和pointer很像，但不能參照其他變數
:::