{%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}]"}