Open LLLeon opened 7 years ago
A pointer is a value that points to the memory address of another variable.
指针是一个指向另一个变量内存地址的值。
package main import ( "fmt" ) func main() { a := 200 b := &a fmt.Println("a -->", a) fmt.Println("*b -->", *b) fmt.Println("&a -->", &a) fmt.Println("b -->", b) *b++ fmt.Println("a -->", a) fmt.Println("*b -->", *b) }
*b++
a --> 200 *b --> 200 &a --> 0xc4200160b0 b --> 0xc4200160b0 a --> 201 *b --> 201
package main import ( "fmt" ) type packet struct { id int size int } var ( p packet q *packet ) func main() { p = packet{ id: 1, size: 2, } q = &p fmt.Println("p -->", p) fmt.Println("q -->", q) fmt.Println("*q -->", *q) fmt.Println("&p -->", &p) fmt.Println("&q -->", &q) fmt.Println("p.size -->", p.size) fmt.Println("(*q).size -->", (*q).size) fmt.Println("q.size -->", q.size) }
首先定义了一个结构类型 packet,又声明了两个变量 p 和 q,p 是一个普通 packet 结构,q 则是一个 packet 类型的指针。
packet
初始化 p,q 的值是 p 的地址,即 q 是一个指向 p 内存地址的指针。
执行结果如下:
p --> {1 2} q --> &{1 2} *q --> {1 2} &p --> &{1 2} &q --> 0x113e040 p.size --> 2 (*q).size --> 2 q.size --> 2
从执行结果可以看出,q 的值是对 p 进行取地址操作。
*q 是对 q 指向的内存地址取值,即 p 的值。
*q
&q 是指针 q 所在的内存地址。
&q
这里需要注意的是,(*q).size 和 q.size 结果一样。
(*q).size
q.size
(*q).size 是先对 q 所指的内存地址取值,即 p 的值,p 的 size 字段值为 2。
q.size 是直接对 q 指向的内存地址的 size 字段取值,结果与上面一样。
参考资料:Understand Go pointers in less than 800 words or your money back
指针的定义
A pointer is a value that points to the memory address of another variable.
指针是一个指向另一个变量内存地址的值。
示例 1
*b++
是对变量 b 指向的内存地址取值后再对该值加 1,即变量 a 的值加 1,执行结果如下:示例 2
首先定义了一个结构类型
packet
,又声明了两个变量 p 和 q,p 是一个普通packet
结构,q 则是一个packet
类型的指针。初始化 p,q 的值是 p 的地址,即 q 是一个指向 p 内存地址的指针。
执行结果如下:
从执行结果可以看出,q 的值是对 p 进行取地址操作。
*q
是对 q 指向的内存地址取值,即 p 的值。&q
是指针 q 所在的内存地址。这里需要注意的是,
(*q).size
和q.size
结果一样。(*q).size
是先对 q 所指的内存地址取值,即 p 的值,p 的 size 字段值为 2。q.size
是直接对 q 指向的内存地址的 size 字段取值,结果与上面一样。
参考资料:Understand Go pointers in less than 800 words or your money back