Go 语言 指针的使用

Go 语言 指针的使用

一、基本介绍:

  1. 基本数据类型,变量存的就是值,也叫值变量

  2. 获取变量的地址,用 &

    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
    

    如图所示
    在这里插入图片描述

  3. 指针类型,指针变量存的是一个地址,地址指向的空间存的才是值

    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
    

    如图所示
    在这里插入图片描述

  4. 获取指针类型所指向的值,使用 *

    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
    
  5. 举个案例:

    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.案例:

  1. 写一个程序,获取一个 int 变量 num 地址,并显示到终端;

  2. 将 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"

三、指针的使用细节:

  1. 值类型,都有对应的指针类型,形式为*数据类型

    比如: int 对应的指针 就是*int,float32 对应的指针就是 *float32;依此类推

  2. 值类型包括:基本数据类型 int系列、float系列、bool、string、数组、结构体

发布了147 篇原创文章 · 获赞 170 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/Fe_cow/article/details/103841328