玩转Go语言之指针

257 阅读3分钟

代码:github.com/codeXiaoQia…

1.普通指针

//1.普通指针
var num int = 666;

var value float32 = 13.34

var flag bool = true

//定义指针
var p *int
p = &num
*p = 777
Println(num)

var p1 *float32
p1 = &value
*p1 = 1.777
Println(value)


var p2 *bool
p2 = &flag
*p2 = false
Println(flag)

总结:

1.普通指针
Go语言中的普通指针和C语言中的普通指针一样, 通过指针也可以间接操作指向的存储空间
C语言中指针的格式  int *p
Go语言中指针的格式 var p *int

2.指向数组的指针

//定义一个数组
var arry [4]int = [4]int{1,2,3,4}

//定义一个指向数组指针
var p *[4]int

//指针指向数组
p = &arry

//打印指针,数组的地址
Printf("arry = %p\n,arry[0] = %p\n, p = %p\n",&arry,&arry[0],p)

//打印结果
//arry = 0xc42008c020
//,arry[0] = 0xc42008c020
//, p = 0xc42008c020

//修改数字值
p[0] = 111

//打印数组
Println(arry)//[111 2 3 4]

总结:

2.指向数组的指针
2.1Go语言中指向数组的指针和C语言中指向数组的指针差不多, 通过指针也可以间接操作数组
C语言中指向数组指针的格式   int[3] *p
Go语言中指向数组指针的格式 var p *[3]int
2.2和C语言, 只要一个指针指向数组之后, 就可以通过指针来操作数组
格式: (*p)[0]    /    p[0]

注意点: C语言中数组名/&数组名/&数组首元素 都是同一个地址
        Go语言中&数组名/&数组首元素 都是同一个地址, 但是通过数据名不能直接获取数组的地址
注意点: 在Go语言中只有相同类型的数据才能赋值
注意点: 在Go语言中指向数组的指针不支持+1 -1的操作

3.指向切片的指针

//定义一个切片
var sce []string = []string{"zhangsan","lisi","wangwu"}

//定义一个指向切片的指针
var p *[]string

//指针指向切片
p = &sce

//修改切片的值
(*p)[0] = "hhah"

//打印切片的值
Println(sce)

//打印地址
Printf("p = %p\n sce = %p",*p,sce)

//p = 0xc42007a180
//sce = 0xc42007a180

总结:

3.指向切片的指针
   3.1一定要清楚切片的本质是一个结构体, 结构体中的一个属性是指针, 这个指针指向了底层的一个数组

注意点:
如果一个指针指向了数组, 那么可以通过 (*p)[0]和p[0]来操作指向的数组
但是如果一个指针指向了切片, 只能通过(*p)[0]来操作指向的切片

4.指向字典的指针

//定义一个字典
var dict map[string]string
dict =  map[string]string{"name":"zhangsan"}

//定义一个指向字典的指针
var p *map[string]string

//给指针赋值
p = &dict

//操作指针
(*p)["name"] = "lisi"

//打印地址
Printf("p = %p, dict = %p, &dict = %p", p, dict,&dict)

//打印结果
//p = 0xc42008e020, dict = 0xc42007e180, &dict = 0xc42008e020

总结:

4.指向字典的指针
和普通指针一样, 只能通过(*p)[key]来操作字典

5.指向结构体的指针

type Person struct {
   name string
   age int
}
var per Person = Person{"lnj", 18}
var p *Person
p = &per
//(*p).name = "zs"
p.name = "zs"
fmt.Println(per)

总结:

5.指向结构体的指针
和C语言中指向结构体的指针一样, 可以通过(*p).attr和p.attr来操作结构体

6.指针作为函数的参数,与返回值

func main() {

   num := 124
   change(&num)
   Println(num)

   p := getP()
   println(*p)

}

func getP() *int {
   num1 := 3
   p := &num1
   return p
}

func change(p *int)  {
   *p = 11
}

总结:

6.指针作为函数的参数和返回值
6.1指针作为函数的参数和C语言一样, 修改形参会影响实参
6.2指针作为函数的返回值, 如果指针指向的是一个局部变量, 那么不建议返回
因为当函数调用完毕局部变量就释放了