指针和通过引用 c++ 传递

Pointers and pass by reference c++

本文关键字:c++ 传递 引用 指针      更新时间:2023-10-16

在我的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)  );
    }
}

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

*(A).B也可以写成A->B,所以可以写成prob->at(i).freq,而不是(*prob).at(i).freq。(有了类似的论点prob.size()就变成了prob->size()

以更清洁的方式
做到这一点 因为你从不改变向量的内容,所以你可以使参数不变。

float compute_entropy(const vector<Symbol>* prob)

现在我们知道指针是邪恶的,让我们用引用替换指针。

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)  );
    }
}

调用此函数时,如果使用 vector 调用,请从参数中删除&,如果使用向量指针调用,请使用 * 取消引用它。

vector<Symbol>* prob;    
for (int i = 0; i < prob.size(); i++)  //GIVES ERROR
.....

因为 prob 是一个指针,所以你需要使用 -> 运算符

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