【问题标题】:Passing non-pointer variable into function as a reference to pointer将非指针变量作为对指针的引用传递给函数
【发布时间】:2017-08-29 20:26:39
【问题描述】:

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

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

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

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 *&'

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

但是,如果我必须使用非指针变量,有没有办法让我完成同样的任务?理想情况下,我希望能够将用户变量保留为类的成员,因此不能使用局部引用变量。

【问题讨论】:

  • “但是,如果我尝试使用非指针变量,我会在调用函数时收到此编译错误。”请发布导致此错误的代码...
  • @jpo38 他们做到了。
  • "我希望非指针变量直接指向另一个变量的内存地址。"这听起来有点不可能。
  • “我想要一个可以将其更改为新地址的函数” 您不能更改堆栈分配对象的地址。

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


【解决方案1】:

代码

User first;
ChangeUser(&first);

有效地将const User*& 指针引用(右值)传递给函数(它想要一个非常量左值),因此会出现错误。

您不能更改已分配对象的地址。

【讨论】:

  • 它传递了一个User*。而且您不能更改任何对象的地址,无论是否分配堆栈。
  • @juanchopanza 我知道,这就是我写“有效地”的原因。你能提出一个更好的措辞吗?
  • @user0042 抱歉,我不明白您在回答中要说什么,所以我没有“更好”的措辞。但是也许你想说“非常量左值引用不能绑定到右值”。
  • @juanchopanza 谢谢,我采用了更正确的条款。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-16
  • 1970-01-01
  • 2013-01-27
  • 2012-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多