**簡介** --- + 指標(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很像,但不能參照其他變數 :::