מבוא למדעי המחשב © אריק פרידמן 1 מצביעים כמערכים דוגמה
מבוא למדעי המחשב © אריק פרידמן 2 המטרה העברת מערך כפרמטר לפונקציה לא מעתיקים את המערך (by value), אלא מעבירים את הכתובת שלו. הדרך
מבוא למדעי המחשב © אריק פרידמן 3 הדוגמה – פונקציה לחישוב ציון ממוצע מה שרוצים : מקבלת מערך של מספרים עשרוניים כקלט מחזירה את הממוצע שלהם
מבוא למדעי המחשב © אריק פרידמן4 הפונקציה : double average(double *grades, int n) { int i; double sum=0; for (i=0; i<n; ++i) { sum += grades[i]; } return sum/n; } double grades[5]; … (scanf, etc.) avg = average(grades, 5); הקריאה לפונקצה תתבצע כך:
מבוא למדעי המחשב © אריק פרידמן5 איך זה רץ... double average(double *grades, int n) { int i; double sum=0; for (i=0; i<n; ++i) { sum += grades[i]; } return sum/n; } double grades[5]; … (scanf, etc.) avg = average(grades, 5); grades מקצים זיכרון למערך grades
מבוא למדעי המחשב © אריק פרידמן6 איך זה רץ... double average(double *grades, int n) { int i; double sum=0; for (i=0; i<n; ++i) { sum += grades[i]; } return sum/n; } double grades[5]; … (scanf, etc.) avg = average(grades, 5); grades מאתחלים את המערך
מבוא למדעי המחשב © אריק פרידמן7 איך זה רץ... double average(double *grades, int n) { int i; double sum=0; for (i=0; i<n; ++i) { sum += grades[i]; } return sum/n; } double grades[5]; … (scanf, etc.) avg = average(grades, 5); … קריאה לפונקציה grades n grades
מבוא למדעי המחשב © אריק פרידמן8 איך זה רץ... double average(double *grades, int n) { int i; double sum=0; int i; double sum=0; for (i=0; i<n; ++i) { sum += grades[i]; } return sum/n; } double grades[5]; … (scanf, etc.) avg = average(grades, 5); … הקצאת משתנים0? grades n grades i sum
מבוא למדעי המחשב © אריק פרידמן9 איך זה רץ... double average(double *grades, int n) { int i; double sum=0; i=0 for (i=0; i<n; ++i) { sum += grades[i]; } return sum/n; } double grades[5]; … (scanf, etc.) avg = average(grades, 5); … אתחול הלולאה grades n grades i sum
מבוא למדעי המחשב © אריק פרידמן10 איך זה רץ... double average(double *grades, int n) { int i; double sum=0; i<n for (i=0; i<n; ++i) { sum += grades[i]; } return sum/n; } double grades[5]; … (scanf, etc.) avg = average(grades, 5); … התנאי מתקיים grades n grades i sum
מבוא למדעי המחשב © אריק פרידמן11 איך זה רץ... double average(double *grades, int n) { int i; double sum=0; for (i=0; i<n; ++i) { sum += grades[i]; } return sum/n; } double grades[5]; … (scanf, etc.) avg = average(grades, 5); … גוף הלולאה grades n grades i sum
מבוא למדעי המחשב © אריק פרידמן12 איך זה רץ... double average(double *grades, int n) { int i; double sum=0; ++i for (i=0; i<n; ++i) { sum += grades[i]; } return sum/n; } double grades[5]; … (scanf, etc.) avg = average(grades, 5); … קידום grades n grades i sum
מבוא למדעי המחשב © אריק פרידמן13 איך זה רץ... double average(double *grades, int n) { int i; double sum=0; i<n for (i=0; i<n; ++i) { sum += grades[i]; } return sum/n; } double grades[5]; … (scanf, etc.) avg = average(grades, 5); … התנאי מתקיים grades n grades i sum
מבוא למדעי המחשב © אריק פרידמן14 איך זה רץ... double average(double *grades, int n) { int i; double sum=0; for (i=0; i<n; ++i) { sum += grades[i]; } return sum/n; } double grades[5]; … (scanf, etc.) avg = average(grades, 5); … גוף הלולאה grades n grades i sum
מבוא למדעי המחשב © אריק פרידמן15 איך זה רץ... double average(double *grades, int n) { int i; double sum=0; ++i for (i=0; i<n; ++i) { sum += grades[i]; } return sum/n; } double grades[5]; … (scanf, etc.) avg = average(grades, 5); … קידום grades n grades i sum
מבוא למדעי המחשב © אריק פרידמן16 איך זה רץ... double average(double *grades, int n) { int i; double sum=0; i<n for (i=0; i<n; ++i) { sum += grades[i]; } return sum/n; } double grades[5]; … (scanf, etc.) avg = average(grades, 5); … התנאי מתקיים grades n grades i sum
מבוא למדעי המחשב © אריק פרידמן17 איך זה רץ... double average(double *grades, int n) { int i; double sum=0; for (i=0; i<n; ++i) { sum += grades[i]; } return sum/n; } double grades[5]; … (scanf, etc.) avg = average(grades, 5); … גוף הלולאה grades n grades i sum
מבוא למדעי המחשב © אריק פרידמן18 איך זה רץ... double average(double *grades, int n) { int i; double sum=0; ++i for (i=0; i<n; ++i) { sum += grades[i]; } return sum/n; } double grades[5]; … (scanf, etc.) avg = average(grades, 5); … קידום grades n grades i sum
מבוא למדעי המחשב © אריק פרידמן19 איך זה רץ... double average(double *grades, int n) { int i; double sum=0; i<n for (i=0; i<n; ++i) { sum += grades[i]; } return sum/n; } double grades[5]; … (scanf, etc.) avg = average(grades, 5); … התנאי מתקיים grades n grades i sum
מבוא למדעי המחשב © אריק פרידמן20 איך זה רץ... double average(double *grades, int n) { int i; double sum=0; for (i=0; i<n; ++i) { sum += grades[i]; } return sum/n; } double grades[5]; … (scanf, etc.) avg = average(grades, 5); … גוף הלולאה grades n grades i sum
מבוא למדעי המחשב © אריק פרידמן21 איך זה רץ... double average(double *grades, int n) { int i; double sum=0; ++i for (i=0; i<n; ++i) { sum += grades[i]; } return sum/n; } double grades[5]; … (scanf, etc.) avg = average(grades, 5); … קידום grades n grades i sum
מבוא למדעי המחשב © אריק פרידמן22 איך זה רץ... double average(double *grades, int n) { int i; double sum=0; i<n for (i=0; i<n; ++i) { sum += grades[i]; } return sum/n; } double grades[5]; … (scanf, etc.) avg = average(grades, 5); … התנאי מתקיים grades n grades i sum
מבוא למדעי המחשב © אריק פרידמן23 איך זה רץ... double average(double *grades, int n) { int i; double sum=0; for (i=0; i<n; ++i) { sum += grades[i]; } return sum/n; } double grades[5]; … (scanf, etc.) avg = average(grades, 5); … גוף הלולאה grades n grades i sum
מבוא למדעי המחשב © אריק פרידמן24 איך זה רץ... double average(double *grades, int n) { int i; double sum=0; ++i for (i=0; i<n; ++i) { sum += grades[i]; } return sum/n; } double grades[5]; … (scanf, etc.) avg = average(grades, 5); … קידום grades n grades i sum
מבוא למדעי המחשב © אריק פרידמן25 איך זה רץ... double average(double *grades, int n) { int i; double sum=0; i<n for (i=0; i<n; ++i) { sum += grades[i]; } return sum/n; } double grades[5]; … (scanf, etc.) avg = average(grades, 5); … התנאי לא מתקיים grades n grades i sum
מבוא למדעי המחשב © אריק פרידמן26 איך זה רץ... double average(double *grades, int n) { int i; double sum=0; for (i=0; i<n; ++i) { sum += grades[i]; } return sum/n; } double grades[5]; … (scanf, etc.) avg = average(grades, 5); … מוחזר הפונקציה מסתיימת. הזיכרון בו השתמשה משוחרר grades n grades i sum
מבוא למדעי המחשב © אריק פרידמן27 איך זה רץ... double average(double *grades, int n) { int i; double sum=0; for (i=0; i<n; ++i) { sum += grades[i]; } return sum/n; } double grades[5]; … (scanf, etc.) avg = average(grades, 5); … המשתנה avg מקבל את הערך grades
מבוא למדעי המחשב © אריק פרידמן28 בלי לשנות את הפונקציה... double average(double *grades, int n) { int i; double sum=0; for (i=0; i<n; ++i) { sum += grades[i]; } return sum/n; } double grades[5]; … (scanf, etc.) avg = average(grades+2, 3); מה היה קורה אם היינו משנים את הקריאה באופן הבא?
מבוא למדעי המחשב © אריק פרידמן29 איך זה רץ... double average(double *grades, int n) { int i; double sum=0; for (i=0; i<n; ++i) { sum += grades[i]; } return sum/n; } double grades[5]; … (scanf, etc.) avg = average(grades+2, 3); … קריאה לפונקציה grades n grades