指针
一、什么是指针
C语言里,变量存放在内存中,而内存其实就是一组有序字节组成的数组,每个字节有唯一的内存地址。CPU 通过内存寻址对存储在内存中的某个指定数据对象的地址进行定位。这里,数据对象是指存储在内存中的一个指定数据类型的数值或字符串,它们都有一个自己的地址,而指针便是保存这个地址的变量。也就是说:指针是一种保存变量地址的变量。
二、Go 指针
指针如何定义:
var ip *int /* 指向整型*/
var fp *float32 /* 指向浮点型 */
指针使用流程:
- 定义指针变量。
- 为指针变量赋值。
- 访问指针变量中指向地址的值。
示例:
package main
import "fmt"
// 我们将通过两个函数:val 和 ptr 来比较指针和值类型的不同。
// val 有一个 int 型参数,所以使用值传递。
// val 将从调用它的那个函数中得到一个 val1 形参的拷贝。
func val(val1 int) {
val1 = 0
}
// ptr 有一和上面不同的 *int 参数,意味着它用了一个 int指针。
// 函数体内的 *iptr 接着解引用 这个指针,从它内存地址得到这个地址对应的当前值。
// 对一个解引用的指针赋值将会改变这个指针引用的真实地址的值。
func ptr(iptr *int) {
*iptr = 0
}
func main() {
test := 1
fmt.Println("initial:", test)
val(test)
fmt.Println("val:", test)
// 通过 &test 语法来取得 test 的内存地址,例如一个变量i 的指针。
ptr(&test)
fmt.Println("ptr:", test)
// 指针也是可以被打印的。
fmt.Println("pointer:", &test)
// val 在 main 函数中不能改变 test 的值,但是zeroptr 可以,因为它有一个这个变量的内存地址的引用。
fmt.Println("pointer:", *&test)
}
三、Go 空指针
当一个指针被定义后没有分配到任何变量时,它的值为 nil。nil 指针也称为空指针。nil在概念上和其它语言的null、None、nil、NULL一样,都指代零值或空值。