콜백 함수는 다른 함수에 의해 호출되도록 설계된 함수입니다. 함수 포인터를 사용하면 특정 동작을 동적으로 결정할 수 있습니다. 예를 들어, 정렬 알고리즘에서 비교 함수를 전달하여 정렬 기준을 동적으로 설정할 수 있습니다.
#include <stdio.h>
#include <stdlib.h>
// 비교 함수 (오름차순)
int compare_asc(const void* a, const void* b) {
return (*(int*)a - *(int*)b);
}
// 비교 함수 (내림차순)
int compare_desc(const void* a, const void* b) {
return (*(int*)b - *(int*)a);
}
int main() {
int arr[] = {5, 2, 9, 1, 6};
size_t n = sizeof(arr) / sizeof(arr[0]);
// 오름차순 정렬
qsort(arr, n, sizeof(int), compare_asc);
printf("Ascending: ");
for (size_t i = 0; i < n; i++) printf("%d ", arr[i]);
printf("\\n");
// 내림차순 정렬
qsort(arr, n, sizeof(int), compare_desc);
printf("Descending: ");
for (size_t i = 0; i < n; i++) printf("%d ", arr[i]);
printf("\\n");
return 0;
}
버튼 클릭이나 키 입력과 같은 이벤트 처리에서 함수 포인터를 사용하여 동작을 동적으로 연결할 수 있습니다.
#include <stdio.h>
#include <stdlib.h>
// 함수 포인터 타입 정의
typedef void (*ButtonClickHandler)(void);
// 버튼 구조체 정의
typedef struct {
char *label;
ButtonClickHandler onClick;
} Button;
// 버튼 클릭 이벤트 핸들러 함수
void handleButton1Click() {
printf("Button 1 clicked!\\n");
}
void handleButton2Click() {
printf("Button 2 clicked!\\n");
}
// 버튼 생성 함수
Button* createButton(char *label, ButtonClickHandler handler) {
Button *button = (Button *)malloc(sizeof(Button));
button->label = label;
button->onClick = handler;
return button;
}
// 버튼 클릭 시 호출되는 함수
void clickButton(Button *button) {
if (button && button->onClick) {
button->onClick();
}
}
int main() {
// 버튼 생성
Button *button1 = createButton("Button1", handleButton1Click);
Button *button2 = createButton("Button2", handleButton2Click);
// 버튼 클릭 시뮬레이션
printf("Simulating button clicks...\\n");
clickButton(button1);
clickButton(button2);
// 메모리 해제
free(button1);
free(button2);
return 0;
}
여러 함수를 배열로 관리하여 인덱스를 통해 동적으로 호출할 수 있습니다. 상태 머신이나 명령 처리기에서 자주 사용됩니다.
#include <stdio.h>
// 연산 함수 정의
int add(int a, int b) { return a + b; }
int subtract(int a, int b) { return a - b; }
int multiply(int a, int b) { return a * b; }
int divide(int a, int b) { return b != 0 ? a / b : 0; }
int main() {
// 함수 포인터 배열 (연산 테이블)
int (*operations[4])(int, int) = {add, subtract, multiply, divide};
int choice, x = 10, y = 5;
printf("Choose operation: 0:Add, 1:Subtract, 2:Multiply, 3:Divide\\n");
scanf("%d", &choice);
if (choice >= 0 && choice < 4) {
printf("Result: %d\\n", operations[choice](x, y)); // 선택한 연산 수행
} else {
printf("Invalid choice!\\n");
}
return 0;
}