השוואת מצביעים
חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-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 מצביע. הקשר הזה הופך השוואה בין מצביעים להתאמה טבעית לשליטה בלולאות שמעבדות מערכים ברצף.
אתגר
קלכתבו תוכנית C שמשתמשת בהשוואת מצביעים כדי לעבור על מערך ולמצוא איברים בטווח מסוים. על התוכנית:
- להכריז על מערך של מספרים שלמים בשם
scoresעם 8 איברים ולאתחל אותו בערכים {45, 78, 92, 63, 87, 34, 91, 56} - להכריז על שני מצביעים למספרים שלמים:
start_ptrו-end_ptr - להגדיר את
start_ptrכך שיצביע על האיבר הראשון במערך - להגדיר את
end_ptrכך שיצביע על האיבר האחרון במערך באמצעות אריתמטיקה של מצביעים - להכריז על מצביע בשם
current_ptrולאתחל אותו כך שיצביע על האיבר הראשון - להשתמש בלולאת while עם השוואת מצביעים (
current_ptr <= end_ptr) כדי לעבור על המערך - בתוך הלולאה:
- לבדוק אם הערך הנוכחי נמצא בין 60 ל-90 (כולל)
- אם הערך נמצא בטווח, להדפיס "Value [value] is in range"
- אם הערך אינו נמצא בטווח, להדפיס "Value [value] is out of range"
- להגדיל את
current_ptrכדי לעבור לאיבר הבא
- לאחר הלולאה, להשתמש בהשוואת מצביעים כדי לוודא ש-
current_ptrנמצא כעת מעבר לסוף המערך, על ידי בדיקה אםcurrent_ptr > end_ptr - אם התנאי מתקיים, להדפיס "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;
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת תוכנית
1יסודות המצביעים
מהו מצביע?הכרזה על מצביעיםאופרטור לקיחת הכתובת (&)אופרטור ביטול ההפניה (*)מצביעי NULLסיכום: יסודות המצביעים2מצביעים ומערכים
שמות מערכים כמצביעיםאיברי מערך ומצביעיםאריתמטיקה של מצביעיםהשוואת מצביעיםסיכום: מעבר על מערך באמצעות מצביעים5מצביעים ופונקציות
העברה לפי ערךהעברת מצביעים לפונקציותשינוי משתנים באמצעות מצביעיםדוגמה קלאסית: החלפההעברת מערכים לפונקציותחזרה: ארגומנטים של מצביעי פונקציה3מערכי תווים ומחרוזות
מחרוזות כמערכי charתו הסיום nullקלט מחרוזת באמצעות scanfשימוש ב־strlen()שימוש ב־strcpy()שימוש ב־strcat()שימוש ב־strcmp()סיכום: פונקציות מחרוזת בסיסיותתרגלו בעצמכם: קומפיילר C אונליין