1. 什么是指针

指针是一个变量,它存储了另一个变量的内存地址。通过指针,我们可以直接访问和修改内存中的值。

2. 声明指针

指针的声明格式如下:

var ptr *Type
  • *Type表示指向类型Type的指针。

例如,声明一个指向整数的指针:

var ptr *int

3. 获取指针的地址

使用取地址符号&来获取变量的地址:

var x int = 10
var ptr *int = &x
fmt.Println(ptr)  // 输出变量x的内存地址

4. 解引用指针

使用解引用操作符*来访问指针指向的变量值:

var x int = 10
var ptr *int = &x
fmt.Println(*ptr)  // 输出: 10

*ptr = 20          // 修改x的值
fmt.Println(x)     // 输出: 20

5. 指针的零值

指针的零值是nil,表示它不指向任何内存地址:

var ptr *int
fmt.Println(ptr)  // 输出: <nil>

6. 指针运算

在Go中,不支持指针的算术运算,如指针加减。可以通过包unsafe进行一些指针运算,但这不是推荐的做法。

7. 函数中的指针

7.1 指针作为函数参数

使用指针作为函数参数,可以在函数内部修改原变量的值:

func modifyValue(val *int) {
    *val = 100
}

func main() {
    x := 10
    modifyValue(&x)
    fmt.Println(x)  // 输出: 100
}

7.2 返回指针

函数可以返回指针:

func newInt() *int {
    x := 10
    return &x
}

func main() {
    ptr := newInt()
    fmt.Println(*ptr)  // 输出: 10
}

8. 指针数组和数组指针

8.1 指针数组

指针数组是一个数组,数组元素是指针:

var arr [3]*int
a, b, c := 1, 2, 3
arr[0] = &a
arr[1] = &b
arr[2] = &c

for _, v := range arr {
    fmt.Println(*v)  // 输出: 1 2 3
}

8.2 数组指针

数组指针是一个指向数组的指针:

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

for i, v := range ptr {
    fmt.Println(i, v)  // 输出: 0 1, 1 2, 2 3
}

9. 使用newmake函数

9.1 new函数

new函数分配内存并返回指向该内存的指针。它用于分配值类型如整数和结构体的内存:

ptr := new(int)
fmt.Println(*ptr)  // 输出: 0
*ptr = 100
fmt.Println(*ptr)  // 输出: 100

9.2 make函数

make函数用于分配和初始化引用类型如切片、映射和通道,不返回指针:

slice := make([]int, 3)
slice[0] = 1
slice[1] = 2
slice[2] = 3
fmt.Println(slice)  // 输出: [1 2 3]

10. 指针的应用场景

  • 节省内存:传递指针而不是拷贝数据,可以节省内存,尤其是当数据量较大时。
  • 提高性能:传递指针避免了复制数据,提高了程序的性能。
  • 共享数据:通过指针不同的函数可以共享数据。

版权声明:如无特殊说明,文章均为本站原创,转载请注明出处

本文链接:http://example.com/subject/article/84/

许可协议:署名-非商业性使用 4.0 国际许可协议