programing

C에서 함수 포인터의 배열을 정의하는 방법

minecode 2022. 10. 2. 14:59
반응형

C에서 함수 포인터의 배열을 정의하는 방법

질문이 하나 있는데요.함수 포인터의 배열을 동적으로 정의하려고 합니다.calloc그런데 구문을 어떻게 쓰는지 모르겠어요.정말 감사해요.

함수 포인터의 유형은 함수 선언과 동일하지만 함수 이름 대신 "*"가 있습니다.그래서 포인터:

int foo( int )

다음과 같습니다.

int (*)( int )

이 유형의 인스턴스 이름을 지정하려면 별 뒤에 (*) 안에 이름을 입력합니다.이렇게 하려면 다음과 같이 하십시오.

int (*foo_ptr)( int )

foo_ptr이라는 변수를 선언합니다.이러한 유형의 함수를 가리킵니다.

배열은 변수 식별자 근처에 대괄호를 배치하는 일반적인 C 구문을 따릅니다.따라서 다음과 같습니다.

int (*foo_ptr_array[2])( int )

foo_ptr_array라는 변수를 선언합니다.이 변수는 2개의 함수 포인터의 배열입니다.

구문이 매우 복잡해질 수 있으므로 함수 포인터에 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])();
typedef R (*fptr)(A1, A2... An);

여기서 R은 반환 타입, A1, A2...an은 인수 유형입니다.

fptr* arr = calloc(num_of_elements,sizeof(fptr));

모든 기능이 유형이라고 가정합니다.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);
}

언급URL : https://stackoverflow.com/questions/5488608/how-define-an-array-of-function-pointers-in-c

반응형