Pointer

指標/ 指针/Pointer

指標

指標是一個變數,用來儲存另一個變數的記憶體位址

& 運算子取得變數的位址

* 運算子來存取儲存在指標所指向的變數中的值

宣告指標

  • 宣告一個型別為 T 的指標 var p *T 指標的零值nil

  • 可用內建new(T)拿到宣告指標,初始值根據type

Go 沒有指標運算

C/C++這些語言支援指標運算。可以遞增/遞減指標來移動到下一個/上一個記憶體位址,可以對指標增加或減去一個整數值,你也可以使用關係運算子 ==<> 等比較兩個指標。

但是Go任何此類運算都會導致編譯時期錯誤。

範例

var p *int
+//指標只能儲存 int 變數的記憶體位址

var p *string
- fmt.Println("p = ", p, "&=", &p) //p =  <nil> 指標的零值為 nil ,不可以印*p=nil

+ person := new(string) //用new拿到宣告指標,初始值根據type
fmt.Println("person:", person, "*=", *person, "&=", &person)
*person = "11"
+ // & 運算子取得變數的位址
+ // * 運算子來存取儲存在指標所指向的變數中的值
fmt.Println("person:", person, "*=", *person, "&=", &person)

- person2 := "string" //非指標
fmt.Println("person2:", person2, "&=", &person2)
- //fmt.Println("person:%v", *person2) //cannot indirect person2

+ person = &person2 //指標是一個變數,可以用來儲存另一個變數的記憶體位址
fmt.Println("person:", person, *person, &person)

+ //如果是指標字串內容比對記得用*比對

ref

指標的指標:指標可以指向任何型別的變數 Go 沒有指標運算?

有圖

Last updated