zoukankan      html  css  js  c++  java
  • Go的指针

    指针

    指针是一种存储变量内存地址(Memory Address)的变量。

    1 取一个变量的地址:&  取地址符号
    2 在非指针类型前面加*,表示指向这个类型的指针
    3 在指针变量前加*,表示解引用(反解),取该指针指向的值
    

    一、指针的声明

    var a = 10
    // 取地址,生成指针
    var pointer = &a
    fmt.Println(pointer)  // 0xc00000a0c8
    // 指针类型为 *+普通类型
    fmt.Printf("%T",pointer)  // *int
    

    二、指针的默认值(Zero Value)

    是 nil。

    因为指针也是引用类型。

    var b *int
    fmt.Println(b)
    // <nil>
    

    三、指针的解引用

    在指针变量前加*,表示解引用(反解),取该指针指向的值。

    var a = 10
    var pointer = &a
    // 解引用
    fmt.Println(*pointer)  // 10
    

    四、向函数传递指针参数

    1、非 数组/切片 指针传参

    var b =156
    fmt.Println(b)  // 156
    f1(&b)          // 100
    fmt.Println(b)  // 100
    
    func f1(x *int)  {
    	*x=100
    	fmt.Println(*x)  // 100
    }
    

    2、数组/切片 指针传参

    不推荐向函数传递数组的指针,而应该使用切片。

    因为切片的长度是不固定的,可以随意变化其引用的数组的长度;而如果是数组的指针,那长度就是固定的,无法变换类型了。

    var c =[3]int{1,2,3}
    fmt.Println(c)  // [1 2 3]
    f3(c[:])
    fmt.Println(c)  // [100 2 3]
    
    func f3(x []int)  {
    	x[0]=100
    	fmt.Println(x)  // [100 2 3]
    }
    
    
    // 不过硬要传数组的指针也可以
    var c =[3]int{1,2,3}
    fmt.Println(c)  // [1 2 3]
    f2(&c)
    fmt.Println(c)  // [100 2 3]
    
    
    func f2(x *[3]int)  {
    	x[0]=100  //支持指针直接操作,自动反解,自动解引用
    	//(*x)[1] = 222  //正统写法
    	fmt.Println(*x)  // [100 2 3]
    	fmt.Println(x)  // &[100 2 3]  //指向数组的指针,就这样
    }
    

    五、Go不支持指针运算

    Go 并不支持其他语言(例如 C)中的指针运算。

    b := [...]int{109, 110, 111}
    p := &b
    p++
    

    上面的程序会抛出编译错误:main.go:6: invalid operation: p++ (non-numeric type *[3]int)

  • 相关阅读:
    idea主题更换pycharm/intellij
    随机生成n张扑克牌。
    JAVA生成6个1-8的随机数,要求无重复。
    一道简单 的循环
    linux虚拟机互访
    linux中grep命令
    vi和vim编辑器
    文件压缩打包以及备份
    文件内容查询
    目录相关操作
  • 原文地址:https://www.cnblogs.com/bowendown/p/12595112.html
Copyright © 2011-2022 走看看