通过引用传递不会更改变量

时间:2012-01-20 08:11:50

标签: c pointers gcc

我正在尝试实现一个更改菜单状态的函数,但是当它离开函数时我的引用会丢失:

void gotoLowerlevel(Menu *item)
{
    if (item->chld != 0x00) {
        item = item->chld;
    }
}

函数调用以这种方式完成(currentState是指向struct Menu的指针):

case ENTER:
    if (cnsle->inMenuFlag == 0)
    {
        cnsle->inMenuFlag = 1;
        cnsle->currentState = cnsle->root;
        gotoLowerlevel(cnsle->currentState);
        displayMenu(cnsle->currentState,&cnsle->display);
    }

我不知道为什么这不起作用。有什么想法吗?

2 个答案:

答案 0 :(得分:3)

item中的

gotoLowerLevel是一个局部变量,即使它是对其他地方的对象的引用。要修改cnsle->currentState,您需要:

  • 传入cnsle
  • 传递对cnsle->currentState的引用(即将方法签名更改为Menu ** itemptr,将调用参数更改为&cnsle->currentState
  • 或从gotoLowerLevel返回新值并指定它:cnsle->currentState = gotoLowerLevel(cnsle->currentState)

我的偏好是最后一个选项,因为这样可以在阅读currentState可能被修改的调用代码时清楚显示。

其他人已经解释了如何传递参考。我首选解决方案的代码是:

Menu* gotoLowerlevel(Menu *item)
{
    if (item->chld != 0x00) {
        item = item->chld;
    }
    return item;
}

/* .... */
cnsle->currentState = gotoLowerlevel(cnsle->currentState);

答案 1 :(得分:2)

您按值传递指针。

它所指向的对象的操作对外部是可见的,但指针本身只是一个副本。

您可能希望使用指针指针。