指向参考/地址参数的指针

时间:2013-02-01 15:11:01

标签: c++ pointers memory

对于令人困惑的标题感到抱歉,不知道该怎么称呼它。 我有这个功能:

static void smooth5(IntVector*& v)
{
    IntVector* tmp = new IntVector();
    for(int i=0; i<v->size(); i+=2)
        tmp->push_back(v->at(i));
    delete v;
    v = tmp;
}

主要是我这样做:

IntVector* v = new IntVector();

v->push_back(0);
v->push_back(1);
v->push_back(2);
v->push_back(3);

smooth5(v);

//print the contents of v

当我打印v的内容时,输出为0 2。 但我不明白是什么

IntVector*& v

实际上意味着当v是指向堆上对象的指针时。有人可以解释一下吗?

3 个答案:

答案 0 :(得分:3)

IntVector*&声明对指针的引用。使用它作为函数参数允许smooth5修改调用者的v副本。

与将指针传递给指针 - IntVector**相似但更具可读性。

在您的示例中,smooth5会删除来电者的IntVector并将其指向其tmp变量。

答案 1 :(得分:1)

这不是指向引用的指针,而是对指针的引用。这意味着,不是将指针的副本传递给函数,而是传递对它的引用。因此,对函数smooth5中的指针所做的任何修改都会影响传递给它的参数,在这种情况下是指针v

答案 2 :(得分:0)

代码中IntVector*& v的含义取决于谁在阅读它。 当编译器读取它时,意味着v是对它的引用 指向IntVector的指针(这是一个typedef) std::vector<int>?)。当我读它时,它意味着作者 代码可能不理解C ++是如何工作的,而且是 试图适应不合适的Java或C#习语。该 惯用的写作方式是:

void smooth5( IntVector& v )
{
    IntVector results;
    for ( int i = 0; i < v->size(); i += 2 ) {
        results.push_back( v[i] );
    }
    v.swap( results );
}

任何涉及向量指针的代码都很高 可疑。

相关问题