Menu
CoddyTech

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

חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-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 אונליין