پوینترهای تابع (Function Pointers)
«پوینتر تابع (Function Pointer)» مثل شماره تماس است. به جای اشاره به «متغیر (Variable)»، به «تابع (Function)» اشاره می کند. بنابراین، آدرس تابع را نگه می دارد و با آن می توان همان تابع را صدا زد.
اعلان پوینتر تابع
الگو یعنی نوع بازگشتی، سپس نام پوینتر، سپس لیست پارامترها.
/* اعلان پوینتر به تابعی با دو int و خروجی int */
int (*ptr)(int, int);
نسبت دادن تابع به پوینتر
نام تابع خودش آدرس است. هر دو شکل زیر یکسان هستند.
ptr = add;
ptr = &add;
صدا زدن از طریق پوینتر
هر دو روش زیر تابع را اجرا می کنند.
ptr(5, 3);
(*ptr)(5, 3);
مثال کامل: جمع با پوینتر تابع
پوینتر به تابع add وصل می شود و همان را صدا می زند.
int add(int a, int b) {
return a + b;
}
int main() {
int (*ptr)(int, int) = add;
int result = ptr(5, 3);
printf("Result: %d", result);
return 0;
}
ارسال تابع به عنوان ورودی (Callback)
با پوینتر تابع، تابعی را به تابع دیگر می دهیم تا همان را صدا بزند.
void greetMorning() {
printf("Good morning!\n");
}
void greetEvening() {
printf("Good evening!\n");
}
void greet(void (*func)()) {
func();
}
int main() {
greet(greetMorning);
greet(greetEvening);
return 0;
}
آرایه ای از پوینترهای تابع
چند تابع را در آرایه می گذاریم و بر اساس نیاز اجرا می کنیم.
void add() {
printf("Add\n");
}
void subtract() {
printf("Subtract\n");
}
void multiply() {
printf("Multiply\n");
}
int main() {
void (*operations[3])() = { add, subtract, multiply };
for (int i = 0; i < 3; i++) {
operations[i]();
}
return 0;
}
نسخه ماشین حساب ساده
انتخاب عمل با اندیس، سپس صدا زدن همان تابع.
void add(int a, int b) {
printf("Result: %d\n", a + b);
}
void subtract(int a, int b) {
printf("Result: %d\n", a - b);
}
void multiply(int a, int b) {
printf("Result: %d\n", a * b);
}
int main() {
int choice;
int x = 10;
int y = 5;
void (*operations[3])(int, int) = { add, subtract, multiply };
printf("x = %d, y = %d\n\n", x, y);
printf("Choose an operation:\n");
printf("0: Add\n");
printf("1: Subtract\n");
printf("2: Multiply\n");
scanf("%d", &choice);
if (choice >= 0 && choice < 3) {
operations[choice](x, y);
} else {
printf("Invalid choice!\n");
}
return 0;
}
گام های عملی
- امضای تابع را مشخص کن.
- پوینتر سازگار را اعلان کن.
- پوینتر را مقداردهی و از طریق آن صدا بزن.
نکته: نام تابع خودش مثل پوینتر عمل می کند؛ اعلان پوینتر فقط یک متغیر قابل تغییر به تو می دهد.
بعد از این بخش، صفحه بازگشت و کالبک با پوینتر تابع را ببین.
جمع بندی سریع
- پوینتر تابع، آدرس تابع را نگه می دارد.
- می توانی تابع را پارامتر بدهی.
- آرایه ی پوینترها، منوهای منعطف می سازد.
- نام تابع خودش آدرس کد است.