Golang 中的指针

作者: LLLeon | 来源:发表于2017-08-29 23:53 被阅读33次

指针的定义

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

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

示例 1

package main

import (
    "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 main

import (
    "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 的值是对 p 进行取地址操作。
    • *q 是对 q 指向的内存地址取值,即 p 的值。
    • &q 是指针 q 所在的内存地址。
    • 这里需要注意的是,(*q).sizeq.size 结果一样。
      • (*q).size 是先对 q 所指的内存地址取值,即 p 的值,p 的 size 字段值为 2。

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

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

相关文章

  • Golang 中的指针

    指针的定义 A pointer is a value that points to the memory addr...

  • Golang基础(三)——复杂类型

    Golang基础(三)——复杂类型 @([07] golang)[Go总结] [TOC] 指针 定义 指针变量可以...

  • golang使用unsafe包实现指针运算操作private变量

    golang中是有指针概念的,但是go中的指针功能被限制了,不像C/C++中那样,可以对指针进行运算 比如在C/C...

  • 后端研发体系

    记录自己为了面试发现的文章 golang golang中都是值传递,没有引用传递,哪怕是指针,也是指针的值拷贝。 ...

  • Golang 指针和结构体

    Golang 指针和结构体 于c语言相同,go中也有指针和结构体的概念。指针表示变量的内存地址,结构体用来存储同一...

  • Go 学习笔记 07 | 指针详解

    一、Golang 中的指针 指针存储的是另一个变量的内存地址。 通过指针修改值会影响到原来的值。 输出: 如何去改...

  • golang指针

    关于指针,我的理解是这样的,它指向一个内存的地址,也就是某个类型在内存中存放的地方。 定义一个指针 var d *...

  • golang 指针

    在Go语言中,有几种东西可以代表“指针”。  1. uintptr类型:该类型实际上是一个数值类型,也是Go语言内...

  • golang 指针

    1.Golang提供了指针用于操作数据内存,并通过引用来修改变量。只声明未赋值的变量,golang都会自动为其初始...

  • golang 指针

    package main import "fmt" //=============================...

网友评论

    本文标题:Golang 中的指针

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