Golang基础之指针基础——李文周老师 - Go语言中文社区

Golang基础之指针基础——李文周老师


最近几天赶上了过年,一直就偷懒没更文。今天是大年初三,肺炎还在扩展,但今天的头条是陪伴了我十多年的那个人,还有他最爱的女儿。我几乎没有经历不敢相信地阶段,就看到了同学、朋友的安慰,开始躲在被窝哭泣…我发现我特别不愿意看到别人发给我的信息,不想别人跟我提起那个人…我想要努力放下,我想要珍惜从即刻起的每分每秒时光…只为成为更好的自己,践行Mamba mentaliy,追逐我的青春…
就从现在开始。
由于指针这节没有课后习题,我就根据自己从老师博客中读到的记录一下。
从指针变量的声明说起,

  1. ptr := &v // v变量类型为T
    这行代码的意思是:将变量v的地址赋值给指针变量ptr。v的类型为T,ptr的类型为*T,称为T的指针类型。可以结合下面的图示理解:
    在这里插入图片描述
  2. 指针取值
    我们继续用上面的指针ptr。a := *ptr这句就表示把指针ptr所指向的值取出并赋值给变量a。
  3. 示例①
var (
	a, b int
)

func main() {
	modify1(a)
	fmt.Println("a:", a)          // 0
	modify2(&b)
	fmt.Println("b:", b)          // 100
}

func modify1(x int)  {
	x = 100
	fmt.Println("In modify1, a:", a)                     // 0
}

func modify2(x *int)  {
	*x = 100
	fmt.Println("In modify2, b:", b)                     // 100
}

运行截图:
在这里插入图片描述
咱们就从运行结果中分析,不难发现其实变量a的值始终就没有发生过变化,原因是:函数modify1的参数是值类型,形参的值不会影响实参的值(x不影响a),而&b是指针,是引用类型,函数modify2传入一个指针,并将该指针指向的内存地址处赋值100。所以执行完函数modify2后, &b指向的变量b的值会变成100。
4. 示例②

func main() {
	var a *int
	*a = 100
	fmt.Println(*a)

	var b map[string]int
	b["沙河娜扎"] = 100
	fmt.Println(b)
}

这个例子中无论是给指针a指向的内存地址a赋值还是还是给map b[“沙河娜扎”]赋值都会报panic, 分别是空指针和空map的错误。我们知道,值类型的变量都是有固定长度的, 在声明此类型变量的时候默认就分配好了空间。而指针的类型要与被指向的变量的类型一致,那么未初始化的指针自己连块内存都没有,用a去取值当然会报panic啊,同理map和其他引用类型的变量要初始化后(才会给这些变量分配内存)才能进行其他操作。
这里我们用new函数对指针进行初始化:
在这里插入图片描述
可见,new初始化后的指针a有了自己的内存地址,那么就可以取地址在进行赋值操作了。相应的,map也需要初始化。
不过是用make。
是前面讲过的,不太理解的去map那节看噢。
下面的例子供读者自行分析:
例1:

a := new(int)
	fmt.Printf("%pn", a)
	*a = 100
	fmt.Println(*a)
	b := 1
	a = &b
	fmt.Printf("最后a的地址为:%pn", a)
	fmt.Printf("最后a指向的内存值为:%dn", *a)

例2:

var a *int
	var b = 10
	a = &b
	*a = 10

希望新手可以仔细分析上二例,检验自己是否真的明白了本示例的内容。
大家有问题可以在下方评论区留言,也支持私信。菜鸡我在这里给大家拜个晚年:祝大家新年快乐,身体健康!一定要健康!
参考博客:李文周的博客——Go语言中的指针

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_41580831/article/details/104091795
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-06-30 08:23:06
  • 阅读 ( 2150 )
  • 分类:Go

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢