请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

请问老师,这个有画流程图吗?又是对象又是地址我实在是理不清楚

图片描述
我理解的传进来的q是一个指针,那就是一个地址值
append (*q, c) 返回一个新的切片对象,也是一个指针,因此也是返回的一个地址值,返回的地址使用 *q来接收,是不是相当于把原来q的指向地址给改了?
意思就是执行完这个函数之后,q已经不是原来的q了,因为指针的地址已经改变了?

正在回答

1回答

ccmouse 2021-11-15 18:59:53

Queue部分画流程图帮助不大,不过的确这里的指针在理解上是个难点。我在考虑把它讲的再细一些。

普通版:

var a []int

a = append(a, v)

append返回的是[]int。

指针版:

var a []int

var q *[]int = &a

*q = append(*q, 3)

这段运行之后,a是什么呢?[3]。我们通过*q来操作了变量a,使得它发生了改变。

Queue的方法版:

q.Push接收者(q *Queue)其实跟一般的函数参数一样,只是语法上不一样。a.Push就相当于:(为了说明方便,我们假设使用的时候这个叫做a)

(&a).Push

这里的q就相当于上面被赋值成了&a,通过这个方法调用,改变了变量a。

而实际上我们一般到处都叫q,所有外面会说q.Push,这里的q是[]int,但是穿参进方法之后,方法里面的q和外面的q不是同一个变量,里面的q是*[]int类型,通过*q来改变外面的q。

0 回复 有任何疑惑可以回复我~
  • 提问者 SuperDi #1
    普通版:
    
    var a []int
    
    a = append(a, v)
    
    append返回的是[v]。a 没有被改变,append 返回了一个新的slice,我们恰巧用变量a接收,实质上原来的a没变
    
    我好像明白了,谢谢老师的耐心解答!必须好评!
    回复 有任何疑惑可以回复我~ 2021-11-15 23:21:31
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号