对于令人困惑的标题感到抱歉,不知道该怎么称呼它。 我有这个功能:
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是指向堆上对象的指针时。有人可以解释一下吗?
答案 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 );
}
任何涉及向量指针的代码都很高 可疑。