指针
程序在内存中存储信息,每个内存块(或字)有一个地址,通常用十六进制数表示,如:0x6b0820 或 0xf84001d7f0。
这个地址可以存储在一个叫做指针的特殊数据类型中,一个指针变量可以指向任何一个值的内存地址
在 32 位机器上占用 4 个字节,在 64 位机器上占用 8 个字节,并且与它所指向的值的大小无关。
当一个指针的零值为 nil。
指针运算符
&:放到一个变量前使用就会返回相应变量的内存地址。
*:放到一个指针前使用就会返回相应内存地址的变量值。 这被称为反引用(或者内容或者间接引用)
可以如下所示用 *p 赋值来改变 s 本身的值
func main() {
s := "good bye"
var p *string = &s
*p = "hello world"
fmt.Printf("Here is the string *p: %s\n", *p) // prints string
fmt.Printf("Here is the string s: %s\n", s) // prints same string
}
区别
Go 语言和 C、C++ 以及 D 语言这些低级(系统)语言一样,都有指针的概念。
但是对于经常导致 C 语言内存泄漏继而程序崩溃的指针运算(所谓的指针算法,如:pointer+2,移动指针指向字符串的字节数或数组的某个位置)是不被允许的。
Go 语言中的指针保证了内存安全,更像是 Java、C# 和 VB.NET 中的引用。
注意事项
写 var p *type 不要写 var p*type, 后者语法正确但是容易被误认为是一个乘法表达式
不能得到一个文字或常量的地址
不可以对 nil 指针进行 * 操作, 会引发程序崩溃