• Golang基础复合类型—指针


    一、指针简介

    1.指针概念

    指针也是一个变量,它是一种特殊的变量,因为它存储的数据不仅仅是一个普通的值,而是另一个变量的内存地址

    2.内存地址

    变量p是一个指针,它存储的是变量a 的内存地址,而不是a的值。

    二、指针的定义 

    1.语法

    var 指针变量名 *类型
    1. package main
    2. import "fmt"
    3. func main() {
    4. var a int = 10
    5. var p *int
    6. p = &a
    7. fmt.Println(&a) //变量a的内存地址
    8. fmt.Println(p) //变量a的内存地址
    9. fmt.Println(*p) //变量a的值
    10. fmp.println(&p) //变量p的内存地址
    11. }

     输出:

    0xc0000aa058
    0xc0000aa058
    10
    0xc0000ce018

    2.通过指针间接修改变量的值

    1. package main
    2. import "fmt"
    3. func main() {
    4. var a int = 10
    5. fmt.Println(a)
    6. var p *int = &a
    7. *p = 999
    8. fmt.Println(a)
    9. }

    输出:

    10
    999

    三、指针操作的注意事项

    1.空指针

    1. package main
    2. import "fmt"
    3. func main() {
    4. var p *int
    5. fmt.Println(p)
    6. }

    输出:

     

    2.不要操作没有合法指向的内存

    1. package main
    2. import "fmt"
    3. func main() {
    4. var p *int
    5. *p = 56
    6. fmt.Println(p)
    7. }

    输出:

     panic: runtime error: invalid memory address or nil pointer dereference

    3.new函数使用

    1. package main
    2. import "fmt"
    3. func main() {
    4. var p *int
    5. //开辟数据类型对应的内存空间,返回值为数据类型的指针
    6. p = new(int)
    7. *p = 56
    8. fmt.Println(*p)
    9. }

    输出:

    56

    四、指针作为函数参数

    在函数中修改变量值,怎样影响原有的变量?

    1. package main
    2. import "fmt"
    3. func main() {
    4. var num int = 10
    5. Update(&num)
    6. fmt.Println(num)
    7. }
    8. func Update(p *int) {
    9. *p = 999
    10. }

     五、数组指针

    1.概念与基本使用

    1. package main
    2. import "fmt"
    3. func main() {
    4. nums := [10]int{1,2,3,4,5,6,7,8,9,10}
    5. var p *[10]int
    6. p =&nums
    7. fmt.Println(*p)
    8. fmt.Println((*p)[0]) //[]的运算优先级高于*
    9. fmt.println(p[0]) //go语言优势
    10. }

    输出:

     [1 2 3 4 5 6 7 8 9 10]
    1
    1

    2.将数组指针作为函数参数

    1. package main
    2. import "fmt"
    3. func main() {
    4. nums := [10]int{1,2,3,4,5,6,7,8,9,10}
    5. Update(&nums)
    6. fmt.Println(nums)
    7. }
    8. func Update(arr*[10]int) {
    9. arr[0] = 999
    10. }

    输出:

    [999 2 3 4 5 6 7 8 9 10]

    六、指针数组

    1.概念

    数组元素是是指针类型

    指针数组指的是一个数组中存储的都是指针(也就是地址),也就是一个存储了地址的数组。

    2.基本操作

    1. package main
    2. import "fmt"
    3. func main() {
    4. var P[2]*int
    5. var i,j int = 10, 20
    6. P[0] = &i
    7. P[1] = &j
    8. fmt.Println(P)
    9. fmt.Println(*P[0],",",*P[1])
    10. }

    输出:

    [0xc0000aa058 0xc0000aa070]
    10 , 20


    七、指针与切片

    1.概念

    定义指针,指向切片

    2.基本操作

    1. package main
    2. import "fmt"
    3. func main() {
    4. s := []int{1,2,3,4,5}
    5. var p *[]int = &s
    6. fmt.Println(*p)
    7. fmt.Println((*p)[0])
    8. //fmt.Println(p[0]) 不支持这样简写
    9. //修改值
    10. (*p)[0] = 999
    11. fmt.Println(*p)
    12. //循环遍历
    13. for i:=0;i<len(*p);i++{
    14. fmt.Print((*p)[i]," ")
    15. }
    16. fmt.Println()
    17. for index,value := range *p{
    18. fmt.Print(index,":",value," ")
    19. }
    20. }

    输出:

    [1 2 3 4 5]
    1
    [999 2 3 4 5]
    999 2 3 4 5 
    0:999  1:2  2:3  3:4  4:5  

    八、指针与结构体

    1.概念

    定义指针,指向结构体

    2.基本操作

    1. package main
    2. import "fmt"
    3. type Student struct {
    4. id int
    5. name string
    6. age int
    7. addr string
    8. }
    9. func main() {
    10. stu := Student{101,"Mike",18,"beijing"}
    11. var p *Student
    12. p = &stu
    13. fmt.Println(*p)
    14. fmt.Println((*p).id) // . 的优先级高于*
    15. fmt.Println(p.name) //可以优化简写
    16. //修改结构体的值
    17. p.age = 20
    18. fmt.Println(*p)
    19. }

    输出:

    {101 Mike 18 beijing}
    101
    Mike
    {101 Mike 20 beijing}


    3.作为函数参数

    1. package main
    2. import "fmt"
    3. type Student struct {
    4. id int
    5. name string
    6. age int
    7. addr string
    8. }
    9. func main() {
    10. stu := Student{101,"Mike",18,"beijing"}
    11. Update2(stu)
    12. fmt.Println("未使用指针结果:",stu)
    13. Update1(&stu)
    14. fmt.Println("使用指针结果:",stu)
    15. }
    16. func Update1(stu *Student) {
    17. stu.addr = "上海"
    18. }
    19. func Update2(stu Student) {
    20. stu.addr = "上海"
    21. }

    输出:

    未使用指针结果: {101 Mike 18 beijing}
    使用指针结果: {101 Mike 18 上海}
     

    九、多级指针

    1. package main
    2. import "fmt"
    3. func main() {
    4. var a int = 10
    5. var p *int
    6. p = &a
    7. var pp **int
    8. pp = &p
    9. fmt.Println("a=",a," p=",p," *p=",*p," pp=",pp," *pp=",*pp," **pp=",**pp)
    10. **pp = 20
    11. fmt.Println(a)
    12. }

    输出:

    a= 10  p= 0xc0000aa058  *p= 10  pp= 0xc0000ce018  *pp= 0xc0000aa058  **pp= 10
    20

     

     

  • 相关阅读:
    23种设计模式(十五)解释器模式(阁瑞钛伦特软件-九耶实训)
    用CI/CD工具Vela部署Elasticsearch + C# 如何使用
    30-cookie和session模式
    Java线程学习入门(二)
    docker 跨平台构建镜像
    ads131a04 ADC verilog实现及仿真
    学习如何读论文的一些磨刀不误砍柴工
    我的DW个人网站设计——安徽宣城6页HTML+CSS+JavaScript
    使用Python自动化收集和处理视频资源的教程
    【毕业设计】机器视觉图像畸变校正系统 - python OpenCV
  • 原文地址:https://blog.csdn.net/weixin_41551445/article/details/126317893