Go笔记(七):指针
1、指针
在Go中,指针的操作有两个符号:&(取地址) 和 * (变量指针的声明 | 取指针变量的值)。
一个指针变量指向了一个值的内存地址。
Go中函数传值皆为值拷贝,对于引用类型的传值,可以创建一个指针变量,无需拷贝数据。Go中,类型指针不能进行偏移和运算。
2、指针地址和指针类型
变量在运行是都拥有一个地址,该地址代表变量在内存中的位置。
Go 语言的取地址符是 &,放到一个变量前使用就会返回相应变量的内存地址。
Go语言中的值类型(int、float、bool、string、array、struct)都有对应的指针类型。
3、声明指针
3.1、声明指针变量
var pointer_name *type
pointer_name: 指针变量名称
type:指针类型
*: 用于指定变量是作为一个指针
1 package main 2 3 import "fmt" 4 5 // 声明指针 6 func definepointer() { 7 // * 变量指针的声明 8 var intpt *int // 指向整型 9 var strpt *string // 指向字符串 10 // & 取指针变量的地址 11 fmt.Printf("intpt: %v\n", &intpt) 12 fmt.Printf("strpt: %v\n", &strpt) 13 } 14 15 func main() { 16 definepointer() 17 }
执行结果如下:
3.2、空指针
当一个指针被定义后没有分配到任何变量时,它的值为 nil。nil 指针也称为空指针,值为指针类型的默认值。
1 package main 2 3 import "fmt" 4 5 // 空指针 6 func defineNilPointer() { 7 var ptr *int 8 fmt.Printf("ptr: %v\n", ptr) 9 fmt.Printf("ptr 的值为 : %x\n", ptr) 10 } 11 12 func main() { 13 defineNilPointer() 14 }
执行结果如下:
3.3、指针初始化
1 package main 2 3 import "fmt" 4 5 /** 6 初始化指针 7 */ 8 func initpointer() { 9 // * 变量指针的声明 10 var intpt *int 11 var i = 10 12 // 将变量i的内存地址赋给指针类型的变量intpt 13 intpt = &i 14 fmt.Printf("initpointer ===> intpt地址: %v\n", intpt) 15 // * 取指针类型的变量值 16 fmt.Printf("initpointer ===> intpt的值: %v\n", *intpt) 17 18 // 声明string类型指针 19 var strpt *string 20 // 类型 21 fmt.Printf("initpointer ===> strpt的类型: %T\n", strpt) 22 s1 := "timi" 23 strpt = &s1 24 // 地址 25 fmt.Printf("initpointer ===> s1的地址: %v\n", strpt) 26 // 指针类型 27 fmt.Printf("initpointer ===> s1值: %v\n", *strpt) 28 } 29 30 func main() { 31 initpointer() 32 }
执行结果如下:
4、指针数组
1 package main 2 3 import "fmt" 4 5 /** 6 指针数组的声明及初始化 7 */ 8 func pointArr() { 9 var arrptInt [3]*int 10 // 数组元素变量内存地址 11 fmt.Printf("arrptInt的地址 : %v\n", arrptInt) 12 // 数组指针类型 13 fmt.Printf("arrptInt的指针类型 : %T\n", arrptInt) 14 // 数组指针元素默认值 15 fmt.Printf("arrpt的默认值 : %x\n", arrptInt) 16 17 // 定义字符串类型指针 18 var arrptStr [3]*string 19 // 定义数组 20 arrpt := []string{"tom", "jack", "timi"} 21 // 将数组的元素地址赋值到字符串类型指针中 22 for i := 0; i < len(arrpt); i++ { 23 arrptStr[i] = &arrpt[i] 24 } 25 // 输出字符串类型指针内容 26 for i := 0; i < len(arrptStr); i++ { 27 fmt.Printf("arrptStr[%d] = %v\n", i, *arrptStr[i]) 28 } 29 } 30 31 func main() { 32 pointArr() 33 }
执行结果如下: