Golang入門教程(十五)指標

2021-09-08 20:11:52 字數 4299 閱讀 2327

指標是乙個變數,用於儲存另乙個變數的記憶體位址。

在上面的例子中,變數b的值是156,儲存在記憶體位址0x1040a124。 變數a包含b的位址。 可以說現在a指向b。

指向型別t的指標用*t表示

讓我們寫一些**。

package main

import (

"fmt"

)func main()

&運算子用於獲取變數的位址。 在上面的程式中,我們將b的位址賦給乙個型別為* int的型別。 據說現在a指向b。 當我們在a中列印該值時,b的位址將被列印。 這個程式輸出

[running] go run "d:\goproject\src\golang-study-line\basic-02\basic_pointer_01.go"

type of a is *int

address of b is 0xc042054080

你可能會得到乙個不同的b位址,因為b的位置可以在記憶體中的任何地方。執行兩次得到的結果  

[running] go run "d:\goproject\src\golang-study-line\basic-02\basic_pointer_01.go"

type of a is *int

address of b is0xc042054080[done] exited with code=0 in 11.167 seconds

[running] go run "d:\goproject\src\golang-study-line\basic-02\tempcoderunnerfile.go"

type of a is *int

address of b is0xc04200e098[done] exited with code=0 in 0.954 seconds

指標的零值為 nil。

package main

import (

"fmt"

)func main()

} 

[running] go run "d:\goproject\src\golang-study-line\basic-02\basic_pointer_02.go"

b is b after initialization is 0xc042054080

[running] go run "d:\goproject\src\golang-study-line\basic-02\basic_pointer_02.go"

b is b after initialization is 0xc042054080

如何引用指標意味著訪問指標指向的變數的值。 * a是尊重a的語法。

讓我們看看這是如何在程式中起作用的。

package main  

import (

"fmt"

)func main()

在上述程式的第10行中,我們引用並列印它的值。 如預期的那樣,它列印出b的值。 該程式的輸出是

[running] go run "d:\goproject\src\golang-study-line\basic-02\basic_pointer_03.go"

address of b is 0xc042054080

value of b is 255

讓我們寫乙個更多的程式,我們使用指標改變b中的值。

package main

import (

"fmt"

)func main()

在上面的程式中,我們將a指向的值增加1,這將b的值從a改變為b。 因此b的值變成256.程式的輸出是  

[running] go run "d:\goproject\src\golang-study-line\basic-02\basic_pointer_04.go"

address of b is 0xc04200e098

value of b is 255

new value of b is 256

package main

import (

"fmt"

)func change(val *int)

func main()

在上面的程式中,在第4行號。 我們將指標變數b傳遞給函式改變。 內部轉換函式中,使用第8行中的解除引用來更改a的值。該程式輸出,  

[running] go run "d:\goproject\src\golang-study-line\basic-02\basic_pointer_05.go"

value of a before function call is 58

value of a after function call is 55

不要將指向陣列的指標作為引數傳遞給函式。 改用切片。

讓我們假設我們想對函式內的陣列進行一些修改,並且呼叫者應該可以看到函式內對該陣列所做的更改。 這樣做的一種方式是將指向陣列的指標作為函式的引數。

package main

import (

"fmt"

)func modify(arr *[3]int)

func main()

modify(&a)

fmt.println(a)

}

在上面的程式中的第3行號,我們將陣列a的位址傳遞給修改函式。 在修改函式的第8行中,我們取消引用arr並將90分配給陣列的第乙個元素。 這個程式輸出 

[running] go run "d:\goproject\src\golang-study-line\basic-02\tempcoderunnerfile.go"

[90 90 91]

a [x]是(* a)[x]的簡寫。 所以上述程式中的(* arr)[0]可以用arr [0]代替。

讓我們用這種簡寫語法重寫上述程式。 

package main

import (

"fmt"

)func modify(arr *[3]int)

func main()

modify(&a)

fmt.println(a)

}

這個程式也輸出

[running] go run "d:\goproject\src\golang-study-line\basic-02\basic_pointer_07.go"

[90 90 91]

雖然這種將指向陣列的指標作為引數傳遞給函式並對其進行修改的方式很有效,但這並不是在go中實現此功能的慣用方式。 我們可以使用切片。

讓我們用切片重寫相同的程式。  

package main

import (

"fmt"

)func modify(sls int)

func main()

modify(a[:])

fmt.println(a)

}

在上述程式的第13行中,我們將乙個切片傳遞給修改函式。 切片的第乙個元素在修改函式中更改為90。

這個程式輸出  

[running] go run "d:\goproject\src\golang-study-line\basic-02\basic_pointer_08.go"

[90 90 91]

所以避免傳遞指向陣列的指標,使用切片代替它。 這段**更乾淨並且是慣用的go

go不支援指標算術

go不支援c語言等其他語言中的指標運算。

package main

func main()

p := &b

p++}

上面的程式會丟擲編譯錯誤

[running] go run "d:\goproject\src\golang-study-line\basic-02\basic_pointer_09.go"

# command-line-arguments

basic-02\basic_pointer_09.go:6:6: invalid operation: p++ (non-numeric type *[3]int)

參考:

Golang入門教程(十五)指標

指標是乙個變數,用於儲存另乙個變數的記憶體位址。在上面的例子中,變數b的值是156,儲存在記憶體位址0x1040a124。變數a包含b的位址。可以說現在a指向b。指向型別t的指標用 t表示 讓我們寫一些 package main import fmt func main 運算子用於獲取變數的位址。在...

Golang教程 (十五)指標

這是本golang系列教程的第十五篇。指標是儲存乙個變數的記憶體位址的變數。在上圖中,變數b的值是156,儲存在位址為0x1040a124的記憶體中。變數a儲存了變數b的位址。現在可以說a指向b。指向型別t的指標用 t表示。讓我們寫一些 package main import fmt func ma...

c 入門教程 十五

好久沒敲黑板了 前方高能預警 今天的內容可能有些繞,但是,蠻有用的。至少,好玩。前面我們說過,宣告乙個變數,相當於在記憶體中要了一塊空間。不同型別的變數要的空間的大小是不一樣的。既然有了空間,那麼,它就有個開始的位置 比如學校就有門牌號 我們用符號 來獲取乙個變數的位址。用法如下 要獲取首位址的變數...