go

go语言指针

Posted by Chen Quan on August 3, 2019

go语言指针

对于新手来说,在使用指针的时候,经常把&*弄混。现在来简单的总结一下,他们的用法。

&是取地址符,放到一个变量前使用就会返回相应变量的内存地址

例如:

package main

import "fmt"

func main() {
	var a int = 10
	
	fmt.Printf("变量的地址: %x\n", &a  ) //变量的地址: c000060080
}

*是内容符,放到一个变量前使用就会返回相应变量的内存地址

package main

import "fmt"

func main() {
    var a int= 20   /* 声明实际变量 */
    var ip *int        /* 声明指针变量 */

    ip = &a  /* 指针变量的存储地址 */
    fmt.Printf("a 变量的地址是: %x\n", &a  )

    /* 指针变量的存储地址 */
    fmt.Printf("ip 变量储存的指针地址: %x\n", ip )

    /* 使用指针访问值 */
    fmt.Printf("*ip 变量的值: %d\n", *ip )
}

可以看到*除了可以用于取出指针中的内容外,还可以放在变量类型的前面用于指针的申请。

一个复杂的案例:

package main

import "fmt"

func main() {
	var a int = 20 /* 声明实际变量 */
	var ip *int    /* 声明指针变量 */

	ip = &a /* 指针变量的存储地址 */

	fmt.Printf("ip 变量储存的值: %v\n", *ip)
	setWithPoint(ip) //传指针,改变指针所对外部的值

	fmt.Printf("ip 变量储存的值: %v\n", *ip)
	fmt.Println("===================")

	fmt.Printf("ip 变量储存的值: %v\n", *ip)

	setWithValue(*ip) //传值,不改变外部的值

	fmt.Printf("ip 变量储存的值: %v\n", *ip)

}

func setWithPoint(n *int) {

	*n = 11111
}
func setWithValue(n int) {
	n = 111111
}