Featured image of post 以C++理解Golang指標

以C++理解Golang指標

指哪?

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
Licensed under CC BY-NC-SA 4.0