Go语言基础七——指针详解

391 阅读2分钟

我正在参加「掘金·启航计划」

Go语言的指针不能进行偏移和运算,是安全指针。

Go语言中函数传参都是值拷贝,当我们想改变某个变量的时候,我们可以创建一个指向该变量地址的指针变量。传递数据使用指针,而无需拷贝数据。

1、指针地址和指针类型

每个变量在运行时都拥有一个地址,这个地址代表变量在内存中的位置。Go语言中使用&字符放在变量前面对变量进行取地址操作。Go语言中的值类型都有对应的指针类型,如*int、*int64、*string

取变量指针的语法如下:

ptr := &v

//其中:
//v代表被取地址的变量,类型为T
//ptr用于接收地址的变量,ptr类型就位*T,称做T的指针类型。*代表指针

示例:

func main(){
    a := 10
	b := &a
	fmt.Printf("a:%d ptr:%p\n", a, &a)   //a:10 ptr:0xc00001a088
	fmt.Printf("b:%p type:%T\n", b, b)   //b:0xc00001a088 type:*int
	fmt.Println(&b)						 //0xc00000e028
	fmt.Println(*b)						 //10
}

2、指针取值

对普通变量使用&操作符取地址后会得到这个变量的指针,然后可以对指针使用*操作,也就是指针取值。

func main(){
    a := 10
    b := &a
    c := *b
    fmt.Println(c) // 10
}

总结:取地址符操作&和取值操作符*是一对互补操作符,&取出地址,*根据地址取出地址指向的值。

  • 对变量进行取地址(&)操作,可以获取变量的指针变量。
  • 指针变量的值是指针地址
  • 对指针变量进行取值(*)操作,可以获取指针变量指向的原变量的值。

3、空指针

当一个指针被定义后没有分配到任何变量时,他的值为nil

空指针的判断:

func main(){
	var p *string
    if p != nil {
    	//非空
    } else {
    	//空值
    }
}

4、变量、指针地址、指针变量、取地址、取值的相互关系和特性如下:

  • 对变量进行取地址操作使用&操作符,可以获得这个变量的指针变量。
  • 指针变量的值是指针地址。
  • 对指针变量进行取值操作使用*操作符,可以获得指针变量指向的原变量的值。