🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 一、指针 什么是指针:一个指针变量指向了一个值的内存地址。 Go 语言的取地址符是 &,放到一个变量前使用就会返回相应变量的内存地址。 类似于变量和常量,在使用指针前你需要声明指针。指针声明格式如下: &:对值取地址 *:对地址取值 ~~~ var var_name *var-type ~~~ ~~~ var ip *int /* 指向整型*/ var fp *float32 /* 指向浮点型 */ ~~~ ![](https://img.kancloud.cn/2e/fc/2efca102fc0f45f222a9b4532a9a03f5_663x449.png) ~~~ package main import "fmt" func main() { var a int = 10 fmt.Printf("变量的地址: %x\n", &a) } ~~~ 执行结果: 变量的地址: c0000140a8 ## 二、如何使用指针 在指针类型前面加上 \* 号(前缀)来获取指针所指向的内容。 ~~~ package main import "fmt" func main() { var a int = 20 /* 声明实际变量 */ var ip *int /* 声明指针变量 */ ip = &a /* 指针变量的存储地址 */ fmt.Printf("a 变量的地址是: %x\n", &a) /* 指针变量的存储地址 */ fmt.Printf("ip 变量储存的指针地址: %x\n", ip) /* 使用指针访问值 */ fmt.Printf("*ip 变量的值: %d\n", *ip) } ~~~ 执行结果: a 变量的地址是: c0000140a8 ip 变量储存的指针地址: c0000140a8 *ip 变量的值: 20 ## 三、指向指针的指针 指向指针的指针变量声明格式如下: ~~~ var ptr **int; ~~~ ~~~ package main import "fmt" func main() { var a int var ptr *int var pptr **int a = 3000 /* 指针 ptr 地址 */ ptr = &a /* 指向指针 ptr 地址 */ pptr = &ptr /* 获取 pptr 的值 */ fmt.Printf("变量 a = %d\n", a ) fmt.Printf("指针变量 *ptr = %d\n", *ptr ) fmt.Printf("指向指针的指针变量 **pptr = %d\n", **pptr) } ~~~ 执行结果: 变量 a = 3000 指针变量 *ptr = 3000 指向指针的指针变量 **pptr = 3000 ## 四、指针作为函数参数 ~~~ package main import "fmt" func main() { /* 定义局部变量 */ var a int = 100 var b int = 200 fmt.Printf("交换前 a 的值 : %d\n", a) fmt.Printf("交换前 b 的值 : %d\n", b) /* 调用函数用于交换值 * &a 指向 a 变量的地址 * &b 指向 b 变量的地址 */ swap(&a, &b) fmt.Printf("交换后 a 的值 : %d\n", a) fmt.Printf("交换后 b 的值 : %d\n", b) } func swap(x *int, y *int) { var temp int temp = *x /* 保存 x 地址的值 */ *x = *y /* 将 y 赋值给 x */ *y = temp /* 将 temp 赋值给 y */ } ~~~ 执行结果: 交换前 a 的值 : 100 交换前 b 的值 : 200 交换后 a 的值 : 200 交换后 b 的值 : 100