跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • golang 中的切片地址
未分類
25 11 月 2020

golang 中的切片地址

golang 中的切片地址

資深大佬 : Chaox 0

 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 结构体的第一个成员变量就是数组的指针,那么结构体的地址不就是第一个成员变量的地址吗,不就是底层数组的第一个元素吗?)

大佬有話說 (7)

  • 資深大佬 : johnkiller

    months 是一个指针变量,存一个地址,指向这个切片。

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

    int *p;

    int a = 5;

    p = &a;

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

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

    个人理解,如果有错感谢指正。

  • 資深大佬 : lujjjh

    fmt.Printf(“0x%xn”, (*reflect.SliceHeader)(unsafe.Pointer(&months)).Data)

  • 資深大佬 : hellos

    第一个是指针自己的地址

  • 資深大佬 : icexin

    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

    第一行打印 months 变量地址 (SliceHeader)
    第二行从 months 变量地址处取一个指针变量的长度当做指针打印 (SliceHeader 开头也正好是 uintptr)
    第三行打印 slice 指向的底层数组第一个元素地址

  • 主 資深大佬 : Chaox

    @johnkiller 谢谢,理解了

  • 主 資深大佬 : Chaox

    @icexin 谢谢,明白了

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具