0

次のプログラムでは、関数ポインターは、引数を受け入れずに int を返す関数を指すように定義されていますが、関数ポインターはここで機能します。なんで?

#include<stdio.h>

int mul(int*,int*);

int main()
{   int a=10,b=20;
    int(*p)();
    p=&mul;
    printf("%d ", (*p)(&a,&b));
        return 0;
}


int mul(int*a,int*b)
{   
    return (*a * *b);
}

4

1 に答える 1

3

C では、指定されていない数の引数int (*p)()を取って return を返す関数へのポインターを宣言することを意味します。引数の数は指定されていないため、関数へのポインタをvariableに代入することは有効ですintint mul(int *a, int *b)p

宣言を に変更するとint (*p)(void)、つまり、引数を取らずを返す関数へのポインターを宣言することintになり、コンパイラーは互換性のないポインター型に関する警告をスローする可能性があります。gcc の場合、デフォルトの警告レベルで警告がスローされます。

Keith Thompson がコメントで述べたように、常にプロトタイプ、つまりパラメーターの型を指定する宣言を使用する必要があります。この場合、次のようになります。

int (*p)(int*, int*);

参照

于 2013-09-16T02:53:11.433 に答える