{%hackmd theme-dark %} # 指標 (Pointer) --- ## 儲存變數的位址的變數 ---- #### 範例程式碼 1 ```cpp= #include <iostream> using namespace std; int main(){ int a = 5; int *ptr = &a; //指標宣告方法:型態 *變數名稱; // "&" 為 "位址運算子" 可存取一般變數的位址 cout << *ptr << endl; //會輸出 5 // "*" 不用在宣告時為 "依址取值運算子" return 0; } ``` Line 5:通常會說 "指標ptr指向變數a" --- ## 應用 ---- #### 範例程式碼 2 ```cpp= #include <iostream> using namespace std; void swap(int, int); int main(){ int a = 5, b = 20; cout << a << ' ' << b << endl; swap(a, b); cout << a << ' ' << b << endl; return 0; } void swap(int num1, int num2){ int tmp = num1; num1 = num2; num2 = tmp; return; } ``` 輸出: 5 20 5 20 ---- #### 範例程式碼 3 ```cpp= #include <iostream> using namespace std; void swap(int*, int*); int main(){ int a = 5, b = 20; cout << a << ' ' << b << endl; swap(&a, &b); cout << a << ' ' << b << endl; return 0; } void swap(int* num1, int* num2){ int tmp = *num1; *num1 = *num2; *num2 = tmp; return; } ``` 輸出: 5 20 20 5 ---- ### 函數呼叫原則 ```cpp void swap(int, int); ``` 傳 "值" 呼叫 (call by value) ```cpp void swap(int*, int*); ``` 傳 "址" 呼叫 (call by address) ---- ### 其他應用 1. 資料結構 2. 不只一個回傳值 --- ## 陣列與指標 ---- ```cpp int num[100]; ``` "num" 就是一個指標 存取整個陣列一開始的位址 --- ## 動態記憶體配置 ---- ### new #### 範例程式碼 4 ```cpp= #include <iostream> using namespace std; int main(){ int *ptr = new int; //型態A *指標名稱B = new 型態A; cout << *ptr << endl; // 輸出記憶體殘值 *ptr = 5; cout << *ptr << endl; // 輸出 5 return 0; } ``` ---- ### new 1. 自動配置一塊記憶體 2. 不透過額外宣告一變數 3. 在未釋放前*持續占用記憶體* 4. 陣列方法: ```cpp 型態A *指標名稱B = new 型態A[個數]; ``` ---- ### delete #### 範例程式碼 5 ```cpp= #include <iostream> using namespace std; int main(){ int *ptr = new int; delete ptr; // 釋放 ptr 指向的記憶體 ptr = nullptr; // 將指標 ptr 指向 NULL(空) return 0; } ``` ---- ### delete 1. 後面只能接一個指標 2. 指向 NULL 避免發生錯誤 3. 陣列方法: ```cpp delete[] 陣列名稱; ```
{"metaMigratedAt":"2023-06-15T00:02:01.976Z","metaMigratedFrom":"Content","title":"指標 (Pointer)","breaks":true,"contributors":"[{\"id\":\"e5cad38d-b128-4a77-9e0d-d53dea367946\",\"add\":2166,\"del\":203}]"}
    413 views