這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
指標的定義
A pointer is a value that points to the memory address of another variable.
指標是一個指向另一個變數記憶體位址的值。
樣本 1
package mainimport ( "fmt")func main() { a := 200 b := &a fmt.Println("a -->", a) fmt.Println("*b -->", *b) fmt.Println("&a -->", &a) fmt.Println("b -->", b) *b++ fmt.Println("a -->", a) fmt.Println("*b -->", *b)}
- 變數 a 的值是 200,變數 b 的值就是變數 a 的記憶體位址。b 就是一個指標,它指向 a 所在的記憶體位址。
*b++ 是對變數 b 指向的記憶體位址取值後再對該值加 1,即變數 a 的值加 1,執行結果如下:
a --> 200*b --> 200&a --> 0xc4200160b0b --> 0xc4200160b0a --> 201*b --> 201
樣本 2
package mainimport ( "fmt")type packet struct { id int size int}var ( p packet q *packet)func main() { p = packet{ id: 1, size: 2, } q = &p fmt.Println("p -->", p) fmt.Println("q -->", q) fmt.Println("*q -->", *q) fmt.Println("&p -->", &p) fmt.Println("&q -->", &q) fmt.Println("p.size -->", p.size) fmt.Println("(*q).size -->", (*q).size) fmt.Println("q.size -->", q.size)}
首先定義了一個結構類型 packet,又聲明了兩個變數 p 和 q,p 是一個普通 packet 結構,q 則是一個 packet 類型的指標。
初始化 p,q 的值是 p 的地址,即 q 是一個指向 p 記憶體位址的指標。
執行結果如下:
p --> {1 2}q --> &{1 2}*q --> {1 2}&p --> &{1 2}&q --> 0x113e040p.size --> 2(*q).size --> 2q.size --> 2
- 從執行結果可以看出,q 的值是對 p 進行取地址操作。
*q 是對 q 指向的記憶體位址取值,即 p 的值。
&q 是指標 q 所在的記憶體位址。
- 這裡需要注意的是,
(*q).size 和 q.size 結果一樣。
參考資料:Understand Go pointers in less than 800 words or your money back