我想将项目添加到链接列表(课程对象)。
course* start = ....; // course pointer as start of list
course* c = ....; // another course object pointer to add to list
然后要添加到列表中,我使用:
course* temp = start; // copy start current value to a temp object
start = c; // set start value to newest object
c->next = temp; // linked back to previous object
return start; // return result
这有效,但现在我想把它包装成一个名为addToEnd()的函数:
addToEnd(start, c);
与
void addToEnd(course* start, course* c)
{
// LIFO
course* temp = start; // copy start current value to a temp object
start = c; // set start value to newest object
c->next = temp; // linked back to previous object
}
更改仅在函数内部发生,并且在外部无效。我做错了什么?
不!我的问题不同于建议的LinkedList C ++实现'问题
答案 0 :(得分:1)
注意:我写的是C,而不是C ++。答案有效,但并不理想。 @ user4581301的答案更好。
简短的回答是:对"开始"的更改在功能之外不可见,但改为" *开始"将会。
可能你想要将指针传递给指向函数的指针。
类似
addToEnd(&start, c);
和
void addToEnd(course** start, course* c)
{
// LIFO
course* temp = *start; // copy start current value to a temp object
*start = c; // set start value to newest object
c->next = temp; // linked back to previous object
}
答案 1 :(得分:1)
现在这听起来很愚蠢,但你按价值传递指针。
傻吧?他们是指针。你没有得到比指针更多的参考传递。嗯,这是指向AT的项目,通过引用传递。指针本身......没那么多。
所以会发生什么start
是一个包含地址的自动(也称为本地)变量。调用者传递给函数的地址被复制到start
。当您在函数内更改start
时,它正在更改副本,当函数结束时,start
消失了。调用者没有任何线索start
曾被更改过。
如果要更新函数内的指针,则必须通过引用
传递指针void addToEnd(course*& start, course* c) // note the only change required is the
// addition of the &
{
// LIFO
course* temp = start; // copy start current value to a temp object
start = c; // set start value to newest object
c->next = temp; // linked back to previous object
}
以便调用者获取更新的值。
更多阅读:What's the difference between passing by reference vs. passing by value?