Go 语言 指针的使用
一、基本介绍:
-
基本数据类型,变量存的就是值,也叫值变量;
-
获取变量的地址,用 &;
var in int ,获取 i 内存地址:&i
package main import ( "fmt" _"strconv" ) // go 中 指针类型 func main(){ // 基本数据类型内存布局 var i int = 66 // i 的内存地址 使用 & fmt.Printf("i的内存地址是=%v", &i) } // 输出结果 i的内存地址是=0xc0000100c0
如图所示:
-
指针类型,指针变量存的是一个地址,地址指向的空间存的才是值;
var ptr *int = &num
举栗子:指针在内存中的布局
package main import ( "fmt" _"strconv" ) // go 中 指针类型 func main(){ // 基本数据类型在内存布局 var i int = 66 // i 的内存地址是 fmt.Printf("i的内存地址=%v\n", &i) // 下面的 var ptr *int = &i // 1.ptr 是一个指针变量 // 2.ptr 的类型是 int // 3.ptr 本身值 &i var ptr *int = &i fmt.Printf("ptr=%v\n", ptr) fmt.Printf("ptr地址=%v\n", &ptr) } // 输出结果 i的内存地址=0xc0000100c0 ptr=0xc0000100c0 ptr地址=0xc000006030
如图所示:
-
获取指针类型所指向的值,使用
*
;var ptr *int, 使用 *ptr 获取 ptr 指向的值
package main import ( "fmt" _"strconv" ) // go 中 指针类型 func main(){ // 基本数据类型在内存布局 var i int = 66 var ptr *int = &i // 获取指针所指向的值 fmt.Printf("获取ptr指针指向的值=%v", *ptr) } // 输出结果 获取ptr指针指向的值=66
-
举个案例:
package main import ( "fmt" _"strconv" ) // go 中 指针类型 func main(){ // 基本数据类型在内存布局 var num int = 123 var i = 99 var ptr *int = &i fmt.Printf("获取 num 的内存地址=%v\n", &num) fmt.Printf("获取 i 的内存地址=%v\n", &i) fmt.Printf("获取 ptr 变量指针=%v\n", ptr) fmt.Printf("获取 ptr 的内存地址=%v\n", &ptr) fmt.Printf("获取 ptr 指针指向的值=%v\n", *ptr) } // 输出结果 获取 num 的内存地址=0xc0000100c0 获取 i 的内存地址=0xc0000100c8 获取 ptr 变量指针=0xc0000100c8 获取 ptr 的内存地址=0xc000006028 获取 ptr 指针指向的值=99
如图所示:
二、指针案例:
1.案例:
-
写一个程序,获取一个 int 变量 num 地址,并显示到终端;
-
将 num 的地址赋给指针 ptr ,并通过 ptr 去修改 num 的值;
代码实现:
package main import ( "fmt" _"strconv" ) // go 中 指针类型 func main(){ // 写一个程序,获取一个int 变量 num 的地址,并显示到终端 var num int = 666 fmt.Printf("num 变量 地址=%v\n", &num) var ptr *int = &num *ptr = 888 fmt.Printf("num 的值是=%v", num) } // 输出结果 num 变量 地址=0xc00006e068 num 的值是=888
如图所示:
2.练习:
第一题:
func main(){
var num int = 666
fmt.Printf("num 变量 地址=%v\n", &num)
var ptr *int = num // 这里报错
*ptr = 888
fmt.Printf("num 的值是=%v", num)
}
错误原因:
指针变量,接收的是地址,而不可以是一个值;
var ptr *int = &num
第二题:
func main(){
var num int = 666
fmt.Printf("num 变量 地址=%v\n", &num)
var ptr *float64 = &num // 这里报错
*ptr = 888
fmt.Printf("num 的值是=%v", num)
}
错误原因:
指针 指向的类型 是float64,接收的内存地址 存储的 值类型 也必须是 float64,不可以是int
var num float64 = 666.66
第三题:
func main(){
var a int = 300
var b int = 400
var ptr *int = &a // 指针 ptr 指向 a 的内存地址
*ptr = 100 // 将 ptr 指针 指向 的内存地址 值进行修改成100 a = 100
ptr = &b // 变量ptr 存的是 a 内存地址 将 b 的内存地址赋给变量 ptr 修改了 b 的存储地址
*ptr = 200 // 将 ptr 指针指向 的内存地址 值进行修改成 200 b = 200
fmt.Printf("a=%d, b=%d, *ptr=%d", a, b, *ptr)
}
// 输出结果:
a="100", b="200", *ptr="200"
三、指针的使用细节:
-
值类型,都有对应的指针类型,形式为
*数据类型
;比如: int 对应的指针 就是*int,float32 对应的指针就是 *float32;依此类推
-
值类型
包括:基本数据类型 int系列、float系列、bool、string、数组、结构体;