05. Go極簡教程 幾句話說明白指針

總結(jié)

  1. 指針對象是用來存儲內(nèi)存地址的數(shù)據(jù)類型
  2. &符號獲取對象的內(nèi)存地址
  3. *符號根據(jù)內(nèi)存地址獲取值, 只有指針對象可以使用該符號

指針

仔細看代碼注釋, 應該描述得足夠明細了

package main

import "fmt"

func main() {
    // 重點句子1: 指針對象是用來存儲內(nèi)存地址的數(shù)據(jù)類型
    // 重點句子2: &符號獲取對象的內(nèi)存地址
    // 重點句子3: *符號根據(jù)內(nèi)存地址獲取值, 只有指針對象可以使用*符號

    var p *int // 創(chuàng)建了一個int類型的指針對象
    // fmt.Println(p) //此時 p 是 <nil>

    // 創(chuàng)建一個int變量
    var v = 20
    fmt.Println(v)  // 50 v得到了新值:50
    fmt.Println(&v) // 0xc4200160a8 v的內(nèi)存地址沒有變化
    // fmt.Println(*v) // 錯誤, v是一個int對象,不是一個指針對象

    p = &v // &符號得到了v的內(nèi)存地址, 賦值給指針p
    // 此時 p指針已經(jīng)有了一個內(nèi)存地址了
    fmt.Println(p)  // 0xc4200160a8 這個是v的內(nèi)存地址
    fmt.Println(&p) // 0xc420016028 這個是p指針的內(nèi)存地址, 一般用不到
    fmt.Println(*p) // *符號會根據(jù)p所保存的內(nèi)存地址,獲取到該內(nèi)存地址指向的值,即v的值

    // 修改對象的值
    v = 50
    fmt.Println(v)  // 50 v得到了新值:50
    fmt.Println(&v) // 0xc4200160a8 v的內(nèi)存地址沒有變化
    fmt.Println(p)  // 0xc4200160a8 p還是這個v的地址,沒有修改
    fmt.Println(*p) // 50 *符號得到內(nèi)存地址的值, v已經(jīng)修改了,

    // 通過指針修改對象的值
    *p = 100
    fmt.Println(v)  // 100 v得到了新值:100
    fmt.Println(&v) // 0xc4200160a8 v的內(nèi)存地址沒有變化
    fmt.Println(p)  // 0xc4200160a8 p還是這個v的地址,沒有修改
    fmt.Println(*p) // 100 *符號得到內(nèi)存地址的值, v已經(jīng)修改了,

}

結(jié)構(gòu)體和指針

package main

import "fmt"

// Vertex 聲明一個結(jié)構(gòu)體
type Vertex struct {
    X int
    Y int
}

func main() {
    // 實例化一個結(jié)構(gòu)體
    var v = Vertex{1, 2}

    // 實例化一個結(jié)構(gòu)體指針
    var p *Vertex

    // 把結(jié)構(gòu)體的內(nèi)存地址復制給指針
    p = &v

    // 以上三行一般情況下省略為:
    // 實例化一個結(jié)構(gòu)體指針
    // var p = &Vertex{1, 2}

    // 對比上一段普通指針的幾種情況
    fmt.Println(v)  // {1, 2} 這是結(jié)構(gòu)體值
    fmt.Println(p)  // &{1, 2} 這是結(jié)構(gòu)體指針和普通指針的區(qū)別 直接顯示對象地址 而不是0x123456的內(nèi)存地址
    fmt.Println(*p) // {1, 2} 結(jié)構(gòu)體對象的值
    fmt.Println(&p) // 和普通指針一樣, *p是指針對象的內(nèi)存地址, 和結(jié)構(gòu)體無關(guān)系

    fmt.Println(p) // &{1, 2} 這是結(jié)構(gòu)體指針和普通指針的區(qū)別 直接顯示對象地址 而不是0x123456的內(nèi)存地址

    // 根據(jù)上面這行的特性
    fmt.Println(p.X)  //1 可以直接訪問結(jié)構(gòu)體指針里的對象
    fmt.Println(&v.X) //0xc420096010 v.X的內(nèi)存地址
    fmt.Println(&p.X) //0xc4200160b0 &p.X的內(nèi)存地址和 v.X是一樣的,因為它們是同一個對象
}

Go極簡教程 繼續(xù)閱讀( 目錄)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時...
    歐辰_OSR閱讀 30,224評論 8 265
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,545評論 19 139
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,641評論 1 32
  • 2017年2月11日 陰 順德 1.、早起:4:37 2、誦讀經(jīng)典:媽媽《易經(jīng)》十卦 《心經(jīng)》《清靜經(jīng)》 ...
    悅2017137閱讀 339評論 6 4
  • 轉(zhuǎn)載鏈接:http://www.itdecent.cn/p/4522fdebb50e
    CoderZXS閱讀 250評論 0 0

友情鏈接更多精彩內(nèi)容