c语言编程笔录

首页 >   > 笔记大全

笔记大全

golang 指针不同

更新时间:2023-10-28

什么是指针?

指针是一个值,它指向一个内存地址,这个内存地址存放着值的实际内容。通过指针,程序员可以直接访问或修改内存地址的内容,这使得指针在编译高效的代码和操作系统编程方面扮演了重要角色。在Go语言中,指针默认是不可见的。

//go语言指针的声明
var ptr *type

指针与值类型的区别

值类型(int、bool等基本类型、数组、结构体等)表示的是实际的内容。当对值类型进行传递、赋值等操作时,都是将这个实际的内容拷贝一份传递给它。这样可以确保对这个值的操作不对实际内容产生影响。

而指针类型并不是实际内容本身,它是一个对内存地址的引用。运行时,指针变量内部存储的是所指向值的地址。通过指针我们可以访问或修改这个值,即所指向的内存地址中的实际内容。

//指针和值类型的区别
package main

import "fmt"

func main() {
    var i int = 100
    var p *int
    p = &i  //对指针赋值
    i = *p  //对指针取值

    fmt.Printf("i 的值为:%d\n", i)
    fmt.Printf("指针 p 指向的值为:%d\n", *p)
}

指针的操作

Go语言中的指针操作和C语言十分相似。需要注意的是,在Go语言中,指针变量的默认值是nil,即一个未指向任何地址的指针。

Go语言中的“&”运算符用于获取一个值的内存地址,而“*”运算符可以用于指针取值或指针变量定义。使用“new()”函数可以根据所需类型为指针分配内存空间,而“make()”函数则是为slice、map、channel分配内存空间。

//指针操作示例
package main

import "fmt"

func main() {
    var ptr *string
    var str string = "hello world"
    ptr = &str
    fmt.Printf("ptr 的地址为:%x\n", ptr)
    fmt.Printf("ptr 指向的值为:%s\n", *ptr)

    var value *int = new(int)  //根据所需类型分配内存空间,并返回类型指针
    *value = 10
    fmt.Printf("value 的值为:%d\n", *value)

    slice := make([]int, 5)  //为slice分配内存空间
    fmt.Println("初始化后的切片为:", slice)
}

指针的用途

指针在Go语言中多数时候用于性能优化,或者在需要修改函数参数时传递函数参数。另外,Go语言中的gc垃圾回收器会对无引用的内存空间进行回收,因而如果程序中使用了大量内存,会造成频繁回收gc影响性能的情况。使用指针可以解决这个问题。

另外,指针还可以用于实现数据结构,比如链表等。Go语言的slice类型就是通过指针实现的,它既可以被看做指向数组的指针,也可以看做动态数组来使用。

//指针的用途示例
package main

import "fmt"

func swap(x *int, y *int) {
    var temp int
    temp = *x
    *x = *y
    *y = temp
}

func main() {
    var a int = 100
    var b int = 200

    fmt.Printf("交换前的值为:a = %d, b = %d\n", a, b)
    swap(&a, &b)
    fmt.Printf("交换后的值为:a = %d, b = %d\n", a, b)

    slice := []int{1, 2, 3}
    var slicePtr *[]int = &slice
    fmt.Printf("slice第一个元素:%d\n", (*slicePtr)[0])
}