Menu
Coddy logo textTech

השוואת מצביעים

חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-C של Coddy. שיעור 10 מתוך 63.

למדת איך לנוע במערכים באמצעות אריתמטיקה של מצביעים. עכשיו תגלה שאפשר גם להשוות מצביעים באמצעות אותם אופרטורים יחסיים שבהם משתמשים עם משתנים רגילים: ==, !=, < ו־>.

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

int numbers[5] = {10, 20, 30, 40, 50};
int *start = numbers;        // מצביע על האיבר הראשון
int *end = numbers + 4;      // מצביע על האיבר האחרון

if (start < end) {
    printf("start comes before end in memory");
}

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

התובנה המרכזית היא ש־ptr1 < ptr2 אומרת לך ש־ptr1 מצביע על איבר שמופיע מוקדם יותר במערך מהאיבר שעליו ptr2 מצביע. הקשר הזה הופך השוואה בין מצביעים להתאמה טבעית לשליטה בלולאות שמעבדות מערכים ברצף.

challenge icon

אתגר

קל

כתבו תוכנית C שמשתמשת בהשוואת מצביעים כדי לעבור על מערך ולמצוא איברים בטווח מסוים. על התוכנית:

  1. להכריז על מערך של מספרים שלמים בשם scores עם 8 איברים ולאתחל אותו בערכים {45, 78, 92, 63, 87, 34, 91, 56}
  2. להכריז על שני מצביעים למספרים שלמים: start_ptr ו-end_ptr
  3. להגדיר את start_ptr כך שיצביע על האיבר הראשון במערך
  4. להגדיר את end_ptr כך שיצביע על האיבר האחרון במערך באמצעות אריתמטיקה של מצביעים
  5. להכריז על מצביע בשם current_ptr ולאתחל אותו כך שיצביע על האיבר הראשון
  6. להשתמש בלולאת while עם השוואת מצביעים (current_ptr <= end_ptr) כדי לעבור על המערך
  7. בתוך הלולאה:
    • לבדוק אם הערך הנוכחי נמצא בין 60 ל-90 (כולל)
    • אם הערך נמצא בטווח, להדפיס "Value [value] is in range"
    • אם הערך אינו נמצא בטווח, להדפיס "Value [value] is out of range"
    • להגדיל את current_ptr כדי לעבור לאיבר הבא
  8. לאחר הלולאה, להשתמש בהשוואת מצביעים כדי לוודא ש-current_ptr נמצא כעת מעבר לסוף המערך, על ידי בדיקה אם current_ptr > end_ptr
  9. אם התנאי מתקיים, להדפיס "Traversal complete"

הפלט שלך צריך להציג את התוצאות בפורמט הבא:

Value 45 is out of range
Value 78 is in range
Value 92 is out of range
Value 63 is in range
Value 87 is in range
Value 34 is out of range
Value 91 is out of range
Value 56 is out of range
Traversal complete

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

נסו בעצמכם

#include <stdio.h>

int main() {
    // TODO: כתבו את הקוד שלכם למטה
    
    return 0;
}
quiz iconבחנו את עצמכם

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

כל השיעורים ביחידה לוגיקה וזרימת תוכנית

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