我正在尝试使用向量指针并尝试回推值。看来这个操作需要圆括号。为什么需要圆括号?
void foo(vector<int> *v1)
{
*v1.push_back(1); //(*v1).push_back(1);
}
int main()
{
vector<int> A;
foo(&A);
return 0;
}
答案 0 :(得分:4)
运营商优先权。
成员访问权限(.push_back
)的优先级高于间接/解除引用权限(*v1
),因此*v1.push_back(1)
等同于*(v1.push_back(1))
。这不是你想要的。
(*v1)
中的括号使得表达式从左到右的优先级高于成员访问权限,因此它的有效性和等效于->
的原因。
v1->
是(*v1).
答案 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);
}