2017-04-11 24 views
0

以下のコードでは、file.recmainに入れてchar bufに入れています。次に、bufと、getCallBack()関数の関数ポインタを渡しますが、2つの方法で関数を渡します。この関数は、この2つの方法で関数ポインタを正常に受け取ります。だから私はそれを使用するかどうかの違いは何かを知ることに興味があります。関数ポインタで "&"演算子を使用する場合

#include<stdio.h> 

void getCallBack(char buf[], void(*executeCallBack)(char[])){ 
    printf("callback recived\n"); 
    executeCallBack(buf); 
} 

void callBack(char buf[]){ 
    printf("executing callback...\n"); 
    printf("buf content: "); 
    printf("%s\n", buf); 
} 

void main() { 

    FILE *ReadingXmlFile = fopen("texto.rec", "r"); 
    char buf[10000]; 
    fread(buf, 1, 10000, ReadingXmlFile); 
    fclose(ReadingXmlFile); 

    printf("passing \"&callBack\"\n"); 
    getCallBack(buf, &callBack); 

    printf("passing \"callBack\"\n"); 
    getCallBack(buf, callBack); 
    // 
} 
+1

関数は、配列が最初の要素へのポインタにどのように崩壊するのと同様に、自然に自身のポインタに減衰します。私はそれについて明示的にすることを推奨し、常にアドレス演算子 '&'を使用します。 –

答えて

3

違いはありません。 &が含まれます。

配列がsomeArrayの場合は、&someArray[0]の代わりにsomeArrayを使用できます。

4

純粋に美容的な問題です。関数型がポインタ型に崩壊するコンテキストでは(ほとんどどこでも)、明示的単項式&は意味上の違いを生じません。あなたによく見えるものを選んでください。一貫性を保つように努力してください。


ほぼ同じことは、ポインタを通じて関数を呼び出すときに、明示的*演算子を使用してに適用されます。コールバックは、executeCallBack(buf)または(*executeCallBack)(buf)として呼び出すことができます。 2つは同等です。繰り返しますが、あなたのスタイルを選択し、それに固執します。

対称性のために、アドレスを取得するときに&を使用する場合は、関数を呼び出すときに*を使用する必要があります。

+0

したがって、 'sizeof callBack'は悪く、' sizeof&callBack'は_other_コンテキストに適していますか? – chux

+0

@chux:私はその質問を理解しているのか分かりません。私が上で述べた '&'は、そのオペランドが関数型であるコンテキストにのみ適用されます。 'callBack'自体が(関数ではなく)ポインタであれば、それは別の話です。'& 'はそのような場合に大きな違いをもたらします。 – AnT

関連する問題