如果学过C的都知道,指针很多地方都要用到,我们声明一个变量,其实就是就是开辟一块内存空间,我们在操作变量的时候,并不是直接取操作变量存在的空间,而是这个变量的内存地址。变量名对内存地址的引用。因此声明一个变量包含:内存空间和内存地址
package main
import "fmt"
func main() {
// 对于任意一个变量,都有两个含义:内存和地址
var a = 10
fmt.Printf("a = %d\n", a) // 变量的内存
fmt.Printf("&a = %v \n", &a) // 变量的地址
fmt.Printf("&a = %p \n", &a) // 变量的内存
fmt.Println("------------------------------------ ")
// 保存某一个变量的地址,需要用到指针 *int 保存int的地址 **int 保存*int的地址
// 声明(定义) 定义只是特殊的声明
// 声明一个变量为P 类型为*int 默认值为nil
var p *int //定义一个指针变量
p = &a //指针变量指向谁,就把谁的地址值赋值给哪个指针变量
fmt.Printf("p = %p, &a = %v \n", p, &a)
//*p表示访问指针变量p所指的单元a的值,指针p保存的a的地址
fmt.Printf("*p = %v, a = %v\n", *p, a) // *p=10,a=10
*p = 1111 // 表示把值赋值给变量a
fmt.Printf("*p = %v, a = %v\n", *p, a) // 此时是把a的地址赋值给指针变量p, *p=1111 a=1111
fmt.Println("")
var b *int // 如果不初始化,默认值是nil
fmt.Println("b = ", b)
*b = 222 //err b指针没有合法的指向
}
二、new 函数
表达式new(T)将创建一个T类型的匿名变量,为T类型的新值分配并且清零一块内存空间,然后将这块内存空间的地址值作为结果返回,这个结果就是指向这个新的T类型 的指针值,返回的指针类型为*T.
我们在使用new函数时候,可以随意的使用,不用担心要关闭和删除空间,go语言会有自动回收机制
package main
import "fmt"
func main() {
a := 10
var p *int
p = &a // 合法指向
*p = 111
fmt.Printf("*p=%v\n", *p)
var c *int
c = new(int) // a为*int类型,指向匿名变量int
*c = 222
fmt.Printf("*c=%v\n", *c)
b := new(int) // b为*int类型,指向匿名变量int
*b = 333
fmt.Printf("*b=%v\n", *b)
}
三、指针做函数参数
package main
import "fmt"
func swap(a, b int) {
a, b = b, a
fmt.Printf("a = %d, b = %d\n", a, b)
}
func swapPointer(p1, p2 *int) {
*p1, *p2 = *p2, *p1
fmt.Printf("*p1 = %v, *p2 = %v\n", *p1, *p2)
}
func main() {
/*********普通变量做参数************/
a, b := 1, 2
// 通过一个函数交换a和b的位置
swap(a, b)
fmt.Printf("a = %d, b = %d\n", a, b)
fmt.Printf("------------------------------\n")
/*********指针变量作为参数************/
c, d := 3, 4
swapPointer(&c, &d)
fmt.Printf("c = %d, d = %d\n", c, d)
}