【问题标题】:Pointers and pass by reference c++指针和通过引用传递 C++
【发布时间】:2016-03-02 13:19:10
【问题描述】:

在我的 main 中,我调用函数 compute_entropy 并给它一个像这样的向量: 浮点熵 = h.compute_entropy(input_pic[0], & Symbol_table);

在实现函数本身(在 h.cpp 中)时,我不应该更改它所采用的参数 vector* prob.. 如何访问 prob 的数据?

float compute_entropy(vector<Symbol>* prob)
{

    float ent = 0;
    vector<Symbol>* prob;


    for (int i = 0; i < prob.size(); i++)  //GIVES ERROR
    {
        ent +=    (prob.at(i).freq)   *   log2(  1 / (prob.at(i).freq)  );
    }
}

【问题讨论】:

  • @MohitJain 是的,但 prob.at() 和 prob.size() 给出错误,因为 prob 的声明是指向向量而不是向量本身的指针
  • 为什么在本地声明prob。它已经是函数的参数。理想情况下,您应该使用float compute_entropy(const vector&lt;Symbol&gt; &amp;prob)
  • @MohitJain 在 main 中调用函数时..如何传递参数? compute_entropy(& Symbol_table) ??
  • 放弃&amp;,直接拨打compute_entropy(Symbol_table);。更多信息请查看this link
  • 由于函数的实现需要参数(指向向量的指针),我不能直接用向量的参数调用它..它给出了一个错误@MohitJain

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


【解决方案1】:

因为prob 的类型是Vector&lt;Symbol&gt; *,所以在访问成员之前实际上需要先取消引用它。看起来像(*prob).at(i).freq

*(A).B也可以写成A-&gt;B,所以你可以写成prob-&gt;at(i).freq而不是(*prob).at(i).freq。 (类似的论点prob.size()变成prob-&gt;size()

以更简洁的方式进行操作
因为您永远不会更改向量的内容,所以您可以使参数保持不变。

float compute_entropy(const vector<Symbol>* prob)

现在我们知道指针是邪恶的,让我们将指针替换为reference

float compute_entropy(const vector<Symbol> &prob)
{

    float ent = 0;

    for (int i = 0; i < prob.size(); i++)  //GIVES ERROR
    {
        ent +=    (prob.at(i).freq)   *   log2(  1 / (prob.at(i).freq)  );
    }
}

在调用它时,如果您使用向量调用,请从参数中删除 &amp;,如果您使用向量指针调用,请使用 * 取消引用它。

【讨论】:

    【解决方案2】:
    vector<Symbol>* prob;    
    for (int i = 0; i < prob.size(); i++)  //GIVES ERROR
    .....
    

    因为prob是指针,所以需要使用->操作符

    for (int i = 0; i < prob->size(); i++)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-07
      • 1970-01-01
      • 2014-05-06
      • 2020-03-14
      • 2012-03-03
      • 2014-09-11
      • 1970-01-01
      相关资源
      最近更新 更多