אופרטור החץ (->)
חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-C של Coddy. שיעור 45 מתוך 63.
בעבודה עם מצביעים למבנים, גישה לחברי המבנה דורשת תחביר מיוחד. אפשר להשתמש יחד באופרטור ביטול ההפניה ובסימון נקודה, אבל C מספקת אופרטור נוח יותר במיוחד למטרה הזאת: אופרטור החץ (->).
אופרטור החץ מאפשר לך לגשת לחברי מבנה דרך מצביע בצורה נקייה וקריאה:
ptr->memberהדבר שקול לכתיבה של (*ptr).member, אך תמציתי הרבה יותר.
כך זה עובד בפועל:
struct Point p1 = {10, 20};
struct Point *ptr = &p1;
// שימוש באופרטור החץ
printf("x = %d, y = %d\n", ptr->x, ptr->y);
// זה שקול ל:
printf("x = %d, y = %d\n", (*ptr).x, (*ptr).y);אופרטור החץ הופך את הקוד שלך לנקי יותר וקל יותר לקריאה, במיוחד כשעובדים עם מבני נתונים מורכבים. זו הדרך המקובלת לגשת לחברי struct באמצעות מצביעים בתכנות ב-C.
אתגר
קלכתבו תוכנית C שמדגימה שימוש באופרטור החץ כדי לגשת לחברי struct דרך מצביעים. התוכנית שלכם צריכה:
- להגדיר
structבשםBookעם החברים הבאים:- מספר שלם
idלאחסון מזהה הספר - מערך תווים
titleבגודל 40 לאחסון כותרת הספר - מערך תווים
authorבגודל 30 לאחסון שם המחבר - מספר ממשי מסוג float בשם
priceלאחסון מחיר הספר - מספר שלם
pagesלאחסון מספר העמודים
- מספר שלם
- בפונקציה הראשית, ליצור משתנה
BookבשםmyBook - להכריז על מצביע למבנה
BookבשםbookPtr - להקצות את הכתובת של
myBookל-bookPtr - לקרוא את ערכי הקלט הבאים ולהקצות אותם לחברי המבנה באמצעות אופרטור החץ דרך המצביע:
- לקרוא מספר שלם עבור המזהה ולהקצות אותו באמצעות
bookPtr->id - לקרוא מחרוזת עבור הכותרת ולהקצות אותה באמצעות
bookPtr->title - לקרוא מחרוזת עבור שם המחבר ולהקצות אותה באמצעות
bookPtr->author - לקרוא מספר ממשי מסוג float עבור המחיר ולהקצות אותו באמצעות
bookPtr->price - לקרוא מספר שלם עבור מספר העמודים ולהקצות אותו באמצעות
bookPtr->pages
- לקרוא מספר שלם עבור המזהה ולהקצות אותו באמצעות
- לאחר קריאת כל הערכים, לבצע את הפעולות הבאות באמצעות אופרטור החץ:
- להחיל הנחה של 10% על המחיר:
bookPtr->price = bookPtr->price * 0.9; - להוסיף 50 עמודי בונוס:
bookPtr->pages += 50;
- להחיל הנחה של 10% על המחיר:
- להדפיס את פרטי הספר באמצעות אופרטור החץ כדי לגשת לכל חבר, בפורמט המדויק הזה:
Book Information:ID: [id]Title: [title]Author: [author]Price: [price]Pages: [pages]
- לחשב ולהדפיס את המחיר לעמוד באמצעות אופרטור החץ בפורמט:
Price per page: [price_per_page]
האתגר הזה בודק את ההבנה שלכם באופרטור החץ לגישה לחברי מבנה דרך מצביעים. תתרגלו שימוש בתחביר ptr->member גם לקריאה מחברי מבנה וגם לכתיבה אליהם, ותראו שהוא שקול ל-(*ptr).member אך נוח וקריא הרבה יותר.
נסו בעצמכם
#include <stdio.h>
#include <string.h>
// TODO: הגדירו כאן את המבנה Book
int main() {
// TODO: צרו משתנה מסוג Book בשם myBook
// TODO: הכריזו על מצביע ל-Book בשם bookPtr
// TODO: הקצו ל-bookPtr את הכתובת של myBook
// קראו את ערכי הקלט
int id;
char title[40];
char author[30];
float price;
int pages;
scanf("%d", &id);
scanf("%s", title);
scanf("%s", author);
scanf("%f", &price);
scanf("%d", &pages);
// TODO: הקצו את ערכי הקלט לשדות המבנה באמצעות אופרטור החץ
// TODO: החילו הנחה של 10% על price באמצעות אופרטור החץ
// TODO: הוסיפו 50 עמודי בונוס באמצעות אופרטור החץ
// TODO: הדפיסו את פרטי הספר באמצעות אופרטור החץ
// TODO: חשבו והדפיסו את המחיר לעמוד באמצעות אופרטור החץ
return 0;
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת תוכנית
1יסודות המצביעים
מהו מצביע?הכרזה על מצביעיםאופרטור לקיחת הכתובת (&)אופרטור ביטול ההפניה (*)מצביעי NULLסיכום: יסודות המצביעים2מצביעים ומערכים
שמות מערכים כמצביעיםאיברי מערך ומצביעיםאריתמטיקה של מצביעיםהשוואת מצביעיםסיכום: מעבר על מערך באמצעות מצביעים5מצביעים ופונקציות
העברה לפי ערךהעברת מצביעים לפונקציותשינוי משתנים באמצעות מצביעיםדוגמה קלאסית: החלפההעברת מערכים לפונקציותחזרה: ארגומנטים של מצביעי פונקציה8מבנים ומצביעים
מצביעים למבניםאופרטור החץ (->)העברת מבנים לפי ערךהעברת מצביעים למבניםהקצאה דינמית של מבניםסיכום: שינוי מבנה באמצעות מצביע3מערכי תווים ומחרוזות
מחרוזות כמערכי charתו הסיום nullקלט מחרוזת באמצעות scanfשימוש ב־strlen()שימוש ב־strcpy()שימוש ב־strcat()שימוש ב־strcmp()סיכום: פונקציות מחרוזת בסיסיותתרגלו בעצמכם: קומפיילר C אונליין