2017-12-28 21 views
-4

ベクトルポインタを使用して値をプッシュバックしようとしています。この操作は丸い中かっこを必要とするようです。なぜ丸いブレースが必要なのですか?ポインタによるベクトルのプッシュバック操作

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

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

オペレータがバインドする方法です。 ' - >'を使うこともできます。または、参照が機能するときにポインタを避けて、よりうまく動作します。 – StoryTeller

+0

void foo(ベクトル&v1)が優れています。それをfoo(A)と呼んでください。 –

+0

動作は他のすべてのポインタと同じです。 –

答えて

4

オペレータ優先順位。

メンバーアクセス(.push_back)は間接/間接参照(*v1)よりも高い優先順位を持っているので、*v1.push_back(1)*(v1.push_back(1))と等価です。これはあなたが望むものではありません。

(*v1)のかっこでは、メンバーアクセスよりも左から右へ優先順位が高いため、有効で->に相当します。

v1->

(*v1).

Operator Precedence Reference

+0

"v1->は(* v1)の構文砂糖です。" - または表面。どちらも特に甘いようではない。 –

+0

¯\\ _(ツ)_ /¯私はただのメッセンジャーです。 –

+1

@JiveDadson 'v1->について不評は? 'v1'はポインタ、' - > 'はその点を指す矢印のように見えます。それはポインタで常に使用されている演算子です。ほとんどのプログラマーにとって当然のことです。 – Barmar

0

ためのシンタックスシュガーであるのは、あなたがこの例であるとしましょう:あなたは、DE-参照アドレスをインクリメントした後のpAそれはない値を指して上

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

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

をポイントするアドレスに格納します。

だから、()を必要とする:

(*pA)++; 
  • TIP:operator precedence使用括弧を変更するには。

    (*v1).push_back(1); 
    

    同じことが矢印->演算子を使用することによって達成することができます:あなたは、したがって、構文、それがメンバ関数だ呼び出すことができるようにするためには、ベクターへのポインタを間接参照する必要が

0

ファースト:

v1->push_back(1); 

は、代替的に参照により引数を渡す:

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

int main() { 
    vector<int> A; 
    foo(A); 
} 
関連する問題