社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
最近几天赶上了过年,一直就偷懒没更文。今天是大年初三,肺炎还在扩展,但今天的头条是陪伴了我十多年的那个人,还有他最爱的女儿。我几乎没有经历不敢相信地阶段,就看到了同学、朋友的安慰,开始躲在被窝哭泣…我发现我特别不愿意看到别人发给我的信息,不想别人跟我提起那个人…我想要努力放下,我想要珍惜从即刻起的每分每秒时光…只为成为更好的自己,践行Mamba mentaliy,追逐我的青春…
就从现在开始。
由于指针这节没有课后习题,我就根据自己从老师博客中读到的记录一下。
从指针变量的声明说起,
a := *ptr
这句就表示把指针ptr所指向的值取出并赋值给变量a。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语言中的指针
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!