web-dev-qa-db-ja.com

Cで関数ポインターの配列を定義する方法

少し質問があります。 callocを使用して関数ポインターの配列を動的に定義しようとしています。しかし、構文の書き方がわかりません。どうもありがとう。

45
strstr

関数ポインターの型は関数宣言と同じですが、関数名の代わりに「(*)」が使用されます。だからへのポインタ:

int foo( int )

だろう:

int (*)( int )

このタイプのインスタンスに名前を付けるには、スターの後に(*)の中に名前を入れます。

int (*foo_ptr)( int )

このタイプの関数を指すfoo_ptrという変数を宣言します。

配列は、変数の識別子の近くに角かっこを置く通常のC構文に従います。

int (*foo_ptr_array[2])( int )

2つの関数ポインターの配列であるfoo_ptr_arrayという変数を宣言します。

構文はかなり複雑になる可能性があるため、関数ポインターへのtypedefを作成し、代わりにそれらの配列を宣言する方が簡単な場合がよくあります。

typedef int (*foo_ptr_t)( int );
foo_ptr_t foo_ptr_array[2];

どちらのサンプルでも、次のようなことができます。

int f1( int );
int f2( int );
foo_ptr_array[0] = f1;
foo_ptr_array[1] = f2;
foo_ptr_array[0]( 1 );

最後に、次のいずれかで動的に配列を割り当てることができます。

int (**a1)( int ) = calloc( 2, sizeof( int (*)( int ) ) );
foo_ptr_t * a2 = calloc( 2, sizeof( foo_ptr_t ) );

A1を関数ポインターへのポインターとして宣言するために、最初の行の余分な*に注意してください。

110
Andrew Eidsness

あなたに役立つかもしれない小さな例をここに置きます

typedef void (*fp)(int); //Declares a type of a void function that accepts an int

void test(int i)
{
    printf("%d", i);
}

int _tmain(int argc, _TCHAR* argv[])
{
    fp function_array[10];  //declares the array

    function_array[0] = test;  //assings a function that implements that signature in the first position

    function_array[0](10); //call the cuntion passing 10

}
5
Andres

関数ポインタの配列を次のように宣言します

T (*afp[N])(); 

一部のタイプT。配列を動的に割り当てるので、次のようにします

T (**pfp)() = calloc(num_elements, sizeof *pfp);

または

T (**pfp)() = malloc(num_elements * sizeof *pfp);

次に、各関数を次のように呼び出します

T x = (*pfp[i])();

または

T x = pfp[i](); // pfp[i] is implicitly dereferenced

非正統派になりたい場合は、関数へのポインターの配列へのポインターを宣言し、次のように割り当てることができます。

T (*(*pafp)[N])() = malloc(sizeof *pafp);

ただし、呼び出しを行うときに配列ポインタを区別する必要があります。

x = (*(*pafp)[i])();
4
John Bode

すべての関数がvoid ()(void)型であると仮定すると、次のようになります

typedef void (*fxptr)(void);
fxptr *ptr; // pointer to function pointer
ptr = malloc(100 * sizeof *ptr);
if (ptr) {
    ptr[0] = fx0;
    ptr[1] = fx1;
    /* ... */
    ptr[99] = fx100;

    /* use "dynamic array" of function pointers */

    free(ptr);
}
1
pmg
typedef R (*fptr)(A1, A2... An);

ここで、Rは戻り値の型、A1、A2 ... Anは引数の型です。

fptr* arr = calloc(num_of_elements,sizeof(fptr));
1
Armen Tsirunyan