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