<一> 指针的概述
1 指针是存储另一个变量内存地址的变量
- 变量是一种使用方便的占位符,变量都指向计算机的内存地址。
- 一个指针变量可以指向任何一个值的内存地址
- 变量b的值为156,存储的内存地址为0x104a124,变量a持有变量b的内存地址,则被认为变量a指向b 。
2 获取变量的地址
Go语言中使用取地址符&,如果一个变量前使用&,则返回该变量的地址。在go语言中,指针不能参与运算。
3 脚本示例
package main
import "fmt"
func main() {
a := 10
fmt.Printf("变量的地址为:%x\n",&a)
b := []int {1,3,5,6}
fmt.Printf("变量的地址为:%x\n",&b)
}
/*
变量的地址为:c00000a0c8
变量的地址为:&[1 3 5 6]
*/
<二> 定义指针
1 声明指针,*T是指针变量的类型,它指向T类型的值
var 指针变量名 * 指针类型
* *号用于指定变量的一个指针。
* var ip *int // 指向整型的指针
* var fp *float32 // 指向浮点型的指针
2 如何使用指针?(指针使用流程)
* 定义指针变量
* 为指针变量赋值
* 访问指针变量中指向地址的值
* 获取指针的值:在指针类型的变量前加* 号,(前缀)来获取指针所指向的内容。
获取一个指针意味着访问指针指向的变量的值。语法是:*a
脚本示例
package main
import (
"fmt"
)
func main() {
// 定义一个实际变量
a := 120
// 声明一个指针变量
var ip *int
// 给指针变量赋值,将变量a的地址赋值给ip
ip = &a
// 打印类型和值
fmt.Printf("a 的类型是%T,值是%v\n",a,a)
fmt.Printf("&a 的类型是%T,值是%v\n",&a,&a)
fmt.Printf("ip 的类型是%T,值是%v\n",ip,ip)
fmt.Printf("*ip 的类型是%T,值是%v\n",*ip,*ip)
fmt.Printf("*&a 的类型是%T,值是%v\n",*&a,*&a)
}
/*
a 的类型是int,值是120
&a 的类型是*int,值是0xc000070090
ip 的类型是*int,值是0xc000070090
*ip 的类型是int,值是120
*&a 的类型是int,值是120
*/
<三> 复合数据类型指针及空指针
1 复合类型指针
脚本示例
package main
import "fmt"
type students struct {
name string
age int
marrid bool
sex int8
}
func main() {
stud_1 := students{"zhangsan",35,true,1}
stud_2 := students{"xiaohong",20,false,0}
var a *students = &stud_1
var b *students = &stud_2
fmt.Printf("\n------------------------------------------------\n")
fmt.Printf("stud_1的类型为%T,值为%v\n",stud_1,stud_1)
fmt.Printf("stud_2的类型为%T,值为%v\n",stud_2,stud_2)
fmt.Printf("\n------------------------------------------------\n")
fmt.Printf("a的类型为%T,值为%v\n",a,a)
fmt.Printf("b的类型为%T,值为%v\n",b,b)
fmt.Printf("\n------------------------------------------------\n")
fmt.Printf("*a的类型为%T,值为%v\n",*a,*a)
fmt.Printf("*b的类型为%T,值为%v\n",*b,*b)
fmt.Printf("\n------------------------------------------------\n")
fmt.Println(stud_1.name,stud_1.age,stud_1.marrid,stud_1.sex)
fmt.Println(a.name,a.age,a.marrid,a.sex)
fmt.Println((*a).name,(*a).age,(*a).marrid,(*a).sex)
fmt.Println(&a.name,&a.age,&a.marrid,&a.sex)
}
/*
------------------------------------------------
stud_1的类型为main.students,值为{zhangsan 35 true 1}
stud_2的类型为main.students,值为{xiaohong 20 false 0}
------------------------------------------------
a的类型为*main.students,值为&{zhangsan 35 true 1}
b的类型为*main.students,值为&{xiaohong 20 false 0}
------------------------------------------------
*a的类型为main.students,值为{zhangsan 35 true 1}
*b的类型为main.students,值为{xiaohong 20 false 0}
------------------------------------------------
zhangsan 35 true 1
zhangsan 35 true 1
*/
2 空指针
1)go空指针:
* 当一个指针被分配后没有分配到任何变量时,它的值为nil
* nil指针也称为空指针
* nil在概念上和其他语言的null,None,NULL一样,都指代零值或空值
* 一个指针变量通常缩写为ptr
脚本示例
package main
import "fmt"
func main() {
var ptr *int
fmt.Println("ptr类型为%T,值为%v\n",ptr,ptr)
if ptr == nil {
fmt.Println("ptr为空指针")
} else {
fmt.Println("ptr为非空指针")
}
}
/*
ptr类型为*int,值为<nil>
ptr为空指针
*/