בקצרה ובפשטות ניתן לומר כי מצביע הוא משתנה המכיל כתובת של משתנה אחר, במילים אחרות מצביע הוא משתנה אשר מַפנה אותנו למשתנה אחר.
כתבו תכנית המגדירה משתנה שלם num ומאתחלת אותו לערך אפס.
התכנית לא תכלול שום פקודת השמה למשתנה num עצמו. כלומר לא תהיה בה שום פקודה מהצורה:
num = 17;
למרות זאת, בעקבות פעולות אחרות שתבצעו בתכנית (ושהאתגר שלכם הוא להחליט מה הן), עת התכנית, לקראת סיומה, תבצע:
cout << num ;
יודפס הערך 17
כתבו תכנית המגדירה מצביע מטיפוס * int; קוראת מהמשתמש מה גודל המערך הרצוי לו; מקצה מערך בגודל הרצוי; קוראת נתונים למערך; מציגה את ממוצע הערכים במערך; משחררת את המערך; ומסיימת.
כתבו תכנית המגדירה מצביע מטיפוס * int; קוראת מהמשתמש מה גודל המערך הרצוי לו; מקצה מערך בגודל הרצוי; וקוראת נתונים למערך.
עתה התכנית מזמנת פונ' אשר מחשבת ומחזירה את ממוצע הערכים במערך. התכנית הראשית מציגה את הממוצע, משחררת את המערך; ומסיימת.
כתבו תכנית המגדירה מצביע מטיפוס * int.
עתה התכנית מזמנת פונ' אשר קוראת מהמשתמש מה גודל המערך הרצוי לו; ומקצה מערך בגודל הרצוי (באופן שהמערך יעמוד לרשות התכנית בכללותה).
בשלב הבא main מזמנת פונ' אשר קוראת נתונים למערך שהוקצה.
עתה התכנית מזמנת פונ' אשר מחשבת ומחזירה את ממוצע הערכים במערך.
התכנית הראשית מציגה את הממוצע, משחררת את המערך; ומסיימת.
כתבו תכנית המגדירה מצביע מטיפוס * int.
עתה התכנית מזמנת פונ' אשר קוראת מהמשתמש מה גודל המערך הרצוי לו; מקצה מערך בגודל הרצוי , ומחזירה את המערך לתכנית הראשית (באמצעות פקודת return).
בשלב הבא main מזמנת פונ' אשר קוראת נתונים למערך שהוקצה.
עתה התכנית מזמנת פונ' אשר מחשבת ומחזירה את ממוצע הערכים במערך.
התכנית הראשית מציגה את הממוצע, משחררת את המערך; ומסיימת.
כתבו תכנית הכוללת פונ' אשר מבצעת את המשימה הבאה: הפונ' מתגלגלת בלולאה עד קבלת ערך 0.
הפונ' מתחילה עם מערך ריק (בן אפס תאים).
עת המשתמש מזין לה את הערך 1 הדבר מורה שברוצונו להגדיל את המערך. הקלט הבא, size, מורה בכמה תאים יש להגדיל את המערך, ואחר המשתמש מזין ערכים ל: size תאים החדשים.
התכנית, כמובן, תגדיל את המערך בשיעור הרצוי, תקרא ערכים לתאים החדשים שנוספו, ותציג את המערך.
עת המשתמש מזין לה את הערך 2 הדבר מורה שברצונו להקטין את המערך. הקלט הבא size מורה בכמה תאים יש להקטין את המערך.
התכנית תקצה מערך חדש, קטן יותר בשיעור size תאים, ותעביר אליו את הערכים מתאי המערך הראשונים, כפי שיש מקום במערך החדש. לבסוף התכנית תציג את תוכנו של המערך (המוקטן).
עת הפונ' קוראת את הערך אפס היא משחררת את המערך, וחוזרת.
כתבו תכנית המגדירה מערך של מצביעים (ל: int) בן N תאים, וכוללת את הפונ' הבאות:
כתבו תכנית הכוללת את הפונ' הבאות:
עת למדנו על פונ', והיכרנו את פרמטרי ההפניה, עשינו זאת באמצעות הפונ': sum_div.
לפונ' יש ארבעה פרמטרים שהינם מספרים שלמים, באמצעות שני הראשונים היא מקבלת שני מספרים. על הפונק' לחשב את הסכום וההפרש של שני המספרים שהועברו לה, ולהכניס את התוצאה לשני הפרמטרים האחרונים. חתימה הפונ' שראינו הייתה:
void sum_dif( int n1, int n2, int &sum, int &dif)
כתבו שוב את הפונ' אולם הפעם עם מצביעים במקום פרמטרי הפניה. כלומר חתימת הפונ' תראה:
void better_sum_dif(int n1, int n2, int *sum, int *dif)
שלבו את הפונ' בתכנית שבודקת את תקינותה: התכנית תגדיר ארבה משתנים מטיפוס int:
int num1, num1, the_sum, the_diff
התכנית תכניס ערכים ל: num1, num2, תזמן את הפונ' better_sum_dif עם ארבעת המשתנים, ותציג את תוצאת החישוב כפי שבוצעה ע"י הפונ' והוכנסה ל: The_sum, the_diff.
כתבו תכנית המקבלת מספר כלשהו של מחרוזות. על התכנית להציג את המחרוזת הגדולה ביותר שהועברה לה.
אם לא הועברה לתכנית אף מחרוזת (ערכו של argc הוא אחד) אזי היא מוציאה הודעת שגיאה, ומסיימת. לדוגמה, בהרצה כגון:
prog dana muhamad yosi alaa
יוצג הפלט: yosi
בהרצה:
prog
יוצג הפלט:
Usage: prog <string-1>...<string-n>
בסעיף זה אציג, באמצעות סרטון בלבד, את האופן בו נשחרר מערך דו-ממדי דינאמי (כפי שהוקצה בסעיף 11.8)
כפי שאמרנו, זליגת זיכרון היא תקלה חמורה ביותר בתכנית מחשב. בתכניות הקטנות שאנו כותבים, גם אם חלה זליגה, שום דבר 'נורא' לא יקרה. אך עת תכניות הופכות להיות גדולות, ורצות זמן רב (אולי עד בלי די) גם זליגה קטנה, עלולה להצטבר לכדי כמות רבה של זיכרון מבוזבז: כזה שמוקצה מצד אחד, אך לא שמיש מצד שני. בזבוז של מאשב יקר כמו זיכרון היא בגדר דבר רע מאוד.
מערכת הפעלה UNIX מעמידה לרשותנו כלי הקרוי valgrind, ואשר מסייע לנו לבדוק האם בתכנית שלנו חלה, חלילה, זליגת זכרון.
אציג את הכלי באמצעות שני סרטונים קצרים ופשוטים.
בסעיף זה אציג שאלות מבחינות בנושא הקצאה דינאמית של מערכים. בכל שאלה יש לכתוב פונ' אשר מקבלת נתונים כלשהם, ומבצעת עליהם משימה.
אני ממליץ לכם לכתוב את הפונ' על דף, ולסמלצן. על דרך השלילה, אני לא ממליץ לכתוב תכנית שלמה אשר כוללת את הפונ', שכן הטרחה בכתיבה של תכנית שלמה, ובהבאתה למצב של ריצה אינו מצדיק, לעניות דעתי, את התועלת הכרוכה בכך (היכולת לבדוק באופן חד-משמעי את הקוד שלכם).