Menu
Coddy logo textTech

הצהרת מצביעים לפונקציות

חלק מהיחידה תכנות מונחה עצמים במסלול ה-C של Coddy. שיעור 33 מתוך 61.

עד כה למדנו לדמות ירושה באמצעות הטמעת struct. אבל פולימורפיזם אמיתי, שבו אובייקטים שונים מגיבים באופן שונה לאותה קריאה, דורש משהו נוסף: מצביעי פונקציות.

מצביע לפונקציה הוא משתנה שמאחסן את הכתובת של פונקציה. בדומה למצביע רגיל שמחזיק את הכתובת של נתונים, מצביע לפונקציה מחזיק את הכתובת של קוד בר־ביצוע.

התחביר עשוי להיראות מאיים בהתחלה. כדי להצהיר על מצביע לפונקציה, מציינים את טיפוס הערך המוחזר, לאחר מכן את שם המצביע בסוגריים עם כוכבית, ואחריו את טיפוסי הפרמטרים:

int (*operation)(int, int);

כך מצהירים על משתנה בשם operation שיכול להצביע על כל פונקציה שמקבלת שני פרמטרים מסוג int ומחזירה int. הסוגריים סביב *operation חיוניים; בלעדיהם, היית מצהיר על פונקציה שמחזירה מצביע.

כדי לשייך פונקציה למצביע הזה, פשוט השתמש בשם הפונקציה (ללא סוגריים):

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

int (*operation)(int, int);
operation = add;  // כעת operation מצביע על add

שם הפונקציה משמש ככתובת שלה. אפשר גם להשתמש במפורש ב־&add, אבל זה לא חובה: שתי הצורות שקולות ב־C.

challenge icon

אתגר

קל

בואו נתרגל הכרזה על מצביעים לפונקציות והשמת פונקציות בהם. תיצור מערכת פשוטה לפעולות מתמטיות, שבה מצביע לפונקציה יכול להצביע על פונקציות חשבוניות שונות.

כתוב תוכנית ש:

  1. מגדירה שתי פונקציות:
    • multiply: מקבלת שני פרמטרים מסוג int ומחזירה את המכפלה שלהם
    • subtract: מקבלת שני פרמטרים מסוג int ומחזירה את הראשון פחות השני
  2. בתוך main, מכריזה על משתנה מצביע לפונקציה בשם operation, שיכול להצביע על פונקציות המקבלות שני פרמטרים מסוג int ומחזירות int
  3. קוראת שלוש קלטים: שני מספרים שלמים וקוד פעולה (1 עבור כפל, 2 עבור חיסור)
  4. על סמך קוד הפעולה, משייכת את הפונקציה המתאימה למצביע operation שלך
  5. מדפיסה את שם הפעולה המשויכת, ואז מדפיסה את התוצאה של קריאה לפונקציה דרך המצביע

תקבל שלושה קלטים: המספר הראשון, המספר השני וקוד הפעולה (1 או 2).

הפלט שלך אמור להיראות כך:

Operation: multiply
Result: 35

כאשר multiply הוא שם הפעולה (או subtract אם הקוד הוא 2), ו-35 היא התוצאה של קריאה לפונקציה דרך המצביע שלך (במקרה הזה, 5 × 7).

זכור: כדי להכריז על מצביע לפונקציה, צריך לציין את סוג הערך המוחזר, את שם המצביע בסוגריים עם כוכבית, ואת סוגי הפרמטרים. כדי לשייך פונקציה, השתמש רק בשם הפונקציה ללא סוגריים.

נסו בעצמכם

#include <stdio.h>

// TODO: הגדירו כאן את הפונקציה multiply


// TODO: הגדירו כאן את הפונקציה subtract


int main() {
    int num1, num2, code;
    
    // קראו קלט
    scanf("%d", &num1);
    scanf("%d", &num2);
    scanf("%d", &code);
    
    // TODO: הכריזו על מצביע לפונקציה בשם 'operation' שיכול להצביע על
    // פונקציות שמקבלות שני פרמטרים מסוג int ומחזירות ערך מסוג int
    
    
    // TODO: על סמך קוד הפעולה (1 לכפל, 2 לחיסור),
    // הקצו למצביע הפעולה את הפונקציה המתאימה
    
    
    // TODO: הדפיסו את שם הפעולה ואת התוצאה
    // פורמט:
    // Operation: <name>
    // Result: <result>
    
    return 0;
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר C אונליין