美文网首页
05. Go极简教程 几句话说明白指针

05. Go极简教程 几句话说明白指针

作者: 超级大柱子 | 来源:发表于2018-06-02 19:34 被阅读40次

总结

  1. 指针对象是用来存储内存地址的数据类型
  2. &符号获取对象的内存地址
  3. *符号根据内存地址获取值, 只有指针对象可以使用该符号

指针

仔细看代码注释, 应该描述得足够明细了

package main

import "fmt"

func main() {
    // 重点句子1: 指针对象是用来存储内存地址的数据类型
    // 重点句子2: &符号获取对象的内存地址
    // 重点句子3: *符号根据内存地址获取值, 只有指针对象可以使用*符号

    var p *int // 创建了一个int类型的指针对象
    // fmt.Println(p) //此时 p 是 <nil>

    // 创建一个int变量
    var v = 20
    fmt.Println(v)  // 50 v得到了新值:50
    fmt.Println(&v) // 0xc4200160a8 v的内存地址没有变化
    // fmt.Println(*v) // 错误, v是一个int对象,不是一个指针对象

    p = &v // &符号得到了v的内存地址, 赋值给指针p
    // 此时 p指针已经有了一个内存地址了
    fmt.Println(p)  // 0xc4200160a8 这个是v的内存地址
    fmt.Println(&p) // 0xc420016028 这个是p指针的内存地址, 一般用不到
    fmt.Println(*p) // *符号会根据p所保存的内存地址,获取到该内存地址指向的值,即v的值

    // 修改对象的值
    v = 50
    fmt.Println(v)  // 50 v得到了新值:50
    fmt.Println(&v) // 0xc4200160a8 v的内存地址没有变化
    fmt.Println(p)  // 0xc4200160a8 p还是这个v的地址,没有修改
    fmt.Println(*p) // 50 *符号得到内存地址的值, v已经修改了,

    // 通过指针修改对象的值
    *p = 100
    fmt.Println(v)  // 100 v得到了新值:100
    fmt.Println(&v) // 0xc4200160a8 v的内存地址没有变化
    fmt.Println(p)  // 0xc4200160a8 p还是这个v的地址,没有修改
    fmt.Println(*p) // 100 *符号得到内存地址的值, v已经修改了,

}

结构体和指针

package main

import "fmt"

// Vertex 声明一个结构体
type Vertex struct {
    X int
    Y int
}

func main() {
    // 实例化一个结构体
    var v = Vertex{1, 2}

    // 实例化一个结构体指针
    var p *Vertex

    // 把结构体的内存地址复制给指针
    p = &v

    // 以上三行一般情况下省略为:
    // 实例化一个结构体指针
    // var p = &Vertex{1, 2}

    // 对比上一段普通指针的几种情况
    fmt.Println(v)  // {1, 2} 这是结构体值
    fmt.Println(p)  // &{1, 2} 这是结构体指针和普通指针的区别 直接显示对象地址 而不是0x123456的内存地址
    fmt.Println(*p) // {1, 2} 结构体对象的值
    fmt.Println(&p) // 和普通指针一样, *p是指针对象的内存地址, 和结构体无关系

    fmt.Println(p) // &{1, 2} 这是结构体指针和普通指针的区别 直接显示对象地址 而不是0x123456的内存地址

    // 根据上面这行的特性
    fmt.Println(p.X)  //1 可以直接访问结构体指针里的对象
    fmt.Println(&v.X) //0xc420096010 v.X的内存地址
    fmt.Println(&p.X) //0xc4200160b0 &p.X的内存地址和 v.X是一样的,因为它们是同一个对象
}

Go极简教程 继续阅读( 目录)

相关文章

  • 05. Go极简教程 几句话说明白指针

    总结 指针对象是用来存储内存地址的数据类型 &符号获取对象的内存地址 *符号根据内存地址获取值, 只有指针对象可以...

  • 01 Go极简教程 目录

    极简教程的初衷是给已有其他语言基础的人阅读尽可能少的内容学习Go语言 Go极简教程 目录 Go极简教程 环境安装及...

  • 07. Go极简教程 map的基础使用

    map的声明 map的操作 参考资料:http://go-tour-zh.appspot.com/ Go极简教程 ...

  • Go教程第十篇:指针

    指针 在这篇教程中,我们将学习Go里面的指针是如何工作的,以及Go的指针和C/C++的区别和差异。 什么是指针 ?...

  • Go语言基础之指针

    区别于C/C++中的指针,Go语言中的指针不能进行偏移和运算,是安全指针。 要搞明白Go语言中的指针需要先知道3个...

  • Go Quick Start 极简教程

    Go 官网:https://golang.org/[https://golang.org/]文档:https://...

  • 12. Go极简教程 goroutine:Go程

    goroutine称之为Go程是因为现有的术语—线程、协程、进程等等均无法准确传达它的含义 goroutine是通...

  • 极简·go

    某天突然发现,刷牙可以不用牙杯,手就着就可以。 省去了买和选牙杯的时间和洗牙杯的繁琐。 bingo!

  • 《Kotlin 极简教程 》第5章 集合类(1)

    《Kotlin 极简教程 》第5章 集合类 《Kotlin极简教程》正式上架: 点击这里 > 去京东商城购买阅读 ...

  • Nginx 极简教程

    Nginx 极简教程 本项目是一个 Nginx 极简教程,目的在于帮助新手快速入门 Nginx。examples ...

网友评论

      本文标题:05. Go极简教程 几句话说明白指针

      本文链接:https://www.haomeiwen.com/subject/eborsftx.html