什么是指针
普通变量:先回想一下前面学习的普通变量。
// 普通变量 str
// 直接输出 str 就可以看到我们存储的内容 "张三"
str := "张三"
指针变量:存储的是值对应内存的地址。对 普通变量 使用 `&` 符就是取普通变量的地址,可以赋值给指针变量。
str := "张三"
name := &str
我们可以把`变量存储`比喻成去饭店吃饭,比如我们团建人比较多,我们先预定了一个包间(分配存储的空间)。我们预定完包间后,服务员问我怎么称呼,我告诉他我叫“张三”,服务员告诉我,给我预留的包间名叫 “风花雪月”, 那么相当于代码中的 "风花雪月" := "张三"。我们下班直接去饭店的“风花雪月”包间,服务员就会问,是“张三”先生一起的?这个就相当于 直接输入 fmt.Println(`变量:风花雪月`) 得到的结果是 `张三`。
指针就类似 `风花雪月` 包间对应 饭店中的位置,如果说 我们去饭店了问服务器 `风花雪月` 包间怎么走,服务员说:2楼第1个包间。其实这个 2楼第1个包间 就是 ` name := &风花雪月 ` ,当我们输出 fmt.Println(name) 时,结果是 `2楼第1个包间`,如果我们想知道 2楼第1个包间 是哪位先生预定的 就在指针变量前面加上 `*` ,即 fmt.Println(*name) ,结果就是 "张三"。
指针变量相关的两个符号:
// 变量使用 & ,称做取地址,得到的结果可赋值给指针变量
&:
var str string = "张三"
name := &str
// 打印指针变量正常输出的是地址,想输出值得在指针变量前加 *
*:
fmt.Println(*name)
指针变量创建
// 1. 隐式定义
var str string = "张三"
name := &str
// 2. 显示定义
var str string = "张三
var name *string
name = &str
// 3 使用new创建,new创建的不同类型就是不同类型的指针变量
var str string = "张三
name := new(string)
name = &str
// 显式不同类型的指针,指针的零值为 nil
var str *string // 字符串指针
var i * int // 整数类型指针
总结
- &str 取地址符可以赋值给指针类型的变量。
- 输出指针变量显示的是内存地址。
- *str输出的是指针变量对应的实际内容。