go语言学习 - 指针

golang

前置知识

在编程中,一个内存地址用来定位一段内存。

通常地,一个内存地址用一个操作系统原生字(native word)来存储。 一个原生字在32位操作系统上占4个字节,在64位操作系统上占8个字节。 所以,32位操作系统上的理论最大支持内存容量为4GB(1GB == 230字节),64位操作系统上的理论最大支持内存容量为264Byte,即16EB(EB:艾字节,1EB == 1024PB, 1PB == 1024TB, 1TB == 1024GB)。

内存地址的字面形式常用整数的十六进制字面量来表示,比如0x1234CDEF

以后我们常简称内存地址为地址。

指针是Go中的一种类型分类(kind)。 一个指针可以存储一个内存地址;从地址通常为另外一个值的地址。

和C指针不一样,为了安全起见,Go指针有很多限制,只有取值和取址操作。

指针取址

go语言中使用&+变量来获取变量的地址

1
2
3
4
5
6
7
8
9
10
11
package main

import "fmt"

func main() {
var a int32 = 45
var b int32 = a
fmt.Println("a的指针是:", &a)
fmt.Println("b的指针是:", &b)
}

指针变量

保存上面的&a &b这种指针数据的变量被称为指针变量,指针变量类型用*指针源值数据类型表示

1
2
3
4
5
6
7
8
9
10
11
12
package main

import "fmt"

func main() {
var a int32 = 45
var b int32 = a
fmt.Println("a的指针是:", &a)
fmt.Println("b的指针是:", &b)
var x *int32 = &a
fmt.Println("x是:", x)
}

指针取值

go语言中使用+指针变量来获取指针的值*

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

import "fmt"

func main() {
var a int32 = 45
var b int32 = a
fmt.Println("a的指针是:", &a)
fmt.Println("b的指针是:", &b)
var x *int32 = &a
fmt.Println("x是:", x)
fmt.Println("x的指针是:", &x)
fmt.Println("x指针的值是:", *x)
*x = 233
fmt.Println("a是:", a)
}

指针