Menu
Coddy logo textTech

מצביעים למבנים

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

challenge icon

אתגר

קל

צרו תוכנית C שמדגימה עבודה עם מצביעים למבנים. התוכנית שלכם צריכה:

  1. להגדיר struct בשם Product עם האיברים הבאים:
    • מספר שלם id לאחסון מזהה המוצר
    • מערך תווים name בגודל 25 לאחסון שם המוצר
    • מספר ממשי price לאחסון מחיר המוצר
    • מספר שלם quantity לאחסון הכמות הזמינה
  2. בפונקציה הראשית, ליצור משתנה מסוג Product בשם item ולאתחל אותו בערכים הבאים:
    • מזהה: 501
    • שם: "Laptop"
    • מחיר: 899.99
    • כמות: 15
  3. להכריז על מצביע למבנה Product בשם itemPtr
  4. להקצות את הכתובת של המשתנה item ל-itemPtr באמצעות אופרטור קבלת הכתובת
  5. להדפיס את פרטי המוצר המקוריים באמצעות גישה ישירה לאיברי המבנה (באמצעות אופרטור הנקודה), בפורמט המדויק הבא:
    • Original Product Info:
    • ID: [id]
    • Name: [name]
    • Price: [price]
    • Quantity: [quantity]
  6. להדפיס את אותם פרטי מוצר באמצעות גישה לאיברי המבנה דרך המצביע (באמצעות אופרטור ביטול ההפניה וסימון נקודה: (*itemPtr).member), בפורמט המדויק הבא:
    • Product Info via Pointer:
    • ID: [id]
    • Name: [name]
    • Price: [price]
    • Quantity: [quantity]
  7. לוודא שהמצביע מצביע כראוי למבנה באמצעות הדפסת כתובות הזיכרון בפורמט המדויק הבא:
    • 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;
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה לוגיקה וזרימת תוכנית

תרגלו בעצמכם: קומפיילר C אונליין