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

比较 Go 中的指针

比较 Go 中的指针

Go
潇湘沐 2021-11-29 16:14:35
我在我的 Go 书中读到指针是可比的。它说:两个指针相等当且仅当它们指向同一个变量或两者都为零。那么为什么在比较指向两个不同变量的两个指针时,我的以下代码打印“true”?func main() {    var p = f()    var q = f2()    fmt.Println(*p == *q) // why true?}func f() *int {    v := 1    return &v}func f2() *int {    w := 1    return &w}
查看完整描述

2 回答

?
Helenr

TA贡献1780条经验 获得超3个赞

您没有比较指针本身,因为您使用了“取消引用运算符” *,它返回存储在该地址的值。在您的示例代码中,您调用了返回两个不同指针的方法。存储在每个不同地址的值恰好是1. 当您取消引用指针时,您会得到存储在那里的值,因此您只是在比较1 == 1哪个是真的。


比较指针本身,你会得到错误;


package main


import "fmt"


func main() {

    var p = f()

    var q = f2()

    fmt.Println(*p == *q) // why true?


    fmt.Println(p == q) // pointer comparison, compares the memory address value stored

    // rather than the the value which resides at that address value


    // check out what you're actually getting

    fmt.Println(p) // hex address values here

    fmt.Println(q)

    fmt.Println(*p) // 1

    fmt.Println(*q) // 1

}


func f() *int {

    v := 1

    return &v

}


func f2() *int {

    w := 1

    return &w

}

https://play.golang.org/p/j2FCGHrp18


查看完整回答
反对 回复 2021-11-29
?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

package main


import "fmt"


func main() {

    var p = f()

    var q = f2()


    fmt.Println(*p == *q)

    /* is true, since *p = *q = 1 */


    fmt.Println(p == q)

    /* is false, since *p and *q store two different memory addresses */

}


func f() *int {

    v := 1

    return &v

}


func f2() *int {

    w := 1

    return &w

}

https://play.golang.org/p/i1tK4hhjOf


查看完整回答
反对 回复 2021-11-29
  • 2 回答
  • 0 关注
  • 162 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信