본문 바로가기
프로그래밍/C, C++

C 언어 함수 포인터

by argentdarae 2025. 4. 10.
반응형

함수의 시작 주소를 가리키는 포인터로, 실행 도중 특정 함수를 동적으로 선택하여 실행할 수 있다. C#의 delegate와 비슷하다

 

선언 형식은 다음과 같다

<반환형> (*<변수명>)(<매개변수 목록>);

 

오른쪽 - 왼쪽 규칙으로 해석한다

 

함수 포인터 또한 객체이기 때문에 배열에 담을 수 있다

#include <stdio.h>

/* 예: 사칙연산 함수를 정의 */
int add(int a, int b)    
{ 
    return a + b;
}

int sub(int a, int b)    
{ 
    return a - b;
}

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

int divide(int a, int b) 
{ 
    /* 0으로 나눌 때는 예외 처리가 필요하지만, 여기서는 단순히 처리 */
    return b == 0 ? 0 : a / b; 
}

int main(void)
{
    /* 1) 함수 포인터 선언 */
    /* int (*op)(int, int);  --> op는 int형 두 개를 받는 함수를 가리키는 포인터 */
    
    /* 2) 여러 함수 포인터를 배열에 담기 */
    /* ops[i]는 (int, int) -> int 형태의 함수를 가리키는 포인터 */
    int (*ops[])(int, int) = { add, sub, mul, divide };
    
    /* 3) 사용자 입력 예시 */
    int x, y;
    int choice;
    printf("두 정수를 입력하세요: ");
    scanf("%d %d", &x, &y);

    printf("연산을 선택하세요 (0: add, 1: sub, 2: mul, 3: divide): ");
    scanf("%d", &choice);

    /* 4) 배열에서 해당 인덱스의 함수 포인터를 가져와 호출 */
    if (choice >= 0 && choice < 4) {
        int result = ops[choice](x, y);
        printf("결과: %d\n", result);
    } else {
        printf("잘못된 선택입니다.\n");
    }

    return 0;
}


================ 실행 결과 ================
두 정수를 입력하세요: 10 3
연산을 선택하세요 (0: add, 1: sub, 2: mul, 3: divide): 2
결과: 30

Reference

Function Pointers - GNU Manual

Pointer declaration - cppreference.com

'프로그래밍 > C, C++' 카테고리의 다른 글

C 언어 void 포인터 (void*)  (0) 2025.04.10
C 언어 공용체 (union)  (0) 2025.04.10
C 구조체와 비트 플래그  (0) 2025.04.10
C 구조체 사용 시 포인터 저장 문제  (0) 2025.04.09
C 언어의 구조체  (0) 2025.04.09