对指针不是很理解

package main

import (
    "fmt"
)

type rect struct {
    width, height int
}

func (r *rect) area() int {
    return r.width * r.height
}

func (r *rect) perim() int {
    return 2 * (r.width + r.height)
}

func main() {
    r := rect{width: 10, height: 5}

    fmt.Println("area: ", r.area())
    fmt.Println("perim: ", r.perim())

    rp := &r
    fmt.Println("area: ", rp.area())
    fmt.Println("perim: ", rp.perim())

    fmt.Println(*rp == r)
    r.width = 100
    *rp.width = 100
}

除去最后一句的话输出:

area:  50
perim:  30
area:  50
perim:  30
true

直接打印rp的话会输出:&{width:30, height:50}
我表示可以理解
因为这里的指针默认解析了结构体*地址但是我不大明白的是为啥我通过*地址 去修改对象属性的时候会报错,*地址难道不是取得了对象本体吗

共 3 个回复


jthmath

.的优先级高于*,所以*rp.width等价于*(rp.width),这相当于对一个int进行*操作,这当然不对

# 0

stevewang

*rp.width = 100改成(*rp).width = 100
*rp.width是对rp.width进行dereference,而(*rp).width是对rp进行dereference,然后访问*rp这个对象的width成员。

# 1

adodo08

谢谢各位大大

# 2