---
# System prepended metadata

title: 1. 指標(pointer)

---

# 1. 指標(pointer)
	定義:儲存變數的記憶體位置。
```cpp=
int main(){
    int a = 10;
    int * p = &a;
    cout << "a的值:" << a << endl;
    cout << "a的記憶體位置:" << p << endl;
    cout << "從記憶體位置取值:" << *p << endl;
}
```
## new/delete
由於指標是儲存記憶體位置，所以今天必須給他一個記憶體位置，如果沒給就要進行值的轉換，例如以下:(以下為錯誤示範)
```cpp=
int main(){
    int * a;
    *a = 100;
    cout << *a << endl;
}
```
這樣寫的話會出現Runtime Error(記憶體區段錯誤)
所以我們應該利用`new`來配置一個記憶體位置給他
```cpp=
int * a = new int;
cout << "a的記憶體位置:" << a << endl;
*a = 100;
cout << "a的值:" << *a << endl;
```
如果我們今天要把這個記憶體位置釋放，我們使用`delete`，這樣這個記憶體空間就被釋放了
```cpp=
int * a = new int;
cout << "a的記憶體位置:" << a << endl;
*a = 100;
cout << "a的值:" << *a << endl;
delete a;//此記憶體位置被釋放了
cout << *a << endl;
cout << a << endl;
```
## 把指標傳進function
以下為不使用指標來改變一個變數的值
```cpp=
#include <iostream>
using namespace std;
int change(int a){
    a = 0;
    return a;
}
int main(){
    int var = 100;
    cout << "Before change:" << var << endl;//output 100
    var = change(var);
    cout << "After change:" << var << endl;//output 0
    return 0;
}
```
而以下為使用指標來改變當前變數的值
```cpp=
#include <iostream>
using namespace std;
void change_pointer(int * a){
    *a = 0;
}
int main(){
    int var = 100;
    cout << "Before change:" << var << endl;
    change_pointer(&var);
    cout << "After change:" << var << endl;
    return 0;
}
```
我們直接把記憶體空間傳入function裡，這個function是直接改變這個記憶體空間的值，所以這個function不須要回傳，故為`void`
# 參考(reference)
參考就像是一個變數的複製，雖然名稱不同，但擁有相同的記憶體空間
```cpp=
int main(){
    int a = 10;
    int &b = a;
    return 0;
}
```
這邊我補充一下，如果要使用參考來傳入函式會像這樣：
```cpp=
void change(int &data){
    data = 100;
}
int main(){
    int a = 10;
    change(a);
    std::cout << a << std::endl; // output:100
    return 0;
}
```
方式跟傳指標一樣，我們一樣都是傳記憶體位置，這樣可以少了再宣告一次變數。