1 00:00:00,000 --> 00:00:00,499 2 00:00:00,499 --> 00:00:01,395 [השמעת מוסיקה] 3 00:00:01,395 --> 00:00:05,590 4 00:00:05,590 --> 00:00:07,940 >> דאג LLOYD: אישור כך הצעה לפני שמתחיל כאן. 5 00:00:07,940 --> 00:00:11,660 אם לא צפה בסרטון על pointers אולי כדאי לך לעשות זאת ראשונה. 6 00:00:11,660 --> 00:00:15,860 בגלל הסרטון הזה הוא עוד דרך של עבודה עם מצביעים. 7 00:00:15,860 --> 00:00:17,574 >> אז זה הולך לדבר על כמה מושגים 8 00:00:17,574 --> 00:00:19,490 שאנו מכסים ב pointers וידאו, ואנחנו 9 00:00:19,490 --> 00:00:21,948 הולך לחפות עליהם עכשיו, בהנחה שהם כבר 10 00:00:21,948 --> 00:00:23,090 הבין סוג של. 11 00:00:23,090 --> 00:00:25,440 אז זה רק האזהרה הוגנת שלך כי אם אתה רואה בסרטון זה 12 00:00:25,440 --> 00:00:27,814 ולא ראית וידאו מצביעים, אולי זה סוג של 13 00:00:27,814 --> 00:00:29,610 לטוס מעל הראש שלך קצת. 14 00:00:29,610 --> 00:00:32,080 ואז זה יכול להיות טוב יותר כדי לצפות בו על מנת ש. 15 00:00:32,080 --> 00:00:34,710 >> אז יש לנו כבר ראיתי אחד דרך לעבודה עם מצביעים, 16 00:00:34,710 --> 00:00:37,810 אשר אנו מצהירים משתנה, ואז אנחנו 17 00:00:37,810 --> 00:00:42,160 להכריז משתנה אחר, מצביע משתנים, המצביע על זה. 18 00:00:42,160 --> 00:00:44,870 אז יצרנו משתנה עם שם, יש לנו 19 00:00:44,870 --> 00:00:48,480 יצר משתנים שני עם שם, ואנו מצביעים כי משתנה שני 20 00:00:48,480 --> 00:00:50,220 שבראשון. 21 00:00:50,220 --> 00:00:52,370 זה סוג של יש בעיה אם כי, משום שהיא 22 00:00:52,370 --> 00:00:54,650 דורש מאתנו יודע בדיוק כמה זיכרון אנחנו 23 00:00:54,650 --> 00:00:57,600 הולך צריך הרגע התכנית שלנו היא הידור. 24 00:00:57,600 --> 00:00:58,220 >> למה? 25 00:00:58,220 --> 00:01:03,338 כי אנחנו צריכים להיות מסוגלים לקרוא או לזהות את כל המשתנים האפשריים 26 00:01:03,338 --> 00:01:04,129 אנו עלולים להיתקל. 27 00:01:04,129 --> 00:01:07,910 אולי יש לנו מערך שעשויה להיות תוכל להחזיק הרבה מידע, 28 00:01:07,910 --> 00:01:10,110 אבל זה עדיין לא מדויק מספיק בדיוק. 29 00:01:10,110 --> 00:01:12,640 מה אם אנחנו לא יודעים, מה אם אין לנו מושג 30 00:01:12,640 --> 00:01:14,370 כמה אנחנו צריכים בזמן ההידור? 31 00:01:14,370 --> 00:01:17,020 או מה אם התכנית שלנו לרוץ במשך זמן ארוך מאוד, 32 00:01:17,020 --> 00:01:19,810 קבלת משתמש שונים הנתונים, ואנחנו לא יכולים באמת 33 00:01:19,810 --> 00:01:23,170 להעריך אם אנחנו תצטרך 1,000 יחידות? 34 00:01:23,170 --> 00:01:26,060 >> זה לא כמו שאנחנו יכולים אומרים בשורת הפקודה 35 00:01:26,060 --> 00:01:28,040 הכנס כמה פריטים אתה חושב שאתה צריך. 36 00:01:28,040 --> 00:01:31,100 ובכן מה אם מניח שזה לא בסדר? 37 00:01:31,100 --> 00:01:34,300 הקצאת זיכרון דינמית סוג של מאפשר לנו את הדרך 38 00:01:34,300 --> 00:01:36,867 לעקוף בעיה זו בפרט. 39 00:01:36,867 --> 00:01:38,700 והדרך שהיא עושה את זה הוא על ידי שימוש במצביעים. 40 00:01:38,700 --> 00:01:42,140 >> אנחנו יכולים להשתמש במצביעים ל לקבל גישה לדינמית 41 00:01:42,140 --> 00:01:45,710 זיכרון שהוקצה, זיכרון שהוא שהוקצה כתכנית שלך פועל. 42 00:01:45,710 --> 00:01:48,290 זה לא שהוקצה בזמן ההידור. 43 00:01:48,290 --> 00:01:51,570 כאשר אתה באופן דינמי להקצות זיכרון זה מגיע מברכה 44 00:01:51,570 --> 00:01:53,795 זיכרון ידוע כערימה. 45 00:01:53,795 --> 00:01:56,420 בעבר כל הזיכרון שיש לנו עובד עם בקורס 46 00:01:56,420 --> 00:01:59,920 כבר מגיע מברכה זיכרון ידוע כערימה. 47 00:01:59,920 --> 00:02:02,470 דרך טובה בדרך כלל לשמור על שלטון mind-- וזה 48 00:02:02,470 --> 00:02:04,720 לא תמיד להחזיק נכון, אבל פחות או יותר כמעט 49 00:02:04,720 --> 00:02:09,940 תמיד מחזיק true-- הוא שכל זמן שאתה נותן שם משתנה זה 50 00:02:09,940 --> 00:02:12,090 כנראה גר בערימה. 51 00:02:12,090 --> 00:02:14,650 וכל פעם שאתה עושה לא לתת משתנה שם, 52 00:02:14,650 --> 00:02:19,160 שבו אתה יכול לעשות עם זיכרון דינמי הקצאה, הוא חי בערימה. 53 00:02:19,160 --> 00:02:22,190 >> עכשיו אני סוג של הצגה זו כ אם יש שתי בריכות של זיכרון אלה. 54 00:02:22,190 --> 00:02:24,740 אבל אתה יכול לראות את זה תרשים, שהוא בדרך כלל 55 00:02:24,740 --> 00:02:27,290 ייצוג של מה נראה כמו זיכרון, 56 00:02:27,290 --> 00:02:30,373 ואנחנו לא הולכים לאכפת כל הדברים בראש והתחתון. 57 00:02:30,373 --> 00:02:33,580 מה אכפת לנו הוא חלק זה ב האמצע כאן, ערימה ומחסנית. 58 00:02:33,580 --> 00:02:35,570 כפי שניתן לראות על ידי מסתכל על תרשים זה, 59 00:02:35,570 --> 00:02:38,390 אלה הם למעשה לא שתיים בריכות נפרדות של זיכרון. 60 00:02:38,390 --> 00:02:42,757 זה בריכה משותפת אחד של זיכרון שבו אתה מתחיל, בזה חזותי 61 00:02:42,757 --> 00:02:44,590 אתה מתחיל בתחתית ולהתחיל למלא את 62 00:02:44,590 --> 00:02:48,040 מתחתית עם הערימה, ואתה להתחיל בראש ולהתחיל למלא את 63 00:02:48,040 --> 00:02:50,072 מלמעלה למטה עם הערימה. 64 00:02:50,072 --> 00:02:51,780 אבל זה באמת אותו בריכה, זה רק 65 00:02:51,780 --> 00:02:56,050 כתמים שונים, במקומות שונים בזיכרון כי הם הוקצו. 66 00:02:56,050 --> 00:02:59,060 ואתה יכול לרוץ מ זיכרון או על ידי בעל 67 00:02:59,060 --> 00:03:01,240 הערימה ללכת את כל הדרך לתחתית, או שיש לי 68 00:03:01,240 --> 00:03:05,440 הערימה ללכת את כל הדרך לפסגה, או שיש ערימה והמחסנית 69 00:03:05,440 --> 00:03:06,740 נפגש אחד נגד השני. 70 00:03:06,740 --> 00:03:09,500 כל אלה יכולים להיות תנאים שגורם לתכנית שלך 71 00:03:09,500 --> 00:03:11,030 נגמרים של זיכרון. 72 00:03:11,030 --> 00:03:11,952 אז לשמור את זה בחשבון. 73 00:03:11,952 --> 00:03:13,660 כאשר אנו מדברים על הערימה והמחסנית 74 00:03:13,660 --> 00:03:17,880 אנחנו באמת מדברים אותו נתח כללי של זיכרון, רק 75 00:03:17,880 --> 00:03:21,930 חלקים שונים של זיכרון ש. 76 00:03:21,930 --> 00:03:24,910 >> אז איך אנחנו מקבלים באופן דינמי הוקצה זיכרון במקום הראשון? 77 00:03:24,910 --> 00:03:27,740 איך התכנית שלנו אינה מקבלת זיכרון זה פועל? 78 00:03:27,740 --> 00:03:32,660 ובכן C מספק פונקציה שנקראת malloc, Allocator זיכרון, ש 79 00:03:32,660 --> 00:03:36,810 אתה מבצע שיחה ל, ואתה עובר ב כמה בתים של זיכרון שאתה רוצה. 80 00:03:36,810 --> 00:03:39,940 אז אם התכנית שלך פועלת ואתה רוצה ריצה שלם, 81 00:03:39,940 --> 00:03:46,040 ייתכן שמאלוק ארבעה בתים של זיכרון, malloc סוגר ארבעה. 82 00:03:46,040 --> 00:03:48,540 >> מאלוק יעבור מחפש דרך הערימה, 83 00:03:48,540 --> 00:03:50,750 בגלל שאנחנו באופן דינמי הקצאת זיכרון, 84 00:03:50,750 --> 00:03:53,500 והוא יחזור אליך מצביע לזיכרון ש. 85 00:03:53,500 --> 00:03:56,180 זה לא נותן לך memory-- ש זה לא נותן לו שם, 86 00:03:56,180 --> 00:03:57,950 זה נותן לך מצביע לזה. 87 00:03:57,950 --> 00:04:00,780 ואז זה למה שוב אמרתי שזה חשוב לאולי 88 00:04:00,780 --> 00:04:03,770 צופה ראה וידאו המצביעים לפני שאנחנו מקבלים יותר מדי לזה. 89 00:04:03,770 --> 00:04:05,940 אז malloc הולך אתן לך בחזרה מצביע. 90 00:04:05,940 --> 00:04:08,950 >> אם מאלוק לא יכול לתת לך כל זיכרון, כי אתה כבר נגמר, 91 00:04:08,950 --> 00:04:10,645 זה ייתן לך בחזרה מצביע null. 92 00:04:10,645 --> 00:04:15,282 אתה זוכר מה קורה אם אנחנו לנסות וdereference מצביע null? 93 00:04:15,282 --> 00:04:17,019 אנחנו סובלים אשמת SEG, נכון? 94 00:04:17,019 --> 00:04:18,060 זה כנראה לא טוב. 95 00:04:18,060 --> 00:04:21,579 >> אז בכל פעם שאתה מבצע שיחה לmalloc אתה תמיד, תמיד 96 00:04:21,579 --> 00:04:25,270 צריך לבדוק אם או לא מצביע זה נתן לך בחזרה הוא null. 97 00:04:25,270 --> 00:04:28,800 אם כן, אתה צריך לשים קץ לתכנית שלך כי אם אתה מנסה וdereference 98 00:04:28,800 --> 00:04:31,360 מצביע null אתה הולך לסבול אשמת פילוח 99 00:04:31,360 --> 00:04:34,380 והתכנית שלך היא הולך להתרסק בכל מקרה. 100 00:04:34,380 --> 00:04:37,190 אז איך אנחנו סטטי להשיג מספר שלם? 101 00:04:37,190 --> 00:04:37,730 >> x int. 102 00:04:37,730 --> 00:04:40,010 כנראה שעשינו ש חבורה של פעמים, נכון? 103 00:04:40,010 --> 00:04:43,480 זה יוצר משתנה בשם x שחי בערימה. 104 00:04:43,480 --> 00:04:46,190 איך אנחנו דינמי אין לקבל מספר שלם? 105 00:04:46,190 --> 00:04:50,010 px כוכב int שווה malloc 4. 106 00:04:50,010 --> 00:04:53,050 >> או יותר נכון היינו אומר px כוכב int 107 00:04:53,050 --> 00:04:57,680 שווה גודל malloc של int, רק כדי לזרוק כמה פחות 108 00:04:57,680 --> 00:04:59,740 מספרי קסם סביב התכנית שלנו. 109 00:04:59,740 --> 00:05:04,140 זה הולך להשיג לנו ארבעה בתים של זיכרון מהערימה, 110 00:05:04,140 --> 00:05:06,720 והמצביע שאנו מקבלים בחזרה לזה נקרא פיקסלים. 111 00:05:06,720 --> 00:05:08,430 ואז בדיוק כפי שיש לנו נעשה בעברנו 112 00:05:08,430 --> 00:05:13,966 יכול dereference px ל גישה לזיכרון ש. 113 00:05:13,966 --> 00:05:15,590 איך אנחנו מקבלים מספר שלם מהמשתמש? 114 00:05:15,590 --> 00:05:17,970 אנחנו יכולים לומר int x שווה לקבל int. 115 00:05:17,970 --> 00:05:19,930 זה די פשוט. 116 00:05:19,930 --> 00:05:24,030 מה אם אנחנו רוצים ליצור מערך של x צף שגרים בערימה? 117 00:05:24,030 --> 00:05:28,210 לצוף stack_array-- זה השם של x בסוגריים מרובעים array--. 118 00:05:28,210 --> 00:05:32,419 שייצור עבורנו מערך של x צף שגרים בערימה. 119 00:05:32,419 --> 00:05:34,960 אנחנו יכולים ליצור מערך של צף שחי בערימה, מדי. 120 00:05:34,960 --> 00:05:37,330 התחביר עשוי להיראות קצת מסורבל יותר, 121 00:05:37,330 --> 00:05:41,740 אבל אנו יכולים לומר לצוף heap_array הכוכב שווה 122 00:05:41,740 --> 00:05:44,360 פעמים x malloc הגודל של המצוף. 123 00:05:44,360 --> 00:05:48,160 אני צריך מספיק מקום להחזיק x ערכי נקודה צפה. 124 00:05:48,160 --> 00:05:51,560 אז אומר שאני צריך 100 צף, צף או 1,000. 125 00:05:51,560 --> 00:05:54,810 אז במקרה שזה יהיה 400 בתים עבור 100 צף, 126 00:05:54,810 --> 00:05:59,080 או 4,000 בתים עבור 1,000 צף, משום שכל אחד לוקח את המצוף 127 00:05:59,080 --> 00:06:01,230 ארבעה בתים של שטח. 128 00:06:01,230 --> 00:06:05,110 >> אחרי שעשה את זה לא יכול להשתמש ב תחביר הסוגר מרובע על heap_array. 129 00:06:05,110 --> 00:06:08,970 בדיוק כמו שאני היית עושה בstack_array, אני תוכל לגשת למרכיביו בנפרד 130 00:06:08,970 --> 00:06:11,590 heap_array באמצעות אפס, heap_array אחד. 131 00:06:11,590 --> 00:06:15,800 אבל זוכר את הסיבה שאנחנו יכולים לעשות את זה סיבה לכך הוא שמו של מערך ב- C 132 00:06:15,800 --> 00:06:19,990 הוא באמת מצביע ל האלמנט הראשון של מערך זה. 133 00:06:19,990 --> 00:06:23,480 אז העובדה שאנחנו מכריזים מערך של צף בערימה כאן 134 00:06:23,480 --> 00:06:24,810 הוא למעשה קצת מטעה. 135 00:06:24,810 --> 00:06:27,600 אנחנו באמת נמצאים ב קו שני של קוד שם 136 00:06:27,600 --> 00:06:32,360 גם יצירת מצביע לנתח של זיכרון שאז לעשות קצת עבודה עם. 137 00:06:32,360 --> 00:06:35,620 >> הנה הבעיה הגדולה עם דינמי שהוקצה זיכרון כי, 138 00:06:35,620 --> 00:06:38,360 וזה למה זה באמת חשוב לפתח כמה הרגלים טובים 139 00:06:38,360 --> 00:06:39,800 כאשר אתה עובד עם זה. 140 00:06:39,800 --> 00:06:43,060 שלא כמו הכריז באופן סטטי זיכרון, הזיכרון שלך 141 00:06:43,060 --> 00:06:46,790 לא באופן אוטומטי חזר ל מערכת כאשר הפונקציה שלך נעשה. 142 00:06:46,790 --> 00:06:49,280 אז אם יש לנו עיקרי, ו עיקרי קורא פונקציה 143 00:06:49,280 --> 00:06:53,860 F, כאשר F גימורים מה שזה עושה ומחזיר את שליטה על התכנית 144 00:06:53,860 --> 00:06:58,810 בחזרה לעיקרי, בכל הזיכרון ו ששמש ניתן בחזרה. 145 00:06:58,810 --> 00:07:01,250 ניתן להשתמש בו שוב על ידי תכנית אחרת, 146 00:07:01,250 --> 00:07:04,250 או תפקיד אחר ש מקבל נקרא מאוחר יותר בעיקרי. 147 00:07:04,250 --> 00:07:06,970 הוא יכול להשתמש על אותו זיכרון שוב. 148 00:07:06,970 --> 00:07:09,620 >> אם אתה באופן דינמי להקצות זיכרון למרות ש 149 00:07:09,620 --> 00:07:14,380 אתה צריך להגיד במפורש מערכת שתסיים עם זה. 150 00:07:14,380 --> 00:07:18,370 זה יהיה להחזיק את זה בשבילך, אשר יכול להוביל לבעיה שלך הולך ואוזל 151 00:07:18,370 --> 00:07:19,290 של זיכרון. 152 00:07:19,290 --> 00:07:22,179 ואכן לפעמים אנחנו מתייחסים לזה כדליפת זיכרון. 153 00:07:22,179 --> 00:07:24,970 ולפעמים דליפות זיכרון אלה באמת יכול להיות ממש הרסני 154 00:07:24,970 --> 00:07:27,020 לביצועי מערכת. 155 00:07:27,020 --> 00:07:31,120 >> אם אתה משתמש באינטרנט תכוף אולי אתה משתמש בדפדפני אינטרנט מסוימים, 156 00:07:31,120 --> 00:07:35,630 ואני לא לנקוב בשמות כאן, אבל יש כמה דפדפני אינטרנט שם בחוץ 157 00:07:35,630 --> 00:07:39,150 כי ידועים לשמצה שיש למעשה דליפות זיכרון שלא מקבל קבועה. 158 00:07:39,150 --> 00:07:44,570 ואם אתה משאיר את הדפדפן שלך פתוח לתקופה ארוכה מאוד של זמן, ימים 159 00:07:44,570 --> 00:07:48,060 וימים, או שבועות, לפעמים אתה ייתכן שיבחין שהמערכת שלך 160 00:07:48,060 --> 00:07:49,790 הוא פועל ממש, ממש לאט. 161 00:07:49,790 --> 00:07:54,640 והסיבה לכך היא ש הדפדפן הקצה זיכרון, 162 00:07:54,640 --> 00:07:57,320 אבל אז לא אמר לי המערכת שעושה את זה עם זה. 163 00:07:57,320 --> 00:08:01,000 וכך זה משאיר פחות זיכרון זמין לכל תוכניות האחרות שלך 164 00:08:01,000 --> 00:08:04,480 יש לחלוק, כי אתה leaking-- שדפדפן האינטרנט 165 00:08:04,480 --> 00:08:06,755 תכנית דולפת זיכרון. 166 00:08:06,755 --> 00:08:08,880 איך אנחנו נותנים בחזרה זיכרון לאחר שנסיים עם זה? 167 00:08:08,880 --> 00:08:10,838 ובכן, למרבה המזל זה דרך קלה מאוד לעשות את זה. 168 00:08:10,838 --> 00:08:11,710 אנחנו פשוט לשחרר אותו. 169 00:08:11,710 --> 00:08:15,020 יש פונקציה שנקראת חופשי, היא מקבלת מצביע לזיכרון, 170 00:08:15,020 --> 00:08:16,010 ואנחנו טובים ללכת. 171 00:08:16,010 --> 00:08:18,310 >> אז בואו נגיד שאנחנו ב אמצע התכנית שלנו, 172 00:08:18,310 --> 00:08:21,970 אנחנו רוצים malloc 50 תווים. 173 00:08:21,970 --> 00:08:25,710 אנחנו רוצים malloc מערך שיכול מסוגלים להחזיק 50 תווים. 174 00:08:25,710 --> 00:08:29,109 וכאשר אנחנו מקבלים מצביע חזרה ל כי שם, של המצביע שהוא מילה. 175 00:08:29,109 --> 00:08:30,900 אנחנו עושים כל מה שאנחנו הולך לעשות עם מילה, 176 00:08:30,900 --> 00:08:33,440 ואז כשאנחנו עשיתי בדיוק אנחנו לשחרר אותו. 177 00:08:33,440 --> 00:08:37,460 ועכשיו יש לנו 50 חזרו אלה בתים של זיכרון בחזרה למערכת. 178 00:08:37,460 --> 00:08:40,147 תפקיד אחר יכול להשתמש בם. 179 00:08:40,147 --> 00:08:43,480 אנחנו לא צריכים לדאוג סובלים דליפת זיכרון כי יש לנו שחררה את המילה. 180 00:08:43,480 --> 00:08:46,639 אנחנו נתנו את הזיכרון בחזרה, אז סיימנו לעבוד עם זה. 181 00:08:46,639 --> 00:08:48,430 אז יש שלוש כללי זהב שצריך 182 00:08:48,430 --> 00:08:51,700 לזכור בכל פעם שאתה דינמי הקצאת זיכרון 183 00:08:51,700 --> 00:08:52,990 עם malloc. 184 00:08:52,990 --> 00:08:56,480 כל בלוק של זיכרון ש אתה malloc חייב להיות משוחרר 185 00:08:56,480 --> 00:08:58,430 לפני התכנית שלך מסיים את פעולתו. 186 00:08:58,430 --> 00:09:02,029 עכשיו שוב, במכשיר או ב IDE קורה זה סוג של לך בכל מקרה 187 00:09:02,029 --> 00:09:04,820 כאשר אתם-- זה יקרה בכל מקרה כאשר התכנית שלך תסתיים, 188 00:09:04,820 --> 00:09:06,880 כל הזיכרון ישוחרר. 189 00:09:06,880 --> 00:09:10,750 אבל זה קידוד טוב בדרך כלל בפועל תמיד, כשתסיים, 190 00:09:10,750 --> 00:09:13,810 לשחרר את מה שיש לך mallocd. 191 00:09:13,810 --> 00:09:16,690 >> שאמרו, רק דברים ש יש לך mallocd צריך להיות משוחרר. 192 00:09:16,690 --> 00:09:19,880 אם אתה באופן סטטי להכריז מספר שלם, int x נקודת פסיק, 193 00:09:19,880 --> 00:09:23,500 שחי בערימה, ש לא אז רוצה לשחרר את x. 194 00:09:23,500 --> 00:09:25,970 דברים אז רק שיש לך צריך להיות משוחרר mallocd. 195 00:09:25,970 --> 00:09:28,960 >> ולבסוף, לא משהו בחינם פעמיים. 196 00:09:28,960 --> 00:09:31,170 שיכול להוביל ל עוד מצב מוזר. 197 00:09:31,170 --> 00:09:33,530 אז כל מה שיש לך mallocd יש להשתחרר. 198 00:09:33,530 --> 00:09:36,000 דברים היחידים שיש לך malloc צריך להיות משוחרר. 199 00:09:36,000 --> 00:09:38,730 ולא משהו בחינם פעמיים. 200 00:09:38,730 --> 00:09:43,660 >> אז בואו נלך דרך דוגמא כאן של מה שחלק שהוקצה באופן דינמי 201 00:09:43,660 --> 00:09:46,122 זיכרון עשוי להיראות מעורב עם כמה זיכרון סטטי. 202 00:09:46,122 --> 00:09:47,080 מה שעלול לקרות כאן? 203 00:09:47,080 --> 00:09:48,913 תראה אם ​​אתה יכול לעקוב אחר לאורך ונחש מה זה 204 00:09:48,913 --> 00:09:51,720 יקרה כמו שאנחנו הולכים דרך כל שורות הקוד האלה. 205 00:09:51,720 --> 00:09:53,980 >> אז אנחנו אומרים מ 'int. 206 00:09:53,980 --> 00:09:54,840 מה קורה כאן? 207 00:09:54,840 --> 00:09:56,339 ובכן, זה די פשוט. 208 00:09:56,339 --> 00:09:59,650 אני יוצר משתנה שלם שנקרא מ '. 209 00:09:59,650 --> 00:10:01,400 אני צובע את זה ירוק, כי זה הצבע 210 00:10:01,400 --> 00:10:03,730 כי אני משתמש כשאני מדבר על שלם משתנה. 211 00:10:03,730 --> 00:10:05,160 זה תיבה. 212 00:10:05,160 --> 00:10:08,400 זה נקרא מ ', ואתה יכול מספרים שלמים חנות בתוכו. 213 00:10:08,400 --> 00:10:12,400 >> מה אם אני אומר אז int כוכב? 214 00:10:12,400 --> 00:10:13,530 טוב, זה די דומה. 215 00:10:13,530 --> 00:10:15,780 אני יוצר תיבה בשם. 216 00:10:15,780 --> 00:10:19,100 זה מסוגל int האחזקה כוכבים, מצביעים למספרים שלמים. 217 00:10:19,100 --> 00:10:21,570 אז אני צביעתו ירוק-איש גם כן. 218 00:10:21,570 --> 00:10:24,140 >> אני יודע שיש לו משהו לעשות עם שלם, 219 00:10:24,140 --> 00:10:25,852 אבל זה לא את עצמו שלם. 220 00:10:25,852 --> 00:10:27,310 אבל זה פחות או יותר על אותו הרעיון. 221 00:10:27,310 --> 00:10:28,101 יצרתי תיבה. 222 00:10:28,101 --> 00:10:30,070 שני אלה הנכונים חיים כיום בערימה. 223 00:10:30,070 --> 00:10:32,520 נתתי להם את שני השמות. 224 00:10:32,520 --> 00:10:36,750 >> כוכב int ב שווה גודל malloc של int. 225 00:10:36,750 --> 00:10:38,560 אחד זה יכול להיות קצת מסובך. 226 00:10:38,560 --> 00:10:44,110 קח שני וחושב על מה שאתה היה מצפה שיקרה בתרשים זה. 227 00:10:44,110 --> 00:10:50,210 כוכב int ב שווה גודל malloc של int. 228 00:10:50,210 --> 00:10:51,940 >> ובכן, זה לא פשוט ליצור תיבה אחת. 229 00:10:51,940 --> 00:10:53,800 זה בעצם יוצר שתי תיבות. 230 00:10:53,800 --> 00:10:58,670 והוא קושר, הוא גם קובע נקודה במערכת יחסים. 231 00:10:58,670 --> 00:11:02,240 אנחנו כבר הוקצו בלוק אחד זיכרון בערימה. 232 00:11:02,240 --> 00:11:05,940 שימו לב שהתיבה הימנית העליונה יש אין שם. 233 00:11:05,940 --> 00:11:06,760 >> אנו mallocd זה. 234 00:11:06,760 --> 00:11:08,050 היא קיימת בערימה. 235 00:11:08,050 --> 00:11:10,090 אבל יש ב שם. 236 00:11:10,090 --> 00:11:11,950 זה משתנה מצביע נקרא ב. 237 00:11:11,950 --> 00:11:13,910 שחי בערימה. 238 00:11:13,910 --> 00:11:18,250 >> אז זה חתיכת הזיכרון שמצביע על עוד אחד. 239 00:11:18,250 --> 00:11:21,840 ב מכיל את הכתובת של בלוק של זיכרון. 240 00:11:21,840 --> 00:11:23,757 זה לא חייב שם אחר. 241 00:11:23,757 --> 00:11:24,590 אבל זה מצביע על זה. 242 00:11:24,590 --> 00:11:29,760 לכן, כאשר אנו אומרים כוכב int ב שווה גודל malloc של int, שממש שם, 243 00:11:29,760 --> 00:11:33,490 חץ שצץ ב צד ימין שם, כי כל דבר, 244 00:11:33,490 --> 00:11:36,740 אני אצטרך אותו להופיע שוב, זה מה שקורה. 245 00:11:36,740 --> 00:11:39,341 כל זה קורה ב ששורה אחת של קוד. 246 00:11:39,341 --> 00:11:41,340 עכשיו נהיה לנו קצת יותר פשוט שוב. 247 00:11:41,340 --> 00:11:43,330 שווה מ 'אמפרסנד. 248 00:11:43,330 --> 00:11:46,280 האם אתה זוכר מה שווה מ 'אמפרסנד הוא? 249 00:11:46,280 --> 00:11:48,920 טוב, זה מקבל את כתובתו של מטר. 250 00:11:48,920 --> 00:11:54,150 או לשים יותר בתרשים, נקודות למ '. 251 00:11:54,150 --> 00:11:56,360 >> שווה ב. 252 00:11:56,360 --> 00:11:57,560 אוקי אז הנה עוד אחד. 253 00:11:57,560 --> 00:11:59,230 שווה ב. 254 00:11:59,230 --> 00:12:02,260 מה הולך לקרות בתרשים זה זמן? 255 00:12:02,260 --> 00:12:04,330 >> ובכן זוכר ש עבודות מפעיל משימה 256 00:12:04,330 --> 00:12:08,960 על ידי הקצאת הערך ב זכות הערך בצד השמאל. 257 00:12:08,960 --> 00:12:14,820 אז במקום הצבעה למ ', עכשיו מצביע לאותו המקום שנקודות ב. 258 00:12:14,820 --> 00:12:18,900 אינו מצביע ל- B, מציין נקודות שבן ב. 259 00:12:18,900 --> 00:12:25,280 >> אם מחודד לב 'שהיית היה שווה אמפרסנד ב. 260 00:12:25,280 --> 00:12:28,150 אבל במקום שווה ב רק משמעות הדבר היא כי ב ועכשיו 261 00:12:28,150 --> 00:12:31,770 מצביע לאותה הכתובת, כי בתוך b הוא רק כתובת. 262 00:12:31,770 --> 00:12:35,004 ועכשיו בתוך היא באותה הכתובת. 263 00:12:35,004 --> 00:12:37,170 מ 'שווה 10, כנראה רוב הדבר פשוט 264 00:12:37,170 --> 00:12:38,690 שעשינו בקצת. 265 00:12:38,690 --> 00:12:40,460 שים 10 בתיבה. 266 00:12:40,460 --> 00:12:45,640 כוכבים ב שווה מ 'בתוספת 2, זוכרים מ וידאו מצביעים מה הכוכב ב אומר. 267 00:12:45,640 --> 00:12:50,230 אנחנו הולכים ב dereference ומכר כמה ערך שבמיקום הזיכרון. 268 00:12:50,230 --> 00:12:51,860 במקרה זה 12. 269 00:12:51,860 --> 00:12:55,300 >> לכן, כאשר אנו dereference נקודה זוכר רק שאנחנו נוסעים במורד החץ. 270 00:12:55,300 --> 00:12:58,205 או במילים אחרת, אנחנו ללכת כי כתובת הזיכרון 271 00:12:58,205 --> 00:12:59,580 ואנחנו יכולים לשנות אותו בדרך כלשהי. 272 00:12:59,580 --> 00:13:00,830 שמנו כמה ערך שם. 273 00:13:00,830 --> 00:13:03,960 בב כוכב מקרה זה שווה מ 'בתוספת 2 הוא רק 274 00:13:03,960 --> 00:13:08,230 ללכת למשתנה הצביע על ידי ב, ללכת לזיכרון הצביע על ידי ב, 275 00:13:08,230 --> 00:13:11,750 ולשים מ 'בתוספת 2 שם, 12. 276 00:13:11,750 --> 00:13:14,970 >> עכשיו אני חופשי ב. 277 00:13:14,970 --> 00:13:16,490 מה קורה כשאני משחרר ב? 278 00:13:16,490 --> 00:13:18,800 זוכר מה אמרתי אמצעי תשלום. 279 00:13:18,800 --> 00:13:21,920 מה שאני אומר כשאני לשחרר ב? 280 00:13:21,920 --> 00:13:23,410 >> אני מסיים לעבוד איתו, נכון? 281 00:13:23,410 --> 00:13:25,702 אני בעצם לוותר על הזיכרון. 282 00:13:25,702 --> 00:13:26,910 אני נותן אותו בחזרה למערכת. 283 00:13:26,910 --> 00:13:33,010 אני לא צריך את זה יותר מה אני אומר להם, בסדר? 284 00:13:33,010 --> 00:13:37,390 >> עכשיו, אם אני אומר כוכב שווה 11 כנראה שאתה יכול 285 00:13:37,390 --> 00:13:40,460 כבר אמרתי לי משהו שרע הולך לקרות כאן, נכון? 286 00:13:40,460 --> 00:13:44,160 ואכן, אם ניסיתי את זה אני כנראה יסבול אשמת פילוח. 287 00:13:44,160 --> 00:13:47,140 כי עכשיו, למרות ש בעבר נתח זה של זיכרון 288 00:13:47,140 --> 00:13:50,220 היה משהו שהיה לי גישה ל, בשלב זה 289 00:13:50,220 --> 00:13:54,590 עכשיו אני גישה לזיכרון ש אינו חוקי עבורי לגשת. 290 00:13:54,590 --> 00:13:57,330 >> וכפי שכנראה יהיה זוכר, כאשר אנו ניגשים לזיכרון 291 00:13:57,330 --> 00:14:00,000 כי אנחנו לא אמורים לגעת, זה הגורם הנפוץ ביותר 292 00:14:00,000 --> 00:14:01,860 של פילוח דופי. וכך התכנית שלי 293 00:14:01,860 --> 00:14:05,170 יתרסק אם ניסיתי לעשות את זה. 294 00:14:05,170 --> 00:14:09,910 אז שוב שזה רעיון טוב כדי לקבל טוב הרגלי תרגול וטובים טבועים 295 00:14:09,910 --> 00:14:12,920 בעת עבודה עם malloc וחופשי, כך שאתה לא סובל פילוח 296 00:14:12,920 --> 00:14:15,310 תקלות, ושאתה משתמש ב שלך שהוקצה באופן דינמי 297 00:14:15,310 --> 00:14:17,370 זיכרון באחריות. 298 00:14:17,370 --> 00:14:20,300 >> אני דאג לויד זה CS50. 299 00:14:20,300 --> 00:14:21,947