Golang是個允許操作Pointer(指標)的程式語言,常用的用法跟C、C++類似,如下兩種
*與&,在了解之前要先知道一件事情,就是以下要討論的都是記憶體的位址與其儲存的值,我們用資料結構來表示,大概就是這樣
1
2
3
4
| class Memory{
Address address;
Value value;
}
|
*(解引用運算符,Dereference operator)
* 在等號右邊:取得指標所指的記憶體的值
*在等號左邊:宣告一個記憶體,其值為右邊的記憶體位址
- 當作為變數宣告時,代表a的資料型別是個指針型別,a存的是一個記憶體位址
1
2
| int *a = new int (10)
//a本身的地址為0x0001,其儲存的值為0x0010 相當於這樣 Memory(0x0001,0x0010)
|
- 當
*
用於指標前面時,它代表的是 解引用,也就是取得指標所指向的記憶體位置的值。 - 例如,
*a
會返回指標 a
所指向位置的值。
1
2
| cout << a ; //a的值是 0x0010
cout << *a; //*a的值是 10 那個10所存的的記憶體長這樣 Memory(0x0010,10)
|
&(取地址運算符,Address-of operator)
&在等號右邊:拿到變數在記憶體的位址
&在等號左邊:宣告引用,幫某個變數取別名,不佔用新記憶體
取得變數的記憶體地址(&a)
- 當
&
用在變數前面,它表示取得該變數的記憶體地址。 - 這是 取址運算子,其作用是返回變數的地址。
1
2
3
4
5
6
7
| int x = 10; // x Memory(0x0001,10)
int * y = &x; //y Memory(0x0002,0x0001)
int &z = x; // z就是x,x就是z,z 不是一塊新的記憶體,而是 x 那一格的「另一個名字」。
std::cout << y; //印出 0x0001
std::cout << &y; //印出 0x0002
std::cout << *y; //印出 10
|