为了账号安全,请及时绑定邮箱和手机立即绑定

Golang 中的指针

标签:
Go

指针的定义

A pointer is a value that points to the memory address of another variable.

指针是一个指向另一个变量内存地址的值。

示例 1

package mainimport (    "fmt")func main() {
    a := 200
    b := &a

    fmt.Println("a -->", a)
    fmt.Println("*b -->", *b)
    fmt.Println("&a -->", &a)
    fmt.Println("b -->", b)

    *b++

    fmt.Println("a -->", a)
    fmt.Println("*b -->", *b)
}
  • 变量 a 的值是 200,变量 b 的值就是变量 a 的内存地址。b 就是一个指针,它指向 a 所在的内存地址。

  • *b++ 是对变量 b 指向的内存地址取值后再对该值加 1,即变量 a 的值加 1,执行结果如下:

a --> 200
*b --> 200
&a --> 0xc4200160b0
b --> 0xc4200160b0
a --> 201
*b --> 201

示例 2

package mainimport (    "fmt")type packet struct {
    id   int
    size int}var (
    p packet
    q *packet
)func main() {
    p = packet{
        id:   1,
        size: 2,
    }

    q = &p

    fmt.Println("p -->", p)
    fmt.Println("q -->", q)
    fmt.Println("*q -->", *q)
    fmt.Println("&p -->", &p)
    fmt.Println("&q -->", &q)
    fmt.Println("p.size -->", p.size)
    fmt.Println("(*q).size -->", (*q).size)
    fmt.Println("q.size -->", q.size)
}
  • 首先定义了一个结构类型 packet,又声明了两个变量 p 和 q,p 是一个普通 packet 结构,q 则是一个 packet 类型的指针。

  • 初始化 p,q 的值是 p 的地址,即 q 是一个指向 p 内存地址的指针。

  • 执行结果如下:

    p --> {1 2}
    q --> &{1 2}
    *q --> {1 2}
    &p --> &{1 2}
    &q --> 0x113e040
    p.size --> 2
    (*q).size --> 2
    q.size --> 2
    • (*q).size 是先对 q 所指的内存地址取值,即 p 的值,p 的 size 字段值为 2。

    • q.size 是直接对 q 指向的内存地址的 size 字段取值,结果与上面一样。

    • 从执行结果可以看出,q 的值是对 p 进行取地址操作。

    • *q 是对 q 指向的内存地址取值,即 p 的值。

    • &q 是指针 q 所在的内存地址。

    • 这里需要注意的是,(*q).sizeq.size 结果一样。

参考资料:Understand Go pointers in less than 800 words or your money back



作者:LLLeon
链接:https://www.jianshu.com/p/e0250d739f37

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消