Max Coding blog

指標

2021/06/24

指標(pointer)

定義:儲存變數的記憶體位置。
1
2
3
4
5
6
7
int main(){
int a = 10;
int * p = &a;
cout << "a的值:" << a << endl;
cout << "a的記憶體位置:" << p << endl;
cout << "從記憶體位置取值:" << *p << endl;
}

new/delete

由於指標是儲存記憶體位置,所以今天必須給他一個記憶體位置,如果沒給就要進行值的轉換,例如以下:(以下為錯誤示範)

1
2
3
4
5
int main(){
int * a;
*a = 100;
cout << *a << endl;
}
這樣寫的話會出現Runtime Error(記憶體區段錯誤) 所以我們應該利用new來配置一個記憶體位置給他
1
2
3
4
int * a = new int;
cout << "a的記憶體位置:" << a << endl;
*a = 100;
cout << "a的值:" << *a << endl;
如果我們今天要把這個記憶體位置釋放,我們使用delete,這樣這個記憶體空間就被釋放了
1
2
3
4
5
6
7
int * a = new int;
cout << "a的記憶體位置:" << a << endl;
*a = 100;
cout << "a的值:" << *a << endl;
delete a;//此記憶體位置被釋放了
cout << *a << endl;
cout << a << endl;
## 把指標傳進function 以下為不使用指標來改變一個變數的值
1
2
3
4
5
6
7
8
9
10
11
12
13
#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;
}
而以下為使用指標來改變當前變數的值
1
2
3
4
5
6
7
8
9
10
11
12
#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) 參考就像是一個變數的複製,雖然名稱不同,但擁有相同的記憶體空間
1
2
3
4
5
int main(){
int a = 10;
int &b = a;
return 0;
}
這邊我補充一下,如果要使用參考來傳入函式會像這樣:
1
2
3
4
5
6
7
8
9
void change(int &data){
data = 100;
}
int main(){
int a = 10;
change(a);
std::cout << a << std::endl; // output:100
return 0;
}
方式跟傳指標一樣,我們一樣都是傳記憶體位置,這樣可以少了再宣告一次變數。

by 中和高中 吳振榮
CATALOG
  1. 1. 指標(pointer)
    1. 1.1. new/delete
      1. 1.1.0.0.1. by 中和高中 吳振榮