מצביעים למבנים
חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-C של Coddy. שיעור 44 מתוך 63.
עכשיו, כשנוח לך לעבוד עם מבנים, הגיע הזמן לשלב אותם עם מושג רב־עוצמה נוסף ב־C: מצביעים. בדיוק כפי שאפשר ליצור מצביעים לסוגי נתונים בסיסיים כמו int או char, אפשר גם ליצור מצביעים שמחזיקים את הכתובת של משתנה מסוג מבנה.
התחביר להכרזה על מצביע למבנה פועל לפי אותו דפוס כמו הכרזות אחרות על מצביעים:
struct StructureName *pointerName;לדוגמה, באמצעות המבנה המוכר שלנו Point:
struct Point p1 = {10, 20};
struct Point *ptr;כך נוצר מצביע בשם ptr שיכול לאחסן את הכתובת של מבנה Point. כדי לגרום למצביע להצביע בפועל על משתנה המבנה שלנו, משתמשים באופרטור לקיחת הכתובת:
ptr = &p1;כדי לקרוא איבר דרך המצביע, בטלו את ההפניה אליו ואז השתמשו באופרטור הנקודה. הסוגריים הכרחיים, כי . מקושר בעדיפות גבוהה יותר מ־*:
printf("%d", (*ptr).x); // זהה ל־p1.xכעת ptr מכיל את כתובת הזיכרון של המשתנה p1 מסוג struct. כך נפתחות אפשרויות חדשות לעבודה עם struct, במיוחד כשמעבירים אותם לפונקציות או מנהלים זיכרון באופן דינמי. מצביעים ל-struct חיוניים לבניית מבני נתונים מורכבים יותר ולכתיבת תוכניות 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 אונליין