美文网首页
Go语言 指针

Go语言 指针

作者: 超级皮波9 | 来源:发表于2018-09-27 16:36 被阅读0次

指针

概念

  1. Go语言的指针和C语言一样也是用来保存地址的变量
  • 格式
var p *int

普通指针

package main

import "fmt"

func main() {

    var num int = 666

    var p *int = &num  // 定义指针p 保存num的内存地址

    fmt.Println("&num = ",&num)   // &num =  0xc042060080
    fmt.Println(" p = ",p)      //p = 0xc042060080
       
    // *p = 666   和C语言一样可以通过*P 去访问和修改 储存的空间
    
    (*p) = 888

    fmt.Println("num = ",num)  // num =888

}

指向数组的指针

注意点

  1. GO语言中只有数据类型一样 才能赋值
  2. go语言中&数组名 和数组首元素保存的地址是一样,但是数据类型是不一样,所以Go语言中指向数组的指针只能通过&数组名来创建指针
  3. 可以通过指针来间接操作数组
  4. 指向数组的指针不支持+1操作
package main

import "fmt"

func main() {

    var arr [3]int = [3]int{1,2,3}

    //获取数组的地址
    fmt.Printf("%p\n",arr)    // arr = %!p([3]int=[1 2 3])
    fmt.Printf("%p\n",&arr)   // &arr= 0xc04200e360
    fmt.Printf("%p\n",&arr[0])  // &arr[0] = 0xc04200e360

    // 获取数组的数据类型
    fmt.Printf("%T\n",&arr)      // &arr = *[3]int
    fmt.Printf("%T\n",&arr[0])  // &arr[0] = *int

    // 所以只能创建*[3]int 的指针类型来保存数组的地址 切只能通过&arr来赋值
    var pArr *[3]int = &arr

    fmt.Println((*pArr))  // *parr = [1 2 3]

}

指向切片的指针

  • 切片的底层是一个结构体,这个结构体有一个属性时指针类型
package main

import "fmt"

func main() {

    var sce []int = []int{1,2,3}

    fmt.Printf("%p\n",sce)  // sce = 0xc04205e0c0
    fmt.Printf("%p\n",&sce)  // &sce = 0xc04205a3e0

    fmt.Printf("%T\n",sce)  // sce = []int
    fmt.Printf("%T\n",&sce) // &sce = *[]int
    
}
  • 注意点
  1. 如果打印sce 得到的是结构体中指向数组的那个指针保存的地址
  2. 如果打印&sce的,得到的是这个切片结构体自己本身的内存地址
  3. sce的数据类型是 [ ]int
  4. &sce的数据类型是 *int[ ] , 所以创建指向切片的指针,需要通过&sce来创建
  • 指针访问切片的注意点
package main

import "fmt"

func main() {

    var sce []int = []int{1,2,3}

    fmt.Printf("%p\n",sce)  // sce = 0xc04205e0c0
    fmt.Printf("%p\n",&sce)  // &sce = 0xc04205a3e0

    var p *[]int = &sce

    fmt.Printf("%p\n",p)  // p = 0xc04205a3e0

    fmt.Printf("%p\n",*p)  // *p = 0xc04205e0c0

    //结论 p = &sce  *p = sce

    (*p)[1] = 666

    fmt.Println("sce = ",sce)  // sce =  [1 666 3]
}
结论
  • P == &sce 访问结构体, *P==sce 访问指针指向的数组

指向字典的指针

package main

import "fmt"

func main() {

    var dict map[int]int = map[int]int{0: 7, 1: 9, 2: 14}

    //创建指向字典的指针

    var p *map[int]int

    p = &dict

    (*p)[0] = 99 // 通过指针修改字典第1个key所对应的值

    fmt.Println("dict = ", dict) // dict =  map[0:99 1:9 2:14]

}
  • 注意点
    指向切片的指针也只能通过 (*P) 来访问和修改切片

指向结构体的指针

package main

import "fmt"

func main() {

    type Person struct{
        name string
        age int
        Characteristic string
    }
     // 创建结构体变量
    var footballSart Person = Person{"小罗",32,"技术"}
    //创建指向结构体的指针
    var p *Person = &footballSart

    p.name = "范佩西"
    p.age = 33
    (*p).Characteristic = "射门"

    fmt.Println("footballStar = ",footballSart)  //footballStar =  {范佩西 33 射门}
}
  • 指向结构体的指针可以通过p和*p来访问和修改结构体的属性

指针作为函数的参数和返回值

  • 参数
package main

import "fmt"

func main() {

    num := 123

    fmt.Println("打印前num = ",num)  // num = 123

    change(&num)

    fmt.Println("打印后num = ",num) // num = 666

}

func change(value *int){
    *value = 666
}
  • 返回值
    如果指针作为返回值,指向的是一个局部变量的话 不建议这样写 因为运行完局部变量就释放了

相关文章

  • go语言值传递与指针传递

    go语言指针 go语言作为静态编译型语言,具有指针类型,但是不提供对指针的移位危险操作,防止指针的越界等问题。 g...

  • Go语言-指针

    Go语言中的指针不同于C语言,Go语言的指针使用方法要简单很多。当然和C语言从指针定义到指针的使用都有很大的不同。...

  • Go语言 指针

    指针 概念 Go语言的指针和C语言一样也是用来保存地址的变量 格式 普通指针 指向数组的指针 注意点 GO语言中只...

  • go语言指针类型的使用

    go语言的指针类型 简单地说go语言的指针类型和C/C++的指针类型用法是一样的,除了出去安全性的考虑,go语言增...

  • Golang:关于寻址的一些问题

    Go 语言有点像 C 语言,它有指针,用 * 标识一个指针,用 & 标识一个地址,但 Go 语言的指针比较简单,没...

  • go 语言指针

    go 语言指针 go 语言的参数传递全部都是 值传递 用一个交换的例子学习指针

  • Golang 指针

    指针 区别于C/C++中的指针,Go语言中的指针不能进行偏移和运算,是安全指针。Go语言当中的指针涉及到三个点:指...

  • Go语言入门总结(六)-指针

    指针 1.&和* 在go语言中,也有指针的概念,不同于java。是没有指针的概念的。但是go语言的指针也并没有c中...

  • 13-Go语言指针和方法

    指针 普通数据类型指针 Go语言中的普通指针和C语言中的普通指针一样, 通过指针也可以间接操作指向的存储空间 Go...

  • Go语言基础之指针

    区别于C/C++中的指针,Go语言中的指针不能进行偏移和运算,是安全指针。 要搞明白Go语言中的指针需要先知道3个...

网友评论

      本文标题:Go语言 指针

      本文链接:https://www.haomeiwen.com/subject/gmueoftx.html