关于 C++ 函数传入指针的问题(小白求教)

2019-07-04 11:22:11 +08:00
 Tony042
struct PolyNode
{
    int coef;
    int expon;
    PolyNode *Link;
};

typedef PolyNode *Polynomial;

struct PolyQueue
{
    Polynominal Front;
    Polynominal Rear;
};

typedef PolyQueue *PolyQueuePtrl;

void AddPolyNode(PolyQueuePtrl Ptrl, const int coef, const int expon)
{
    Polynominal Temp = new PolyNode;
    Temp->coef = coef;
    Temp->expon = expon;
    Temp->Link = nullptr;
    if (Ptrl->Front == nullptr)
        Ptrl->Front = Temp;
    if (Ptrl->Rear != nullptr)
        Ptrl->Rear->Link = Temp;
    Ptrl->Rear = Temp;
}

void Attach(Polynomial &rear, const int coef, const int expon)
{
    rear->Link = new PolyNode;
    rear = rear->Link;
    rear->coef = coef;
    rear->expon = expon;
    rear->Link = nullptr;
}

最近在学习数据结构,在用 C++实现一个队列的时候,有了一个疑问希望能获得各位大佬的解答。我写了两个函数来实现在队列末尾新增一个元素的操作。一个传入的是队列的指针,另外一个传入的是队列里面的 Rear 指针,定义和具体实现在上方代码中,在传入队列指针的时候直接传入即可实现插入的操作,但是在传入 Rear 指针的时候一定要传入 Rear 指针的引用才可以,同样是指针为什么一个传值就可以了,另一个要传引用呢?

3639 次点击
所在节点    C
34 条回复
zjsxwc
2019-07-04 11:55:14 +08:00
传指针与传引用并没有问题,

如图:
https://i.loli.net/2019/07/04/5d1d78494694f93937.png

你的代码:
https://paste.ubuntu.com/p/tD66H7V74M/
srt180
2019-07-04 11:57:37 +08:00
需要改变入参就引用
jmc891205
2019-07-04 12:03:25 +08:00
我猜你是插入之后看 ptrl->rear 来检查有没有插入成功
你的 Attach 只传指针进去的时候 插入其实是成功了的 但是 ptrl->rear 没有更新 所以你以为是插入没有成功
Tony042
2019-07-04 12:27:04 +08:00
@zjsxwc 是的,谢谢你,代码是正确的代码,我的意思是,为什么把 Attach 函数第一个参数由&rear 改成 rear 就不对了呢
zjsxwc
2019-07-04 12:31:19 +08:00
@Tony042

没有不对啊,我发的代码里 函数 AttachTest 的结果是对的啊
Tony042
2019-07-04 12:31:19 +08:00
@srt180 但是两个都是指针呀,我目前的理解是传入指针指向的结构体里的指针与传值一样,如需修改得声明饮用,但是传指针的话是不用声明引用就可以直接修改的。
Tony042
2019-07-04 12:33:40 +08:00
@zjsxwc 我贴的代码是正确的代码,但是如果把 void Attach(Polynomial &rear, const int coef, const int expon)这个声明改成 void Attach(Polynomial rear, const int coef, const int expon) 这个函数就不生效了,所以我是想问 rear 和&rear 的区别
Tony042
2019-07-04 12:36:10 +08:00
@jmc891205 对的是这样的,可为什么没更新呢,我通过 attch 函数传入的那个参数值就是 Ptrl->Rear, 比如 Attach ( Ptrl->Rear,3,5)
zjsxwc
2019-07-04 12:40:15 +08:00
@Tony042
我发的代码里 &rear 改成 rear 后, 仍旧生效。

rear 和&rear 的区别,
简单来说 只是 “副作用”的区别,
&引用方式是有副作用的,在子函数里对变量的修改,会影响到外面调用函数里的变量值,
一般&引用方式传值是为了能够返回变量,
比较 C++不能和 golang 那样一次性 return 多个值。
zjsxwc
2019-07-04 12:41:11 +08:00
“比较 ” ---》 “毕竟”
Tony042
2019-07-04 12:44:13 +08:00
@zjsxwc xi 谢谢您的回复,我运行了您的,如果输出 pqp->rear->coef 的值的话,AttachTest 是不生效的,我在您的代码后面加了一个 cout 输出,请您瞅一下 https://paste.ubuntu.com/p/pzTNnPC74x/
srt180
2019-07-04 12:46:54 +08:00
@Tony042 指针就是地址,加不加引用代码逻辑都完成了。不同的是加引用的话 attach 函数 rear 的实参变成了入参的 link,不加引用的话 rear 的实参还是入参,相当于对参数而言加了引用就是读写权限,不加就是只读。
AddPolynode 函数不需要引用是因为入参只读了。
zjsxwc
2019-07-04 12:49:20 +08:00
@Tony042

理解了你所谓 “ AttachTest 是不生效”,
很简单,
因为 AttachTest 没有副作用,所以外面的 pqp->Rear 没有更新
Tony042
2019-07-04 12:49:53 +08:00
@srt180 谢谢讲解,感觉有点转过来了,AddPolynode 和 Attach 的区别还是在于指针更改了没有,由于 Attach 更改了指针所以要用引用,刚学 C++没多久,遇到指针还是很迷,还好有你们的帮助
Tony042
2019-07-04 12:51:34 +08:00
@zjsxwc 对的,没错,实际上值已经加上了,现在理解了
Tony042
2019-07-04 12:52:24 +08:00
@jmc891205 对的,我现在理解了,值已经加在链表上面了,但是 rear 没有更新,谢谢您
Tony042
2019-07-04 12:53:54 +08:00
@zjsxwc 对了,能麻烦告诉下你用的 IDE 是什么么,看着很不错哇
zjsxwc
2019-07-04 12:56:59 +08:00
@Tony042

clion
lvdong
2019-07-04 13:00:58 +08:00
指针本身也是变量,如果要改变指针自身的值,就需要引用,仅改变指针指向变量的值,指针按照值传递就可以了
stackexplode
2019-07-04 14:26:36 +08:00
越搞不懂 C++,在学习过程中就越不要用那么多 typedef,什么 Polynomial &,真的非常容易混淆
你参数展开成 PolyNode *& rear,一下就懂了,传进来的是指针的引用,你一旦修改 rear,传进来的指针值就会被修改
如果是 PolyNode * rear,传进来只是一个指针,也就是一个值,修改 rear 就不会对传入方有影响

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/579913

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX