少し質問があります。 calloc
を使用して関数ポインターの配列を動的に定義しようとしています。しかし、構文の書き方がわかりません。どうもありがとう。
関数ポインターの型は関数宣言と同じですが、関数名の代わりに「(*)」が使用されます。だからへのポインタ:
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を関数ポインターへのポインターとして宣言するために、最初の行の余分な*に注意してください。
あなたに役立つかもしれない小さな例をここに置きます
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
}
関数ポインタの配列を次のように宣言します
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])();
すべての関数が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);
}
typedef R (*fptr)(A1, A2... An);
ここで、Rは戻り値の型、A1、A2 ... Anは引数の型です。
fptr* arr = calloc(num_of_elements,sizeof(fptr));