C

[C언어] C언어 함수 포인터(Function Pointer) 정리

연화 2025. 3. 26. 20:09

C언어의 고급 기능 중 하나인 함수 포인터(Function Pointer)는, 함수를 포인터로 가리켜서 함수를 동적으로 선택하거나 전달할 수 있는 강력한 도구입니다.

처음 접하면 굉장히 생소하고 복잡해 보이지만, 원리를 알고 나면 아주 유용하게 사용할 수 있습니다. 특히 콜백 함수, 함수 배열, 전략 패턴 구현 등에서 많이 사용됩니다.

 

📌 함수도 메모리에 저장된다?

모든 함수도 메모리 어딘가에 저장됩니다. 따라서 함수의 주소를 변수에 저장할 수 있고, 이 변수를 통해 함수를 호출할 수 있습니다.

int add(int a, int b) {
    return a + b;
}

위 함수는 add라는 이름을 가지고 있지만, 사실 add는 함수의 시작 주소를 의미합니다. 따라서 아래와 같은 표현도 가능합니다.

int (*fp)(int, int);  // 함수 포인터 선언
fp = add;             // 함수 포인터에 주소 저장

 


 

📌 함수 포인터 선언 문법

함수 포인터는 다음과 같이 선언합니다:

반환형 (*포인터이름)(매개변수형식들);
int (*funcPtr)(int, int); // int형 인자 2개 받고, int형 반환

여기서 (*funcPtr)이 핵심입니다. 괄호를 빼면 반환형 함수 선언이 되어버리니 주의하세요!

 


 

📌 함수 포인터 사용 예제

#include <stdio.h>

int add(int a, int b) {
    return a + b;
}

int main() {
    int (*fp)(int, int);  // 함수 포인터 선언
    fp = add;             // 함수 주소 대입

    int result = fp(3, 5); // 함수 호출
    printf("결과: %d\n", result); // 8

    return 0;
}

✅ fp(3, 5)는 add(3, 5)와 동일합니다.

 


 

📌 함수 포인터를 함수에 전달하기

함수 포인터는 다른 함수의 매개변수로 전달할 수 있습니다. 이 방식은 특히 **콜백 함수(callback)**로 활용됩니다.

void compute(int x, int y, int (*op)(int, int)) {
    printf("결과: %d\n", op(x, y));
}

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

int main() {
    compute(10, 5, add); // 15
    compute(10, 5, sub); // 5
    return 0;
}

✅ 이처럼 함수 이름만 넘기면 함수 포인터로 전달됩니다!


 

📌 함수 포인터 배열

여러 개의 함수를 배열로 묶어서 필요할 때마다 선택적으로 호출할 수도 있습니다.

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 main() {
    int (*ops[3])(int, int) = {add, sub, mul};

    for (int i = 0; i < 3; i++) {
        printf("연산 결과: %d\n", ops[i](10, 2));
    }

    return 0;
}
  • ops[0] → add
  • ops[1] → sub
  • ops[2] → mul

함수를 배열처럼 관리할 수 있어서 확장성과 유지보수에 큰 도움이 됩니다.

 


 

📌 typedef로 함수 포인터 간단히 선언하기

함수 포인터는 문법이 길고 복잡하니 typedef로 간단히 만들어두면 좋습니다.

typedef int (*Operation)(int, int);

int add(int a, int b) { return a + b; }

int main() {
    Operation op = add;
    printf("%d\n", op(7, 3)); // 10
    return 0;
}

가독성이 훨씬 좋아지죠?

 


 

📌 함수 포인터는 어디에 쓰이나요?

활용 예시설명
콜백 함수 예: 정렬 함수에 비교 함수를 인자로 전달
동적 실행 런타임에 실행할 함수 선택 가능
전략 패턴 여러 알고리즘 중 하나를 선택 실행
이벤트 핸들링 사용자 이벤트에 따라 함수 호출 다르게 설정
함수 배열 메뉴 시스템이나 명령 처리기에서 유용

 


 

✅ 정리하며

함수 포인터는 어렵지만, 알고 나면 정말 유용한 기능입니다.

  • 함수도 주소를 가질 수 있다
  • 함수 포인터를 선언하고 함수 주소를 저장할 수 있다
  • 이를 통해 함수 호출을 동적으로 제어할 수 있다
  • typedef와 배열을 함께 사용하면 더욱 유연한 구조가 가능하다

 

 

처음엔 int (*fp)(int, int) 같은 문법이 낯설겠지만, 몇 번 직접 써보다 보면 금방 익숙해집니다!

 

 

👀 포인터와 관련한 다른 포스팅이 궁금하다면 아래의 글을 추천해요

 

[C언어] 포인터(Pointer) - 정보처리기사 실기 준비

정보처리기사 실기 준비하면서 C언어의 개념을 간단하게 잡기 위해 공부하고 있는데요. 자료구조나 연산자 등은 자바와 비슷한 맥락이기 때문에 저는 바로 포인터 개념부터 시작했습니다.C언어

dev-yeonwha.tistory.com

 

[C언어] 배열과 포인터의 관계

C언어를 배우다 보면 배열과 포인터가 비슷한 것처럼 느껴질 때가 많습니다. 실제로 이 둘은 밀접한 관련이 있지만, 동일한 개념은 아닙니다. 오늘은 그 차이와 관계를 정리해볼게요. 📌 배열

dev-yeonwha.tistory.com

 

[C언어] 이중 포인터(Double Pointer) 정리

C언어에서 포인터도 어렵지만, 그 위에 포인터를 또 가리키는 이중 포인터(double pointer)는 진입 장벽이 훨씬 높습니다. 하지만 이중 포인터는 고급 C프로그래밍, 동적 메모리 할당, 다차원 배열 처

dev-yeonwha.tistory.com