矢量推回操作与指针

时间:2017-12-28 22:00:06

标签: c++

我正在尝试使用向量指针并尝试回推值。看来这个操作需要圆括号。为什么需要圆括号?

void foo(vector<int> *v1)
{
*v1.push_back(1); //(*v1).push_back(1); 
}

int main()
{
vector<int> A;
foo(&A);
return 0;
}

3 个答案:

答案 0 :(得分:4)

运营商优先权。

成员访问权限(.push_back)的优先级高于间接/解除引用权限(*v1),因此*v1.push_back(1)等同于*(v1.push_back(1))。这不是你想要的。

(*v1)中的括号使得表达式从左到右的优先级高于成员访问权限,因此它的有效性和等效于->的原因。

v1->(*v1).

的语法糖

Operator Precedence Reference

答案 1 :(得分:0)

假设您有这个例子:

int a[] = {100, 70, 55, 12};
int* pA = &a[0];

*pA++; // you think 100 + 1 but a[0 + 1] so result: 70

在您递增地址后,您在上面取消引用pA,它指向的不是它存储在它指向的地址中的值。

所以你需要()

(*pA)++;
  • 提示:要更改operator precedence,请使用括号。

答案 2 :(得分:0)

首先你需要取消引用vector的指针,以便能够调用它的成员函数,因此语法:

(*v1).push_back(1);

使用 arrow ->运算符可以实现同样的效果:

v1->push_back(1);

或者通过引用传递参数:

void foo(vector<int>& v1) {
    v1.push_back(1);
}

int main() {
    vector<int> A;
    foo(A);
}