go 语言中 指针的理解

2020-05-01  本文已影响0人  蛐蛐儿阳
// php里面有& 号,就是引用的意思
// go 里面到处是*号,一定要搞懂他。
x := 1
p := &x
// 注意这里p就是指针
// 打印指针 他是类似 0xc0000b4008 的值, 他其实是一个地址,
// 程序里并没有必要直接操作 p,  他是一个地址, 他的值其实没什么意义
fmt.Printf("%v \n", p) // 0xc0000b4008
fmt.Printf("%v \n ", x)

// 指针的意义是, 在不知道变量名称的情况下, 利用指针, 直接控制变量。
// 我这段代码的意思是想说
// *p 就是 x
var c bool = false
c = *p == x
fmt.Printf("%t \n", c)
// 这里, 直接对指针
// 前面必须加*号
// 确切的说,是对 *p 的操作
// 就是直接对 x 的操作
// 记住 &号是取地址操作符, * 是操作指针引用的 变量(可以是很多类型)
*p = 8
fmt.Printf("%d \n", x)

下段代码很好理解, 每次初始赋值, 打印的指针值都不一样

var p = f()

func f() *int{
    v := 1
    return &v
}

func main()  {
    for i := 1; i<10; i++ {
        fmt.Printf("%v \n", f())
    }
}
但是注意,你要是打印p,地址就是一样的,
 因为函数申请了一块空间,这个函数的指针是不会变得

这段代码看下

func incr(p *int)  int {
    *p++
    return *p
}


func main()  {
    fmt.Printf("pp \n")
    v := 1
    incr(&v)
    fmt.Println(v)
    fmt.Printf("pp \n")
    fmt.Println(incr(&v))
}

看完这段我炸了. *号 &号搞懂了, 会比较容易看懂,但在php里面

function incr(&$p) {
  return $p++
}
使用的时候
incr($a)

和go语言代码功能一模一样。
php 果然是世界上最好的语言。 看下go简化后代码

func incr(p *int)  int {
    *p++
    return *p
}
你直接return *p++会报错。
v := 1
incr(&v)
这里&v必须声明初始化,否则报错.
这是最简单写法了。

再理解下

    x := 1
    fmt.Printf("%d \n",x)
    fmt.Printf("%v \n", &x)
    fmt.Printf("%d \n", *&x)

你直接 *x是会报错的, 注意 x , x 一定是个引用,就是一个地址,就是指针。 所以以后看到x, 其实把它看成一个变量就好, *x就是变量别名, x其实是指针, x就是那个内存地址。

虽然写了十年代码了,但我还是菜鸟. 下面是我设想一下指针再go里面的意义。 万事万物都付给一个变量,或方法,或类, 直接操作这个值不就可以了吗? *x有啥意义呢?

事实上, 在底层语言中, 好多资源并没有变量。我尝试画了个图。


image.png

大概是这意思吧, go中好多时候没有x, 你只能通过 *x ,也就是x的别名,去操作4 ,那块内存资源。
这就是指针的意义。

上一篇 下一篇

猜你喜欢

热点阅读