Go学习随笔(五)指针\指针的指针\指针数组\指针传递函数

大家都知道所有的指针变量都是一个内存位置,每个内存位置都有其定义的地址,可以使用&运算符来访问它,这个运算符表示内存中的地址。

func main() {
	a := 10
	fmt.Printf("%x\n", &a) //打印变量a的地址
	
返回:c0000140a8
}

指针概念:指针是一个变量,其值是另一个变量的地址,即存储器位置的直接地址。

 Go语言使用 * 运算符来取得指向指针存储的内存地址所对应的值(指针的格式化为%p),Go语言指针不支持运算,也不支持     -> 运算符,可以直接用,访问目标成员(有涉及到struct以后再写)

func main() {
	a := 10
	ip := &a
	value := *ip
	fmt.Printf("a的地址:%x\n", &a)
	fmt.Printf("ip的地址:%x\n", &ip)
	fmt.Printf("ip的值:%d\n", *ip)
	fmt.Printf("value的值:%d", value)
}

结果:
a的地址:c0000140a8
ip的地址:c000006028
ip的值:10
value的值:10

nil指针

当一个指针被定义后没有分配到任何变量时,它的默认值为 nil。指针变量通常缩写为 ptr。nil指针是在几个标准库中定义的值为零的常量。

注意:对一个空指针的方向引用是不合法的,并会使程序奔溃。(var p *int = nil; *p = 10)

func main() {
	var ptr *int
	fmt.Printf("prt的值是:%x\n", ptr)
	if ptr != nil {
		fmt.Println("非空")
	} else {
		fmt.Println("空")
	}
}

prt的值是:0
空

指针的指针

func main() {
	var a *int //定义一个a指针,指向nil
	aP := &a   //空指针a的指针
	fmt.Printf("a-->nil:%x\n", a)
	fmt.Printf("a指针的内存地址:%x\n", &a)
	fmt.Printf("aP-->a:%x\n", aP)
	fmt.Printf("aP-->a-->nil(指针aP指向的指针a的内存地址):%x\n", *aP)
}

结果:
a-->nil:0
a指针的内存地址:c000006028
aP-->a:c000006028
aP-->a-->nil(指针aP指向的指针a的内存地址):0

如果定义一个指针的指针,可以这样定义:var ptr **int;

func main() {
	a := 10
	aP := &a
	aPP := &aP
	fmt.Printf("a:%d\n", a)
	fmt.Printf("aP:%x\n", aP)
	fmt.Printf("*aP:%d\n", *aP)
	fmt.Printf("aPP:%x\n", aPP)
	fmt.Printf("*aPP:%x\n", *aPP)
	fmt.Printf("**aPP:%d\n", **aPP)
}

结果:
a:10
aP:c0000140a8        //ap是a的内存地址
*aP:10              
aPP:c000006028       //app是ap的内存地址
*aPP:c0000140a8   //这里的是ap的地址
**aPP:10            //这才能拿到a的值
扫描二维码关注公众号,回复: 8955391 查看本文章

提醒各位一句:禁止套娃!!!

 指针数组

 指向数组的指针也会有多个值,确切说是指针数组有多个值

const MAX int = 3

//使用三个整数,将他们存储在指针数组中
func main() {
	a := []int{10, 100, 200} //初始化a数组
	var ptr [MAX]*int        //这里将ptr声明为一个指针数组,数组长度为MAX,ptr中的每个元素现在保存一个指向int值的指针
	for i := 0; i < MAX; i++ {
		ptr[i] = &a[i]
		fmt.Printf("a[%d]的地址:%x\n", i, ptr[i])
	}

	for i := 0; i < MAX; i++ {
		fmt.Printf("a[%d]的值是:%d\n", i, *ptr[i])
	}
}

结果:
a[0]的地址:c00007e120
a[1]的地址:c00007e128
a[2]的地址:c00007e130
a[0]的值是:10
a[1]的值是:100
a[2]的值是:200

指针传递给函数

func main() {
	a := 100
	b := 200

	fmt.Printf("交换之前a的值为:%d\n", a)
	fmt.Printf("交换之前b的值为:%d\n", b)

	//把a和b的地址传递给函数,然后a和b的地址交换,最终实现两个值交换
	swap(&a, &b)

	fmt.Printf("交换之后的a值为:%d\n", a)
	fmt.Printf("交换之后的b值为:%d\n", b)
}

func swap(x *int, y *int) {
	fmt.Printf("原a的地址:%x\n", &x)
	fmt.Printf("原b的地址:%x\n", &y)
	fmt.Printf("原a:%d\n", *x)
	fmt.Printf("原b:%d\n", *y)
	var temp int
	temp = *x
	*x = *y
	*y = temp
}

结果:
交换之前a的值为:100
交换之前b的值为:200
原a的地址:c00009e020
原b的地址:c00009e028
原a:100
原b:200
交换之后的a值为:200
交换之后的b值为:100
发布了55 篇原创文章 · 获赞 32 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/qq_41542894/article/details/104109615