C funksiya ko‘rsatkichlari
Funksiya ko‘rsatkichi
Funksiya ko‘rsatkichi oddiy ko‘rsatkichga o‘xshaydi, lekin u o‘zgaruvchiga emas, funksiyaga ishora qiladi.
Ya’ni u funksiyaning manzilini saqlaydi va bu o‘sha funksiyani ko‘rsatkich orqali chaqirish imkonini beradi.
Funksiya ko‘rsatkichlari dastur ishlayotgan paytda qaysi funksiyani bajarishni hal qilish imkonini beradi, shuningdek funksiyani boshqa funksiyaga argument sifatida uzatmoqchi bo‘lganingizda ham qo‘l keladi.
Buni telefon raqamini saqlab qo‘yishga o‘xshatish mumkin — ko‘rsatkich funksiya xotiraning qayerida joylashganini biladi, shuning uchun uni keyinroq "chaqirish" mumkin.
Funksiya ko‘rsatkichini e’lon qilish
Funksiya ko‘rsatkichini e’lon qilishning umumiy sintaksisi:
returnType (*pointerName)(parameterType1, parameterType2, ...);
Masalan:
int (*ptr)(int, int);
Bu ptr ikkita int qiymat qabul qilib, int qaytaradigan funksiyaga ko‘rsatkich ekanini bildiradi.
Funksiyani ko‘rsatkichga o‘zlashtirish
Funksiyani ko‘rsatkichga ikki usulda o‘zlashtirish mumkin:
ptr = add;
ptr = &add;
Ikkalasi ham bir xil, chunki funksiya nomi allaqachon uning xotiradagi manzilini ifodalaydi.
Funksiyani ko‘rsatkich orqali chaqirish
Ko‘rsatkichga qiymat o‘zlashtirilgach, funksiyani ikki usulda chaqirish mumkin:
ptr(5, 3);
(*ptr)(5, 3);
Ikkalasi ham to‘g‘ri va bir xil vazifani bajaradi.
Funksiya ko‘rsatkichi misoli
Endi funksiya ko‘rsatkichini qanday e’lon qilish va unga qiymat o‘zlashtirishni bilganingizdan so‘ng, to‘liq misolni ko‘rib chiqaylik:
Misol
Ikki sonni qo‘shadigan funksiyaga ko‘rsatkich:
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;
}
Bu yerda:
ptr—add()funksiyasiga ko‘rsatkich.ptr(5, 3)funksiyani ko‘rsatkich orqali chaqiradi.
Bu xuddi add(5, 3) chaqiruvi kabi ishlaydi.
Eslatma: Funksiya nomining o‘zi xotiradagi kodining boshiga ishora qiladi. Demak, funksiya nomi allaqachon ko‘rsatkich kabi ishlaydi! Funksiya ko‘rsatkichini e’lon qilish sizga shunchaki shu manzilni saqlay oladigan o‘zgaruvchi beradi — shu tariqa uni o‘zgartirishingiz yoki boshqa joylarga uzatishingiz mumkin.
Funksiyani argument sifatida uzatish
Funksiya ko‘rsatkichlarini boshqa funksiyalarga uzatish mumkin — bu callback deb ataladi.
Bu funksiyaga siz kirish sifatida bergan boshqa funksiyani chaqirish imkonini beradi.
Misol
Funksiya ko‘rsatkichini boshqa funksiyaga uzatish:
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;
}
Bu yerda greet() boshqa funksiyani parametr sifatida qabul qiladi va uni chaqiradi. Bu hodisalarga asoslangan (event-driven) dasturlarda yoki foydalanuvchi taqdim etadigan callback funksiyalarini talab qiluvchi kutubxonalarda keng qo‘llaniladi.
Funksiya ko‘rsatkichlari massivi
Bir nechta funksiya ko‘rsatkichini massivda ham saqlashingiz mumkin — shunda dastur ishlayotgan paytda qaysi funksiyani bajarishni tanlay olasiz.
Bu misol funksiya ko‘rsatkichlari massivi yordamida uchta turli funksiyani bajaradi:
Misol
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;
}
Bu ko‘pincha oddiy menyular, buyruqlar ro‘yxatlari yoki kalkulyatorlarda — foydalanuvchi kiritgan ma’lumotga qarab turli funksiyalarni chaqirish kerak bo‘lgan har qanday joyda qo‘llaniladi.
Misol
Funksiya ko‘rsatkichlari massividan foydalanadigan oddiy kalkulyator:
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, x = 10, 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\n1: Subtract\n2: Multiply\n");
scanf("%d", &choice);
if (choice >= 0 && choice < 3) {
operations[choice](x, y);
} else {
printf("Invalid choice!\n");
}
return 0;
}
Ushbu dasturda:
- Uchala matematik funksiya (
add(),subtract()vamultiply()) massivda saqlanadi. - Foydalanuvchi son kiritib, qaysi birini bajarishni tanlaydi.
- So‘ngra kerakli funksiya ko‘rsatkichlar massivi orqali chaqiriladi.
Bu funksiya ko‘rsatkichlari massivlari dasturlarni qanday qilib moslashuvchan va qayta foydalanishga qulay qilishining oddiy misoli.
Funksiya ko‘rsatkichi va oddiy funksiya
| Oddiy funksiya | Funksiya ko‘rsatkichi |
|---|---|
| Bevosita nomi orqali chaqiriladi | Ko‘rsatkich orqali chaqiriladi |
| Funksiya dastur ishga tushishidan oldin belgilanadi | Qaysi funksiyani chaqirishni dastur ishlayotgan paytda tanlash mumkin |
| Oddiy kod uchun mos | Moslashuvchan va qayta foydalaniladigan kod uchun mos |
Xulosa
- Funksiya ko‘rsatkichi funksiyaning manzilini saqlaydi.
- U orqali funksiyalarni e’lon qilish, o‘zlashtirish va chaqirish mumkin.
- U funksiyalarni boshqa funksiyalarga argument sifatida uzatish imkonini beradi.
- Callback funksiyalari, menyular va moslashuvchan dastur tuzilmasi uchun foydali.
W3Schools Pathfinder
Yutuqlaringizni kuzating – bu bepul!
