跳至主要內容

指针


一、什么是指针

C语言里,变量存放在内存中,而内存其实就是一组有序字节组成的数组,每个字节有唯一的内存地址。CPU 通过内存寻址对存储在内存中的某个指定数据对象的地址进行定位。这里,数据对象是指存储在内存中的一个指定数据类型的数值或字符串,它们都有一个自己的地址,而指针便是保存这个地址的变量。也就是说:指针是一种保存变量地址的变量

img
img

二、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一样,都指代零值或空值。

上次编辑于: