Menu
CoddyTech

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

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

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 אונליין