Golang學(xué)習(xí)筆記-1.16 指針

本文系第十六篇Golang語言學(xué)習(xí)教程

指針是一種存儲變量內(nèi)存地址(memory address) 的變量.


如上圖, 變量b的值為156,b 在內(nèi)存中的地址是 0x1040a124 , 而變量a存儲了b 的地址, 我們就稱a指向了 b.

指針的聲明

指針變量的類型為 *T, 該指針指向一個 T 類型的變量. & 用來獲取變量的地址.
例:

package main

import "fmt"

func main() {
    b := 166   //定義變量 b
    var a *int = &b   //b 的地址賦給 a, 或說 a 指向 b
    fmt.Printf("type of a is %T\n", a)   //打印 a 的類型
    fmt.Println("address of b is ", a)  //打印 a 的值
}

以上程序輸出結(jié)果為:

type of a is *int
address of b is 0xc420082008

指針的零值

指針的零值是nil
例:

package main

import "fmt"

func main() {
    c := 358
    var d *int  //d 初始化為 nil
    if d == nil {
        fmt.Println("b is ",d)
        d = &c  // 給 d 賦值 c 的地址
        fmt.Println("after init b is ", d)
    }
}

以上程序中,可以看到 b 的初始值為 nil.
輸出為:

b is <nil>
after init b is 0xc42008e030

指針的解引用

指針的接引用可以獲取指針指向變量的值, 將 a 解引用的語法是 *a .
例:

package main

import "fmt"

func main() {
    b := 166   //定義變量 b
    var a *int = &b   //b 的地址賦給 a, 或說 a 指向 b
    fmt.Printf("type of a is %T\n", a)   //打印 a 的類型
    fmt.Println("address of b is ", a)  //打印 a 的值
    fmt.Println("b is ", *a)  // 解引用 a
    *a++  //給 *a +1 ,等于給 b + 1
    fmt.Println("new b is ", b)  
}

以上程序中, 首先接引用*a, 返回 b 的值. 然后給 *a +1 ,相當(dāng)于改變 b 的值.
輸出為:

type of a is *int
address of b is 0xc420014070
b is 166
new b is 167

向函數(shù)傳遞指針參數(shù)

package main

import "fmt"

func change(val *int) {
    *val = 66
}

func main() {
    e := 77
    fmt.Println("val of e befor is ", e)
    f := &e  // f 等于 e 的地址
    change(f)  //函數(shù)解引用修改傳入?yún)?shù) f
    fmt.Println("val of f after is ", e)
}

以上程序中, 首先定義函數(shù)change , 傳入類型為 *int , 并將傳入?yún)?shù)解引用修改值為66. f 存儲了 e 的地址, 當(dāng)調(diào)用change參數(shù)時, 解引用 f 并改變值為 66.
輸出為:

val of e befor is 77
val of f after is 66

不要向函數(shù)傳遞數(shù)組的指針, 而應(yīng)該使用切片

package main

import "fmt"

func modify(arr *[3]int) {  
    (*arr)[0] = 20  //將 arr 解引用, 并將第一個元素賦 20
}

func main() {
    a := [3]int{40,50,60}  //創(chuàng)建一個數(shù)組 a
    modify(&a)
    fmt.Println(a)
}

在以上程序中, 定義函數(shù)modify, 傳入?yún)?shù)arr 是一個*[3]int 類型的值.
調(diào)用函數(shù)后, 將 arr 解引用, 并給第一個元素賦值 20.
輸出為:[20 50 60]

a[x] 是 (*a)[x] 的簡寫, 所以以上程序可以寫為:

package main

import "fmt"

func modify(arr *[3]int) {
    arr[0] = 20  //將 arr 解引用, 并將第一個元素賦 20
}

func main() {
    a := [3]int{40,50,60}  //創(chuàng)建一個數(shù)組 a
    modify(&a)
    fmt.Println(a)
}

但在 GO 語言中,我們最好用切片來實現(xiàn)以上功能.

package main

import (
    "fmt"
)

func modify(arr []int)  {  //傳入?yún)?shù)為切片類型
    arr[0] = 20
}

func main() {
    a := [3]int{40,50,60}  //創(chuàng)建一個數(shù)組 a
    modify(a[:])  // 傳入一個切片
    fmt.Println(a)
}

以上程序中,創(chuàng)建了函數(shù) modify, 傳入?yún)?shù)為切片類型 .
創(chuàng)建一個切片傳入函數(shù), 函數(shù)將切片的第一個元素改為20.
輸出為:[20 50 60]

所以別再傳遞數(shù)組指針了碍现,而是使用切片吧颊艳。上面的代碼更加簡潔瑰排,也更符合 Go 語言的習(xí)慣。

最后, GO 并不支持指針運算.

以上為學(xué)習(xí)Golang 指針

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末躲株,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子娶眷,更是在濱河造成了極大的恐慌偎行,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件领虹,死亡現(xiàn)場離奇詭異规哪,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)塌衰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門诉稍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人最疆,你說我怎么就攤上這事杯巨。” “怎么了努酸?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵服爷,是天一觀的道長。 經(jīng)常有香客問我获诈,道長仍源,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任舔涎,我火速辦了婚禮笼踩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘亡嫌。我一直安慰自己嚎于,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布昼伴。 她就那樣靜靜地躺著匾旭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪圃郊。 梳的紋絲不亂的頭發(fā)上价涝,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天,我揣著相機(jī)與錄音持舆,去河邊找鬼色瘩。 笑死伪窖,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的居兆。 我是一名探鬼主播覆山,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼泥栖!你這毒婦竟也來了簇宽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤吧享,失蹤者是張志新(化名)和其女友劉穎魏割,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體钢颂,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡钞它,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了殊鞭。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片遭垛。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖操灿,靈堂內(nèi)的尸體忽然破棺而出锯仪,到底是詐尸還是另有隱情,我是刑警寧澤牲尺,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布卵酪,位于F島的核電站,受9級特大地震影響谤碳,放射性物質(zhì)發(fā)生泄漏溃卡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一蜒简、第九天 我趴在偏房一處隱蔽的房頂上張望瘸羡。 院中可真熱鬧,春花似錦搓茬、人聲如沸犹赖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽峻村。三九已至,卻和暖如春锡凝,著一層夾襖步出監(jiān)牢的瞬間粘昨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留张肾,地道東北人芭析。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像吞瞪,于是被迫代替她去往敵國和親馁启。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容

  • Lua 5.1 參考手冊 by Roberto Ierusalimschy, Luiz Henrique de F...
    蘇黎九歌閱讀 13,744評論 0 38
  • 在C語言中,五種基本數(shù)據(jù)類型存儲空間長度的排列順序是: A)char B)char=int<=float C)ch...
    夏天再來閱讀 3,325評論 0 2
  • 這是16年5月份編輯的一份比較雜亂適合自己觀看的學(xué)習(xí)記錄文檔芍秆,今天18年5月份再次想寫文章惯疙,發(fā)現(xiàn)簡書還為我保存起的...
    Jenaral閱讀 2,732評論 2 9
  • 在遇見你的那一刻,我殺死了心里的另一個自己浪听。這便是全世界最微小的殺人事件螟碎。 故事很簡單,標(biāo)題黨一員表示失望迹栓,...
    無幾茶閱讀 1,241評論 0 0
  • 最近看到一個笑話,講的是笨鳥先飛的故事俭缓。這個故事是這樣講的:一個孩子在家里寫作業(yè)克伊,慢騰騰的,讓家長很是窩...
    詩哲爸爸閱讀 507評論 0 0