2016-03-19 41 views
2

ポインタが使用される方法には、わかりません。C/C++での参照/参照解除

次のコードは、Pointers in C: when to use the ampersand and the asterisk?から取られる:

void swap(int *x, int *y) {int tmp = *x; *x = *y; *y = tmp; } 
... 
int a = 1, b = 2; 
printf("before swap: a = %d, b = %d\n", a, b); 
swap(&a, &b); 
printf("after swap: a = %d, b = %d\n", a, b); 

次のコードは、https://en.wikipedia.org/wiki/Typedefから取られる:

int do_math(float arg1, int arg2) { 
    return arg2; 
} 

int call_a_func(int (*call_this)(float, int)) { 
    int output = call_this(5.5, 7); 
    return output; 
} 

int final_result = call_a_func(&do_math); 

は、ここで私は理解していないものです:最初のケースで

参照演算子の効果を打ち消すために、逆参照演算子はxとで使用されますのように、参照を渡さなかった場合に参照解除せずに使用する場合と同じように使用するには、*のものを使用します。しかし、2番目のケースでは、call_thisは、リファレンスによって渡されたという事実を打ち消す逆参照演算子を使用して呼び出されません。つまり、(*call_this)(5.5, 7)と呼ばれていません。

*を参照渡しの効果に打ち消すために、なぜ、変数の場合に通常どおりに使うことができますが、関数の場合はそうではありません。

+1

Cを参照し、単にポインタをサポートしていません。 C++は異なる言語です。そして、「参照演算子」はC内には存在しません。 – Olaf

+1

「counteract」というフレーズの使い方は非常に混乱しています。ここには何の反作用もありません。私はあなたが[このリスト](http://stackoverflow.com/q/388242/2069064)の本を手に入れて、ポインタが何であるかを理解することをお勧めします。 – Barry

+0

私はcounteractという言葉の使用がちょっと混乱していたと思います。私はちょうどあなたが参照によって値を渡す場合、あなたはそれを使用するためにそれを逆参照しなければならないということを意味しました、その2つは相補的です。 – inhahe

答えて

2

あなたは、機能だけでなく、関数ポインタを呼び出すことができます。

void (*a)(); 
void (b)(); 

// Both valid 
a(); 
b(); 
+0

ありがとう、これは '(* call_this)(5.5、7)'が上記のコードで同じようにうまく機能したことを意味しますか? – inhahe

+0

@inhahe:はい、そうです – Dani