比如我们定义了一个变量 a := 10 ,这个时候可以直接通过 a 这个变量来读取内存中保存的 10 这个值。
在计算机底层 a 这个变量其实对应了一个内存地址。
指针也是一个变量,但它是一种特殊的变量,它存储的数据不是一个普通的值,而是另一个变量的内存地址。
Go 语言中的指针操作非常简单,我们只需要记住两个符号:&(取地址)和 *(根据地址取值)
1 2 3 4 5 6 7 8
package main import"fmt" funcmain() { var a = 10 fmt.Printf("%d \n",&a) // &a 指针地址 (824633761976) fmt.Printf("%d \n",*&a) // *&a 指针取值 (10) fmt.Printf("%T \n",&a) // %T 指针类型 (*int ) }
02.&取变量地址
2.1 &符号取地址操作
每个变量在运行时都拥有一个地址,这个地址代表变量在内存中的位置。
Go 语言中使用&字符放在变量前面对变量进行取地址操作。
Go 语言中的值类型(int、float、bool、string、array、struct)都有对应的指针类型
取变量指针的语法如下:
1
ptr := &v // 比如 v 的类型为 T
1
v : 代表被取地址的变量,类型为 T
ptr : 用于接收地址的变量,ptr 的类型就为T,称做 T 的指针类型。代表指针。
1 2 3 4 5 6 7 8 9
package main import"fmt" funcmain() { var a = 10 var b = &a fmt.Printf("a:%d ptr:%p\n", a, &a) // a:10 ptr:0xc0000100a8 fmt.Printf("b:%v type:%T\n", b, b) // b:0xc0000100a8 type:*int fmt.Println("取 b 的地址:", &b) // 取 b 的地址: 0xc000006028 }
2.2 b := &a 的图示
03.指针修改数据
3.1 *指针取值
在对普通变量使用&操作符取地址后会获得这个变量的指针,然后可以对指针使用操作,也就是指针取值
1 2 3 4 5 6 7 8 9 10
package main import"fmt" funcmain() { a := 10 b := &a // 取变量 a 的地址,将地址保存到指针 b 中 fmt.Printf("type of b:%T\n", b) // type of b:*int c := *b // 指针取值(根据指针的值去内存取值) fmt.Printf("type of c:%T\n", c) // type of c:int fmt.Printf("value of c:%v\n", c) // value of c:10 }
变量、指针地址、指针变量、取地址、取值的相互关系和特性如下:
xxxxxxxxxx package mainimport ( “fmt” “sort”)func main() { // 第一:生成字典,scoreMap var scoreMap = make(map[string]int, 200) for i := 0; i < 10; i++ { key := fmt.Sprintf(“stu%02d”, i) //生成 stu 开头的字符串 scoreMap[key] = i } // 第二:取出 map 中的所有 key 存入切片 keys var keys = make([]string, 0, 200) for key := range scoreMap { keys = append(keys, key) } // 第三:对切片进行排序 sort.Strings(keys) // 第四:按照排序后的 key 遍历 map for _, key := range keys { fmt.Println(key, scoreMap[key]) }}/*stu00 0stu01 1stu02 2stu03 3stu04 4stu05 5stu06 6stu07 7stu08 8stu09 9 */go