Go指针基础

概述

指针是一个变量,它的值是另一个变量的地址,通过指针我们可以直接地访问特定地址的内存单元。通过指针我们可以访问并操作内存单元,运用这个特性可以允许我们写出非常高效的程序。

定义

指针变量使用*T表示该指针是指向T类型值的指针,例如:

1
2
3
var p *int
// 指针变量p是一个指向int类型变量的指针
// 指针的零值为nil

与C不同,Go并不支持指针运算

与指针变量相关的操作符有&*,这两个操作符分别代表的指针的两个重要含义,即引用重定向

操作符&会生成一个指向其操作数的指针

1
2
3
4
i := 42
p = &i
// p是一个指向i的指针
// p的值是i的内存地址

操作符*表示指针指向的底层值

1
2
3
4
// 通过p读取i的值
fmt.Println(*p)
// 通过p设置i的值
*p = 21

示例1:pointers.go

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package main

import "fmt"

func main() {
i, j := 42, 2701

p := &i // 指向 i
fmt.Println(*p) // 通过指针读取 i 的值
*p = 21 // 通过指针设置 i 的值
fmt.Println(i) // 查看 i 的值

p = &j // 指向 j
*p = *p / 37 // 通过指针对 j 进行除法运算
fmt.Println(j) // 查看 j 的值
}

编译运行

1
2
3
42
21
73

同样,如果将fmt.Println()中的参数换成&i&j再次编译运行则可以看到输出结果为这两个变量所存储的内存地址

1
2
3
42
0x40e020
0x40e024

总结

指针实际上是一个相当底层的概念,通过指针我们的程序可以直接操作硬件,而这通常是汇编语言的工作。

使用指针的一大优势便是更加高效,直接对硬件中存储的数据进行操作无疑是比通过一层抽象进行操作更加节省时间。

指针的存在正是C语言相较其他高级语言更加高效的一个重要原因

当然这也不完全是好处,如果不清楚内存中的数据和它的结构就贸然地、大量地使用指针很大可能会造成严重的错误。

充分理解了指针,也就基本理解了计算机系统在底层硬件的工作方式,对于程序的编写是大有裨益的。

作者

Luc_41

发布于

2020-03-21

更新于

2020-03-23

许可协议

评论