15 מצביעים לפונקציות
בפרקים הקודמים ראינו כי מצביעים עשויים להורות על נתונים השמורים במערכים, רשימות או עצים. אמרנו כי למעשה עת משתנה מטיפוס מצביע מורה על משתנה כלשהו הוא (המצביע) מכיל את כתובתו של המשתנה עליו המצביע מורה; במילים אחרות, עת אנו מציירים חץ הנשלח מהמצביע לאובייקט עליו המצביע מורה, אנו מדגימים בכך בצורה מוחשית, וקלה יותר להבנה, כי המצביע מכיל את הכתובת המתאימה. בפרק הראשון אמרנו כי אחד ממאפייני מחשבי פון-נויימן, בהם אנו עושים שימוש, הוא שזיכרון יחיד מכיל הן תכניות, והן נתונים עליהם פועלות התכניות. הוספנו כי לכל תא בזיכרון יש כתובת; משמע הן לתא המכיל נתונים יש כתובת, והן לתא המכיל קטע תכנית. אם זה המצב, אזי כפי שמצביע עשוי להצביע על נתון, הוא יכול להצביע על קטע תכנית. בפרק זה נכיר את ההשתמעויות של אפשרות זאת.
15.1 דוגמה ראשונה, בסיסית
תרגול עצמי בסיסי בנושא מצביעים לפונ'
כתבו את הפונ' הבאות המקבלות מספר שלם (כפרמטר ערך) ומציגה אותו על המסך:
א. פונ' המציגה את המספר עם פסיק ורווח אחריו (כלומר: ,17)
ב. פונ' המציגה את המספר בין שני מקפים מכל צד (כלומר --17--)
ג. פונ' המציגה את המספר ואחר שוברת שורה
כתבו תכנית המגדירה מערך בן חמישה תאים, ומגרילה לתוכו ערכים.
עתה המשתמש בוחר כיצד הוא ירצה לראות את הפלט (בדרך א', דרך ב', או דרך ג' הנ"ל), ועל-פי בחירתו הפנו משתנה מטיפוס מצביע לפונ' (בשם print_func_ptr) להצביע על הפונ' המתאימה.
עתה בלולאה, הציגו את תוכנו של המערך, תוך שבכל סיבוב בלולאה אתם מזמנים את print_func_ptr עם התא המתאים במערך.
15.2 דוגמה שניה למצביע לפונקציה: פונ' המקבלת מצביע לפונ' כפרמטר
תרגול עצמי בנושא פונ' המקבלת כפרמטר פונ' של משתנה אחד
15.3 מוטיבציה לפונ' מיון המקבלת מצביע לפונ' כפרמטר
15.4 פונ' מיון המקבלת מצביע לפונ' כפרמטר
תרגול עצמי בסיסי בנושא פונ' מיון המקבלת מצביע לפונ' כפרמטר
כתבו תכנית המגדירה מערך של מחרוזות:
char strs[MAX_STRS][MAX_STR_LEN]
וקוראת מהמשתמש מחרוזות למערך.
עתה, על פי בקשתו של המשתמש, התכנית תמיין את המערך באחת משלוש דרכים שונות:
א. בסדר לקסיקוגרפי עולה
ב. בסדר עולה של אורך המחרוזות (כלומר מחרוזת קצרה יותר תחשב לקטנה יותר)
ג. כך שכל המחרוזות שכוללות אותיות בלבד תופענה בתחילת המערך, וכל אלה שכוללות גם תווים שאינם אותיות תופענה בסוף המערך (ואין חשיבות לסדר בתוך מחרוזות הכוללות אותיות בלבד, או בתוך המחרוזות הכוללות גם תווים אחרים).
פונ' המיון, כמובן, תקבל מצביע לפונ' ההשוואה המתאימה.
לבסוף הציגו את תוכנו של המערך.
15.5 פונ' הדפסת מערך המקבלת מצביע לפונ' כפרמטר
תרגול עצמי בסיסי בנושא פונ' הדפסה המקבלת מצביע לפונ' כפרמטר
נחזור לתכנית הקודמת, ונשנה אותה במעט:
כתבו את הפונ' הבאות המקבלות מספר שלם (כפרמטר ערך) ומציגה אותו על המסך:
א. פונ' המציגה את המספר עם פסיק ורווח אחריו (כלומר: ,17)
ב. פונ' המציגה את המספר בין שני מקפים מכל צד (כלומר --17--)
ג. פונ' המציגה את המספר ואחר שוברת שורה
כתבו תכנית המגדירה מערך בן חמישה תאים, ומגרילה לתוכו ערכים.
עתה המשתמש בוחר כיצד הוא ירצה לראות את הפלט (בדרך א', דרך ב', או דרך ג' הנ"ל), ועל-פי בחירתו הפנו משתנה מטיפוס מצביע לפונ' (בשם print_func_ptr) להצביע על הפונ' המתאימה.
לבסוף, זמנו את הפונ' print_arr אשר תדפיס את המערך. הפונ' תקבל כפרמטרים את המערך, ואת המצביע לפונ' המדפיסה מספר שלם בודד.