0

何度も聞かれましたことをお詫び申し上げます。警告やその他の目に見える問題(Xcodeで)なしで両方が正常に機能する理由を理解しようとしています:

int testFunctionAcceptingIntPointer(int * p) {         
    return *p = *p +5;
}

void test() {
    int testY = 7;
    typedef int (*MyPointerToFunction)(int*);
    // Both this (simply a function name):
    MyPointerToFunction functionPointer = testFunctionAcceptingIntPointer;
    // And this works (pointer to function):
    MyPointerToFunction functionPointer = &testFunctionAcceptingIntPointer;
    int y = functionPointer(&testY);
}
4

1 に答える 1

5

関数指定子は関数ポインターに変換されるため、コードは双方向で警告なしに正常に機能します

MyPointerToFunction functionPointer = testFunctionAcceptingIntPointer;

アドレス演算子のオペランドでない限り

MyPointerToFunction functionPointer = &testFunctionAcceptingIntPointer;

(またはsizeofおよび_Alignof)。

最初の割り当てではを使用しない&ため、自動変換が行われ、適切なタイプの関数ポインターが生成されます。2番目の割り当てでは、アドレスを明示的に取得して、適切なタイプの関数ポインターが生成されます。

于 2012-12-18T15:56:45.687 に答える