go語言指標符號的*和&

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

先看一段代碼

先放一段代碼,人工運行一下,看看自己能做對幾題?

package mainimport "fmt"func main() {    var a int = 1     var b *int = &a    var c **int = &b    var x int = *b    fmt.Println("a = ",a)    fmt.Println("&a = ",&a)    fmt.Println("*&a = ",*&a)    fmt.Println("b = ",b)    fmt.Println("&b = ",&b)    fmt.Println("*&b = ",*&b)    fmt.Println("*b = ",*b)    fmt.Println("c = ",c)    fmt.Println("*c = ",*c)    fmt.Println("&c = ",&c)    fmt.Println("*&c = ",*&c)    fmt.Println("**c = ",**c)    fmt.Println("***&*&*&*&c = ",***&*&*&*&*&c)    fmt.Println("x = ",x)}

解釋

理論

&符號的意思是對變數取地址,如:變數a的地址是&a
*符號的意思是對指標取值,如:*&a,就是a變數所在地址的值,當然也就是a的值了

簡單的解釋

*和 & 可以互相抵消,同時注意,*&可以抵消掉,但&*是不可以抵消的
a*&a是一樣的,都是a的值,值為1 (因為*&互相抵消掉了)
同理,a*&*&*&*&a是一樣的,都是1 (因為4個*&互相抵消掉了)

展開

因為有
var b *int = &a
所以
a*&a*b是一樣的,都是a的值,值為1 (把b當做&a看)

再次展開

因為有
var c **int = &b
所以
**c**&b是一樣的,把&約去後
會發現**c和`
b是一樣的 (從這裡也不難看出,cb也是一樣的) 又因為上面得到的&ab是一樣的 所以**c&a是一樣的,再次把*&約去後**ca`是一樣的,都是1

不信你試試?

公布結果

啟動並執行結果內的地址值(0xc200開頭的)可能會因不同機器運行而不同,你懂的

$ go run main.go a     =     1&a     =     0xc200000018*&a     =     1b     =     0xc200000018&b     =     0xc200000020*&b     =     0xc200000018*b     =     1c     =     0xc200000020*c     =     0xc200000018&c     =     0xc200000028*&c     =     0xc200000020**c     =     1***&*&*&*&c     =     1x     =     1

兩個符號抵消順序

*&可以在任何時間抵消掉,但&*不可以被抵消的,因為順序不對

fmt.Println("*&a\t=\t",*&a)  //成功抵消掉,列印出1,即a的值fmt.Println("&*a\t=\t",&*a)  //無法抵消,會報錯

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.