>> [השמעת מוסיקה]
>> דאג LLOYD: אישור.
אנחנו כבר עובדים עם מספרים שלמים, אנחנו כבר עבדנו עם דמויות,
אנחנו כבר עובדים צף, זוגות, מחרוזות, וbools.
אנחנו כבר מיצינו פחות או יותר את כל של [לא ברור] הסוגים ש
היה זמין לכולנו יחד.
אבל עכשיו אנחנו רוצים לעשות משהו יותר.
איך אנחנו עושים את זה?
איך ליצור סוגי נתונים שונים?
אנחנו יכולים לעשות זאת על ידי שימוש במבנים.
אז מבנים מאפשרים לנו לאחד משתנה מטיפוסים שונים
לסוג אחד, חדש משתנה, שבו אנו יכולים להקצות שם הסוג שלו.
זה באמת חזק דבר להיות מסוגל לעשות,
כי עכשיו אנחנו יכולים קבוצה אלמנטי סוגי נתונים שונים של
יחד שיש להם קשר הגיוני.
אנחנו כבר יכולים לעשות את זה עם מערכי סוג של, נכון?
אנחנו יכולים משתני קבוצה מאותו סוג נתונים
יחד ביחידה גדולה זיכרון, מערך.
>> אבל אנחנו לא הצלחנו לערבב עד סוגי נתונים שונים ביחד.
אנחנו לא יכולים, לומר, זוג שלם, ואופי, וכפול כל
באותו הדבר ו קורא לזה יחידה אחת.
אבל עם מבנים, או לעתים קרובות מכונה structs,
למעשה אנחנו יכולים.
אז מבנה הוא סוג כמו משתנה סופר.
זה משתנה שמכיל משתנים אחרים בתוכו.
אז הנה דוגמא ל מבנה פשוט מאוד.
זה מה שהיה נראה התחביר רוצה ליצור מבנה למכונית.
עכשיו, בואו נלך דרך התחביר כאן.
Struct, זה מילת המפתח שמצביע
שאני יוצר סוג נתונים חדש כאן.
בפרט, שמו של סוג הנתונים הוא הולך להיות מכונית struct, כפי שנראה.
אבל זה הסוג של קצה מחוץ למהדר שזה
כקבוצה של משתנים שהוא הולך כדי להיחשב חלק מאותו הסוג
בדקה.
>> מכוניות, רק את שמו של המבנה.
שוב, את סוג הנתונים כאן הולך להיות מכונית struct, לא רק מכונית.
אבל אם יש לך different-- אם אתה יוצר structs מרובה
באותה התכנית, אתה צריך להבחין בין struct וstruct.
מכונית אז struct, אני יכול גם סטודנט struct, למשל,
באותה התכנית.
בתוך הסוגריים המסולסלים הם כל השדות שנקרא,
או חברים של המבנה.
אז מה הם כמה הדברים כי הם הגלומים במכונית?
ובכן, בדרך כלל יש לו שנה, יש שם דגם, ולוחית רישוי,
מד מרחק, כי בדרך כלל יש כמה מספר הקילומטרים על זה,
ואולי נפח מנוע.
וכמו שאתה יכול לראות, אני מערבב עד מספרים שלמים ודמויות וזוגות.
הם כולם הולכים להיות חלק מסוג נתונים החדש.
>> לבסוף, הדבר האחרון שאני צריך לעשות, אל תשכחו פסיק הקטן הזה
בסוף.
לאחר שנסיים להגדיר את המבנה, אנחנו צריכים לשים פסיק בסוף.
זה תחבירי נפוץ מאוד טעות, כי עם פונקציה,
לדוגמא, היית צריכים רק סד פתוח מתולתל, מסולסל סד קרוב.
אתה לא שם פסיק ב סוף הגדרת פונקציה.
זה נראה כמו פונקציה הגדרה, אבל זה לא,
וכך פסיק שם רק תזכורת ש
צריך לשים אותו שם, כי מהדר אחרת לא
יודע מה לעשות עם זה.
זה שגיאה נפוצה מאוד כדי להפוך את טעות
כאשר אתה מגדיר מבנים ראשון.
>> אוקיי.
אז אנחנו בדרך כלל להגדיר המבנים שלנו בחלקו העליון של התוכניות שלנו
כי הם כנראה הולכים לשימוש על ידי פונקציות מרובות.
אנחנו לא רוצים להגדיר struct הפנימי של פונקציה,
כי אז אנחנו יכולים only-- היקף המבנה באמת
רק קיים בתוך הפונקציה ש.
אנחנו בטח רוצים להגדיר מבנה כדי שנוכל להשתמש בו בפונקציות מרובות,
או אולי במספר רב של קבצים שקשורים יחד
כדי ליצור התכנית אחת שלנו.
לפעמים גם במקום הגדרת המבנה
בחלקו העליון איפה אתה שם אותך פאונד כולל והליש"ט מגדירה,
לדוגמא, ייתכן שלשים אותם קבצי h הנקודה נפרדים, אשר לאחר מכן
פאונד כולל את עצמך.
>> אז יש לנו מבנים, אבל עכשיו אנחנו צריכים לקבל בתוכם.
איך אנחנו מגיעים בתוך מבנה לגישה
אלה תת-משתנים, משתנה אלה שקיים בתוך המבנה?
ובכן, יש לנו משהו שנקרא מפעיל הנקודה, אשר מאפשר לנו
כדי לגשת לשדות של המבנה.
כך למשל, נניח שהכרזתי נתוני מבני להקליד איפשהו
בחלק העליון של התכנית שלי, או אולי ב קובץ h נקודה שיש לי לירה כלולה.
אם אני מכן רוצה ליצור חדש משתנה מסוג שהנתונים, אני יכול לומר,
המכונית struct, המכונית שלי, נקודה-פסיק.
בדיוק כמו שאני יכול לומר int x, או שם מחרוזת פסיק.
>> סוג הנתונים כאן הוא המכונית struct, השם המשתנה הוא המכונית שלי,
ואז אני יכול להשתמש במפעיל הנקודה ל לגשת לתחומים השונים של המכונית שלי.
אז אני יכול לומר את המכונית שלי שנה הנקודה שווה 2011.
זה בסדר גמור.
שנה, אם אתה זוכר, הוגדרה כ שדה שלם בתוך המכונית struct זה
סוג מידע.
אז כל משתנה של נתוני רכב struct סוג, כגון המכונית שלי, אני יכול לומר את המכונית שלי
שנה נקודה שווה ולאחר מכן להקצות זה חלק המספר שלם, 2011.
צלחת נקודת מכונית שלי שווה CS50.
מד מרחק נקודת כרטיס שלי שווה 50,505 פסיק.
כל אלה הם בסדר גמור וזה
איך אנחנו לגשת ל שדות של המבנה.
מבנים, אם כי, לא צריכים להיווצר בערימה.
בדיוק כמו כל משתנה אחרים, אנחנו דינמי יכול להקצות אותם.
אם יש לנו תכנית שאולי להיות יצירת מבנים רבים,
אנחנו לא יודעים כמה אנחנו הולכים צריכים,
אז אנחנו צריכים באופן דינמי להקצות מבנים אלה
כתכנית שלנו פועל.
ולכן אם אנחנו הולכים כדי לגשת ל שדות של מבנה בהקשר זה,
תזכיר כי אנחנו קודם צריכים dereference המצביע למבנה,
ואז ברגע שאנחנו dereference מצביע, אז אנחנו יכולים לגשת לשדות.
אם יש לנו רק מצביע למבנה,
אנחנו לא יכולים פשוט לומר שדה נקודת מצביע שם ולקבל את מה שאנחנו מחפשים.
יש צעד הנוסף של ביטול הפניה.
אז בואו נגיד ש במקום previous--
בדיוק כמו בדוגמא הקודמת, במקום להצהיר על כך
על הערימה, מכונית struct, מכונית, פסיק, אני אומר מכונית struct,
כוכב, מצביע ל המכונית struct בשם המכונית שלי,
שווה גודל malloc של המכונית struct.
גודל שלנו יהיה להבין כמה ביטי סוג הנתונים החדש שלך לוקח את.
אתה לא צריך בהכרח רק לשימוש גודל, רוחב, int, char או, או כל
של סוגי נתונים מובנים.
מהדר הוא מספיק חכם כדי להבין כמה בתים
נדרשים על ידי המבנה החדש שלך.
אז אני malloc עצמי יחידה של זיכרון גדול מספיק כדי להחזיק מכונית struct,
ואני מקבל את מצביע חזרה לבלוק של זיכרון,
והמצביע שהוקצה למכונית שלי.
>> עכשיו, אם אני רוצה גישה השדות של המכונית שלי,
אני משתמש בראשון dereference המכונית שלי מפעיל dereference, הכוכב
שראינו מהמצביעים קטעי וידאו, ולאחר מכן אחרי שdereference,
אז אני יכול להשתמש במפעיל הנקודה ל לגשת לתחומים השונים של המכונית שלי.
כוכב המכונית שלי נקודת השנה שווה 2011.
שיהיה לי ההשפעה אנחנו רוצים במקרה זה,
כי יש לנו באופן דינמי הוקצה המכונית שלי.
>> זה סוג של מעצבן, אם כי, נכון?
יש תהליך 2-צעד עכשיו.
עכשיו אנחנו צריכים dereference-- יש לנו מפעיל כוכב,
ויש לנו מפעיל נקודה.
וכפי שאפשר לצפות, כי מתכנת C אוהב דרכים קצרות יותר
לעשות דברים, יש דרך קצרה יותר לעשות את זה.
יש מפעיל אחר נקרא חץ, מה שהופך את התהליך הזה הרבה יותר קל.
דרך חץ עובד היא dereferences הראשון זה
המצביע על השמאל צד של המפעיל,
ולאחר מכן, לאחר שdereferenced המצביע על השמאל,
זה ניגש לשדה בצד הימין.
וכך בעבר היו לנו סוג זה של כוכב המכונית שלי dot את כל הדברים האלה,
כמו היה הרבה קורה שם.
אבל מה שאנחנו יכולים לעשות הוא במקום זה-- השנה שלי חץ רכב שווה 2011.
>> שוב, מה קורה כאן?
ראשית, אני ביטול הפנית המכונית שלי.
אשר שוב, הוא מצביע כאן.
ואז, לאחר ש dereferenced המכונית שלי, אני
לאחר מכן תוכל לגשת לשדות שנה, צלחת, ומד מרחק
בדיוק כמו שאני יכול לפני שראשון כוכב משומש לdereference המכונית שלי,
ונקודה כדי לגשת לשדה.
אז אתה יכול לקבל מבנים, יכול להיות מצביעים למבנים,
ויש לך דרכים גישה השדות של מבנים אלה,
אם יש לך עצות ל שלהם או המשתנים עצמם.
דוט או חץ, בהתאם ל איך משתנה הוכרז.
אני דאג לויד, זה CS50.