MAY-Lesson2

golang pointer 

We can find that, by changing the parameter to a pointer type, the passed pointer argument &a and its copy x used in the function body both reference the same value, so the modification on *x is equivalent to a modification on *p, a.k.a., variable a. In other words, the modification in the double function body can be reflected out of the function now.Surely, the modification of the copy of the passed pointer argument itself still can't be reflected on the passed pointer argument. After the second double function call, the local pointer p doesn't get modified to nil.In short, pointers provide indirect ways to access some values. Many languages have not the pointer concept. However, pointers are just hidden under other concepts in those languages.

我们可以发现,通过将参数更改为指针类型,传递的指针参数&a及其x在函数体中使用的副本都引用相同的值,因此修改 *x等效于修改 *p,aka,variable a。换句话说,double函数体中的修改现在可以从函数中反映出来。当然,传递的指针参数本身的副本的修改不能反映在传递的指针参数上。在第二个double函数调用之后,本地指针 p不会被修改为nil。简而言之,指针提供了访问某些值的间接方法。许多语言都没有指针概念。但是,指针只是隐藏在这些语言中的其他概念之下。


https://play.golang.org/p/6uGfdqOqQPL

package main

import "fmt"

func double(x *int) {

    fmt.Println("address of x in method(double): ", &x) // 0x40c130,  0x40c140

    fmt.Println("value of x in method(double): ", x)    // 0x414020,  0x414020

    fmt.Println("value of *x in method(double): ", *x)  //3 , 6

    *x += *x

    x = nil // the line is just for explanation purpose

}

func main() {

    var a = 3

    fmt.Println("address of var a :", &a)  // 0x414020

    double(&a)

    fmt.Println(a) // 6

    p := &a

    fmt.Println("value  of p : ", p)              // 0x414020

    fmt.Println("address  of p : ", &p)       //0x40c138

    double(p)

    fmt.Println(a, p == nil) // 12 false

}

输出

address of var a : 0x414020

address of x in method(double):  0x40c130

value of x in method(double):  0x414020

value of *x in method(double):  3

6

value  of p :  0x414020

address  of p :  0x40c138

address of x in method(double):  0x40c140

value of x in method(double):  0x414020

value of *x in method(double):  6

12 false

你可能感兴趣的:(MAY-Lesson2)