V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
Chaox
V2EX  ›  Go 编程语言

golang 中的切片地址

  •  
  •   Chaox · 2020-11-23 16:05:28 +08:00 · 1890 次点击
    这是一个创建于 1222 天前的主题,其中的信息可能已经有所发展或是发生改变。
    
    func main() {
        months := []string{1: "January"}
        fmt.Printf("%p,\n",&months)                //0xc0000ae040,
        fmt.Printf("%p,\n",months)                //0xc0000ae060,
        fmt.Printf("%p,\n",&months[0])           //0xc0000ae060,
    }
    
    

    我知道第二个和第三个打印函数指向的是底层数组的第一个元素的地址。 但是我想问的是第一个打印函数中打印的地址指向的是什么? 对切片这个引用类型(本身传递的就是地址)取地址会取到什么呢?

    (我在 stackoverflow 上看到回答是指向 slice 的 header 。我的疑惑是这个 header 如果表示的是 slice 结构体,但是 slice 结构体的第一个成员变量就是数组的指针,那么结构体的地址不就是第一个成员变量的地址吗,不就是底层数组的第一个元素吗?)

    8 条回复    2020-11-27 17:58:38 +08:00
    johnkiller
        1
    johnkiller  
       2020-11-23 17:04:39 +08:00
    months 是一个指针变量,存一个地址,指向这个切片。

    这个指针变量同样需要一个内存地址来存储。

    int *p;

    int a = 5;

    p = &a;

    p 存了 a 的地址,但 p 本身也需要一个内存地址来存储。

    把 p 理解成一个 cpu 字长大小的整形变量,他存了一个整形地址。所以它也需要一个内存地址。

    个人理解,如果有错感谢指正。
    lujjjh
        2
    lujjjh  
       2020-11-23 17:15:27 +08:00
    fmt.Printf("0x%x\n", (*reflect.SliceHeader)(unsafe.Pointer(&months)).Data)
    hellos
        3
    hellos  
       2020-11-23 17:15:39 +08:00
    第一个是指针自己的地址
    icexin
        4
    icexin  
       2020-11-23 17:18:39 +08:00   ❤️ 2
    func main() {
    months := []string{1: "January"}
    fmt.Printf("%p,\n", &months)
    fmt.Printf("%p,\n", months)
    fmt.Printf("%p,\n", &months[0])

    header := (*reflect.SliceHeader)(unsafe.Pointer(&months))
    fmt.Printf("%p,\n", header)
    fmt.Printf("0x%x,\n", header.Data)
    fmt.Printf("0x%x,\n", header.Data+0)
    }

    把你的代码翻译了一下,前面的几个打印语句等价于后面的三行
    whoami9894
        5
    whoami9894  
       2020-11-23 19:48:24 +08:00
    第一行打印 months 变量地址 (SliceHeader)
    第二行从 months 变量地址处取一个指针变量的长度当做指针打印 (SliceHeader 开头也正好是 uintptr)
    第三行打印 slice 指向的底层数组第一个元素地址
    Chaox
        6
    Chaox  
    OP
       2020-11-24 11:03:43 +08:00
    @johnkiller 谢谢,理解了
    Chaox
        7
    Chaox  
    OP
       2020-11-24 11:03:55 +08:00
    @icexin 谢谢,明白了
    sunshinev
        8
    sunshinev  
       2020-11-27 17:58:38 +08:00
    指针,和指针的指针
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   4356 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 10:08 · PVG 18:08 · LAX 03:08 · JFK 06:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.