前置知识 Link to heading
在编程中,一个内存地址用来定位一段内存。
通常地,一个内存地址用一个操作系统原生字(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指针有很多限制,只有取值和取址操作。
指针取址 Link to heading
go语言中使用&+变量来获取变量的地址
package main
import "fmt"
func main() {
var a int32 = 45
var b int32 = a
fmt.Println("a的指针是:", &a)
fmt.Println("b的指针是:", &b)
}
指针变量 Link to heading
保存上面的&a
&b
这种指针数据的变量被称为指针变量,指针变量类型用*指针源值数据类型表示
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)
}
指针取值 Link to heading
go语言中使用+指针变量来获取指针的值*
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)
}