将非指针变量传递给函数作为指针的引用

时间:2017-08-29 20:26:39

标签: c++ arrays pointers reference pass-by-reference

我有一个场景,我经常使用非指针变量,包括对象。

我想将这些变量设置为数组中的现有数据集,但是我不想要软拷贝,而是希望非指针变量直接指向另一个变量的内存地址。 / p>

这是一个解决我的困境的简单示例代码。

struct User
{
    unsigned int ID;
    std::string Name;

    User(int id, std::string name)
    {
        ID = id;
        Name = name;
    }
};

User data[] = 
{
    User(2, "Jane Smith"),
};

void ChangeUser(User& user)
{
    user = data[0];
}

int main()
{
    User first;
    ChangeUser(first);

    return 0;
}

如果我想要一个可以将其更改为新地址的函数,我可以将非指针对象作为指向对象的指针传递。

void ChangeUser(User* user)
{
    user = &data[0];
}

int main()
{
    User first;
    ChangeUser(&first);

    return 0;
}

但是,这不会更改函数外部的变量,因为它会按值传入指针。我能做的是通过引用传入一个指针,这意味着如果我传入一个指针,即使在函数之后数据也会被更改。

void ChangeUser(User*& user)
{
    user = &data[0];
}

但是,如果我尝试使用非指针变量,我会在调用函数时出现此编译错误。

error C2664: 'void ChangeUser(User *&)' : cannot convert argument 1 from 'User *' to 'User *&'

如果我按如下所示创建指针变量,编译器将接受它,并将指针的数据设置为数组中成员的指针。

但是,如果我必须使用非指针变量,有没有办法让我实现相同的任务?理想情况下,我希望能够将User变量保持为类的成员,因此不能使用本地引用变量。

1 个答案:

答案 0 :(得分:0)

代码

User first;
ChangeUser(&first);

有效地将const User*&指针引用(rvalue)传递给函数(它需要非const值),因此错误。

您无法更改已分配对象的地址。