מצביעים למבנים
חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-C של Coddy. שיעור 44 מתוך 63.
עכשיו, כשנוח לך לעבוד עם מבנים, הגיע הזמן לשלב אותם עם מושג רב־עוצמה נוסף ב־C: מצביעים. בדיוק כפי שאפשר ליצור מצביעים לסוגי נתונים בסיסיים כמו int או char, אפשר גם ליצור מצביעים שמחזיקים את הכתובת של משתנה מסוג מבנה.
התחביר להצהרה על מצביע למבנה עוקב אחר אותה תבנית כמו הצהרות על מצביעים אחרים:
struct StructureName *pointerName;לדוגמה, באמצעות ה־struct המוכר שלנו Point:
struct Point p1 = {10, 20};
struct Point *ptr;כך נוצר מצביע בשם ptr שיכול לאחסן את הכתובת של מבנה Point. כדי לגרום למצביע להצביע בפועל על משתנה המבנה שלנו, משתמשים באופרטור קבלת הכתובת:
ptr = &p1;כעת ptr מכיל את כתובת הזיכרון של משתנה המבנה p1. הדבר פותח אפשרויות חדשות לעבודה עם מבנים, במיוחד כשמעבירים אותם לפונקציות או מנהלים זיכרון באופן דינמי. מצביעים למבנים חיוניים לבניית מבני נתונים מורכבים יותר ולכתיבת תוכניות C יעילות.
אתגר
קלצרו תוכנית C שמדגימה עבודה עם מצביעים למבנים. התוכנית שלכם צריכה:
- להגדיר
structבשםProductעם האיברים הבאים:- מספר שלם
idלאחסון מזהה המוצר - מערך תווים
nameבגודל 25 לאחסון שם המוצר - מספר ממשי
priceלאחסון מחיר המוצר - מספר שלם
quantityלאחסון הכמות הזמינה
- מספר שלם
- בפונקציה הראשית, ליצור משתנה מסוג
Productבשםitemולאתחל אותו בערכים הבאים:- מזהה: 501
- שם: "Laptop"
- מחיר: 899.99
- כמות: 15
- להכריז על מצביע למבנה
ProductבשםitemPtr - להקצות את הכתובת של המשתנה
itemל-itemPtrבאמצעות אופרטור קבלת הכתובת - להדפיס את פרטי המוצר המקוריים באמצעות גישה ישירה לאיברי המבנה (באמצעות אופרטור הנקודה), בפורמט המדויק הבא:
Original Product Info:ID: [id]Name: [name]Price: [price]Quantity: [quantity]
- להדפיס את אותם פרטי מוצר באמצעות גישה לאיברי המבנה דרך המצביע (באמצעות אופרטור ביטול ההפניה וסימון נקודה:
(*itemPtr).member), בפורמט המדויק הבא:Product Info via Pointer:ID: [id]Name: [name]Price: [price]Quantity: [quantity]
- לוודא שהמצביע מצביע כראוי למבנה באמצעות הדפסת כתובות הזיכרון בפורמט המדויק הבא:
Address of item: [address]Value of itemPtr: [address]Address verification: [result]
לצורך אימות הכתובת, הדפיסו Match אם הכתובות זהות, או No Match אם הן שונות.
האתגר הזה בודק את ההבנה שלכם בהכרזה על מצביע למבנה, בהקצאת כתובת באמצעות אופרטור קבלת הכתובת, ובגישה לאיברי מבנה דרך מצביעים באמצעות שילוב של אופרטור ביטול ההפניה וסימון הנקודה. בנוסף, תוודאו שהמצביע מחזיק כראוי את הכתובת של משתנה המבנה.
נסו בעצמכם
#include <stdio.h>
#include <string.h>
// TODO: הגדירו כאן את המבנה Product
int main() {
// TODO: כתבו כאן את הקוד שלכם
// 1. צרו ואתחלו משתנה Product בשם 'item'
// 2. הכריזו על מצביע ל-Product בשם 'itemPtr'
// 3. הקצו את הכתובת של 'item' ל-'itemPtr'
// 4. הדפיסו את פרטי המוצר המקוריים באמצעות אופרטור הנקודה
// 5. הדפיסו את פרטי המוצר דרך מצביע באמצעות (*itemPtr).member
// 6. הדפיסו ואמתו את הכתובות
return 0;
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת תוכנית
1יסודות המצביעים
מהו מצביע?הכרזה על מצביעיםאופרטור לקיחת הכתובת (&)אופרטור ביטול ההפניה (*)מצביעי NULLסיכום: יסודות המצביעים2מצביעים ומערכים
שמות מערכים כמצביעיםאיברי מערך ומצביעיםאריתמטיקה של מצביעיםהשוואת מצביעיםסיכום: מעבר על מערך באמצעות מצביעים5מצביעים ופונקציות
העברה לפי ערךהעברת מצביעים לפונקציותשינוי משתנים באמצעות מצביעיםדוגמה קלאסית: החלפההעברת מערכים לפונקציותחזרה: ארגומנטים של מצביעי פונקציה8מבנים ומצביעים
מצביעים למבניםאופרטור החץ (->)העברת מבנים לפי ערךהעברת מצביעים למבניםהקצאה דינמית של מבניםסיכום: שינוי מבנה באמצעות מצביע3מערכי תווים ומחרוזות
מחרוזות כמערכי charתו הסיום nullקלט מחרוזת באמצעות scanfשימוש ב־strlen()שימוש ב־strcpy()שימוש ב־strcat()שימוש ב־strcmp()סיכום: פונקציות מחרוזת בסיסיותתרגלו בעצמכם: קומפיילר C אונליין