package main
import (
"fmt"
)
func main() {
// 声明一个指针
var p *int
// 声明一个变量
var p1 int = 10
// 变量转为指针
p = &p1
// 打印出来地址
fmt.Println(p)
// 从这个地址取回来值
fmt.Println(*p)
//==============================================
// 对于 struct 也是一样的
type cat struct{}
c := &cat{}
// 打印出来 struct 的地址
fmt.Println(c)
// 打印 struct 的值
fmt.Println(*c)
//========================================
// 针对数组却不一样
arr := &[10]int {1,2,3,4,5,6,7,8,9,0}
fmt.Println(arr[1]) // 打印出 2 而不需要使用 *
//=======================================
}
package main
import (
"fmt"
)
type person struct{
name string
age int
}
// 指针作为参数传递。 注意这个时候,类型是指针,必须要用 *
func change(p *person) {
p.name = "changed"
}
func change2(p person) {
p.name = "changed2"
}
//============================================
// 指针传递给方法
func (p *person) add() {
p.age++
}
// 不是指针
func (p person) add2() {
p.age++
fmt.Println(p.age) // 21 新的空间
}
func changeArr(a *[5]int) {
a[1] = 111111111
}
func main() {
// 函数中应用指针
p1 := person{"john",20}
change(&p1)
fmt.Println(p1.name) // changed
change2(p1)
fmt.Println(p1.name) // changed. 这个时候是按值传递,而不是按引用传递,所以原来的对象名字不变!!
//====================================================================================
// 方法中,指针的使用
p2 := person{"jack",19}
p2.add()
fmt.Println(p2.age) // 20
fmt.Println(p1.age) // 20 说明了互不影响,两个对象之间的内存是相互独立的
// 方法中不应用指针
p2.add2()
fmt.Println(p2.age) // 20 没有继续增加,说明这个时候,按值传递,创建了一个新对象,分布在了不同空间
fmt.Println(p1.age) // 20 说明了互不影响,两个对象之间的内存是相互独立的
//=============================================
// 数组中使用指针,不是指针不改变原来的数组
arr := [...]int {1,2,3,4,5}
changeArr(&arr)
fmt.Println(arr)
}