1 00:00:00,000 --> 00:00:02,520 [Powered by Google Translate] [القسم 4 - أكثر راحة] 2 00:00:02,520 --> 00:00:04,850 [روب بودين - جامعة هارفارد] 3 00:00:04,850 --> 00:00:07,370 [هذا CS50. - CS50.TV] 4 00:00:08,920 --> 00:00:13,350 لدينا غدا اختبار، في حال كنت لا تعرف الرجال ذلك. 5 00:00:14,810 --> 00:00:20,970 انها في الاساس على كل ما يمكن أن ينظر في الصف أو يفترض أن يكون ينظر في الصف. 6 00:00:20,970 --> 00:00:26,360 يتضمن مؤشرات، على الرغم من انهم موضوع حديث جدا. 7 00:00:26,360 --> 00:00:29,860 يجب أن لا يقل عن فهم مستويات عالية منها. 8 00:00:29,860 --> 00:00:34,760 أي شيء ذهب أكثر في الصف يجب أن نفهم لهذه المسابقة. 9 00:00:34,760 --> 00:00:37,320 حتى إذا كان لديك أسئلة عليهم، يمكنك أن تطلب منهم الآن. 10 00:00:37,320 --> 00:00:43,280 ولكن هذا سيكون جلسة للغاية التي قادها الطلبة حيث يمكنك طرح الأسئلة الرجال، 11 00:00:43,280 --> 00:00:45,060 نأمل من الناس لديهم أسئلة. 12 00:00:45,060 --> 00:00:48,020 لا أحد لديك أسئلة؟ 13 00:00:49,770 --> 00:00:52,090 نعم. >> [طالب] هل يمكن أن يذهب أكثر المؤشرات مرة أخرى؟ 14 00:00:52,090 --> 00:00:54,350 سأذهب على المؤشرات. 15 00:00:54,350 --> 00:00:59,180 جميع المتغيرات الخاصة بك العيش بالضرورة في الذاكرة، 16 00:00:59,180 --> 00:01:04,450 ولكن عادة لا تقلق بشأن ذلك وكنت أقول X و y + 2 + 3 17 00:01:04,450 --> 00:01:07,080 وسوف المترجم معرفة أين يعيشون الأشياء بالنسبة لك. 18 00:01:07,080 --> 00:01:12,990 مرة كنت تتعامل مع مؤشرات، والآن كنت تستخدم هذه العناوين صراحة الذاكرة. 19 00:01:12,990 --> 00:01:19,800 لذلك سوف متغير واحد فقط من أي وقت مضى يعيشون في عنوان واحد في أي وقت من الأوقات. 20 00:01:19,800 --> 00:01:24,040 إذا كنا نريد أن يعلن المؤشر، ما هو نوع سوف تبدو؟ 21 00:01:24,040 --> 00:01:26,210 >> أريد أن يعلن ف المؤشر. ماذا تبدو مثل نوع؟ 22 00:01:26,210 --> 00:01:33,530 [طالب] * الباحث ف. نعم >>. ذلك الباحث * ص. 23 00:01:33,530 --> 00:01:38,030 وكيف يمكنني جعله يشير إلى x؟ >> [طالب] علامة الضم. 24 00:01:40,540 --> 00:01:45,300 [بودين] لذا يسمى حرفيا العطف عنوان المشغل. 25 00:01:45,300 --> 00:01:50,460 لذلك عندما أقول & X هو الحصول على عنوان الذاكرة للمتغير x. 26 00:01:50,460 --> 00:01:56,790 حتى الآن لدي ع المؤشر، وفي أي مكان في قانون بلدي يمكنني استخدامها * ع 27 00:01:56,790 --> 00:02:02,960 أو أنا يمكن استخدام x و سيكون نفس الشيء بالضبط. 28 00:02:02,960 --> 00:02:09,520 (* ع). ما هو هذا العمل؟ ماذا يعني هذا النجم؟ 29 00:02:09,520 --> 00:02:13,120 [طالب] وهذا يعني قيمة في تلك المرحلة. نعم >>. 30 00:02:13,120 --> 00:02:17,590 لذلك إذا نظرنا إلى ذلك، يمكن أن يكون مفيدا جدا لاستخلاص الرسوم البيانية 31 00:02:17,590 --> 00:02:22,230 عندما يكون ذلك قليلا مربع من الذاكرة لX، والذي يحدث أن يكون قيمة 4، 32 00:02:22,230 --> 00:02:25,980 ثم لدينا قليلا مربع من الذاكرة لف، 33 00:02:25,980 --> 00:02:31,590 وهكذا ف لنقطة X، لذلك نحن رسم سهم من ص إلى x. 34 00:02:31,590 --> 00:02:40,270 لذلك عندما نقول * ف نقوله انتقل إلى المربع الذي هو ع. 35 00:02:40,270 --> 00:02:46,480 نجوم اتبع السهم ثم تفعل ما تريد مع هذا المربع هناك. 36 00:02:46,480 --> 00:03:01,090 لذلك أستطيع أن أقول * ص = 7، والتي من شأنها أن تذهب إلى المربع الذي هو X والتغيير الذي ل7. 37 00:03:01,090 --> 00:03:13,540 أو يمكن أن أقول الباحث Z = P * 2 *، وهذا هو الخلط لأنه نجم، نجمة. 38 00:03:13,540 --> 00:03:19,230 نجم واحد هو يعتبر إلغاء مرجعية ف، نجم الآخر هو ضرب من قبل 2. 39 00:03:19,230 --> 00:03:26,780 لاحظت أنا فقط يمكن أن يكون كذلك استبدال P * مع س. 40 00:03:26,780 --> 00:03:29,430 يمكنك استخدامها بنفس الطريقة. 41 00:03:29,430 --> 00:03:38,000 ومن ثم يمكن في وقت لاحق لدي ف أشر إلى شيء جديد تماما. 42 00:03:38,000 --> 00:03:42,190 ويمكنني أن أقول فقط P = &z؛ 43 00:03:42,190 --> 00:03:44,940 حتى الآن لم تعد ع يشير إلى X، بل يشير إلى الياء. 44 00:03:44,940 --> 00:03:50,510 وأي وقت أفعل * ع انها تفعل نفس Z. 45 00:03:50,510 --> 00:03:56,170 ذلك الشيء المفيد في هذا هو أن نبدأ مرة واحدة في الحصول على وظائف. 46 00:03:56,170 --> 00:03:59,790 >> انه نوع من العبث أن يعلن مؤشر يشير إلى شيء 47 00:03:59,790 --> 00:04:03,140 ويعتبر إلغاء مرجعية ثم كنت فقط 48 00:04:03,140 --> 00:04:06,060 عندما كنت يمكن أن تستخدم المتغير الأصلي لتبدأ. 49 00:04:06,060 --> 00:04:18,190 ولكن عندما تحصل في وظائف - لذلك دعونا نقول لدينا بعض من وظيفة، وكثافة العمليات فو، 50 00:04:18,190 --> 00:04:32,810 التي تأخذ مؤشر ويفعل فقط * ص = 6؛ 51 00:04:32,810 --> 00:04:39,990 كما رأينا من قبل مع مبادلة، لا يمكنك أن تفعل مبادلة فعالة ومستقلة وظيفة 52 00:04:39,990 --> 00:04:45,180 أعداد صحيحة فقط عن طريق تمرير لأن كل شيء في C يمر دائما من حيث القيمة. 53 00:04:45,180 --> 00:04:48,360 حتى عندما كنت تمر مؤشرات كنت تمر من حيث القيمة. 54 00:04:48,360 --> 00:04:51,940 انها مجرد أن ذلك يحدث هذه القيم هي عناوين الذاكرة. 55 00:04:51,940 --> 00:05:00,770 لذلك عندما أقول فو (ع)؛ أنا تمرير المؤشر إلى وظيفة فو 56 00:05:00,770 --> 00:05:03,910 ومن ثم يقوم به فو * p = 6؛ 57 00:05:03,910 --> 00:05:08,600 حتى داخل هذه المهمة، ف * لا يزال يعادل س، 58 00:05:08,600 --> 00:05:12,720 ولكن لا يمكنني استخدام X داخل تلك الوظيفة لأنها ليست خاصة بتطبيق داخل تلك الوظيفة. 59 00:05:12,720 --> 00:05:19,510 * حتى ف = 6 هو السبيل الوحيد الذي يمكنني الوصول إلى المتغير المحلي من وظيفة أخرى. 60 00:05:19,510 --> 00:05:23,600 أو، أيضا، مؤشرات هي السبيل الوحيد الذي يمكنني الوصول إلى المتغير المحلي من وظيفة أخرى. 61 00:05:23,600 --> 00:05:31,600 [طالب] دعونا نقول لكم تريد العودة مؤشر. بالضبط كيف تفعل ذلك؟ 62 00:05:31,600 --> 00:05:44,270 [بودين] العودة مؤشر كما هو الحال في شيء من هذا القبيل الباحث 3 = ذ؛ عودة & Y؟ >> [طالب] نعم. 63 00:05:44,270 --> 00:05:48,480 [بودين] حسنا. يجب أن يفعلوا ذلك أبدا. هذا غير صحيح. 64 00:05:48,480 --> 00:05:59,480 أعتقد أنني رأيت في هذه المحاضرة التي كنت الشرائح رؤية هذا المخطط كله من الذاكرة 65 00:05:59,480 --> 00:06:02,880 حيث هنا حتى كنت قد حصلت على عنوان الذاكرة 0 66 00:06:02,880 --> 00:06:09,550 وإلى هنا كان لديك ذاكرة العربات العنوان 4 أو 2 إلى 32. 67 00:06:09,550 --> 00:06:15,120 حتى ذلك الحين كنت قد حصلت على بعض الاشياء والاشياء وبعض ثم لديك الكدسة 68 00:06:15,120 --> 00:06:21,780 وكنت قد حصلت على كومة الخاص بك، والتي بدأت للتو تعلم، يكبرون. 69 00:06:21,780 --> 00:06:24,390 [طالب] أليس في كومة فوق كومة؟ 70 00:06:24,390 --> 00:06:27,760 >> نعم. كومة على رأس، أليس كذلك؟ >> [طالب] حسنا، على حد تعبيره 0 على القمة. 71 00:06:27,760 --> 00:06:30,320 [طالب] أوه، على حد تعبيره 0 على القمة. >> [طالب] أوه، حسنا. 72 00:06:30,320 --> 00:06:36,060 تنويه: في أي مكان مع CS50 كنت تريد الذهاب لرؤيته بهذه الطريقة. >> [طالب] حسنا. 73 00:06:36,060 --> 00:06:40,290 انها مجرد عندما كنت يروه المداخن، 74 00:06:40,290 --> 00:06:45,000 مثل عندما تفكر في كومة تفكر في الأشياء التراص على رأس واحد آخر. 75 00:06:45,000 --> 00:06:50,810 لذلك فإننا نميل إلى هذا الوجه نحو ذلك المكدس ينمو مثل كومة عادة 76 00:06:50,810 --> 00:06:55,940 بدلا من المكدس المتدلية. >> [طالب] لا تنمو أكوام من الناحية الفنية حتى للغاية، على الرغم من؟ 77 00:06:55,940 --> 00:07:01,100 ذلك يعتمد على ما تعنيه ب يكبر. 78 00:07:01,100 --> 00:07:04,010 كومة كومة وتنمو دائما في اتجاهين معاكسين. 79 00:07:04,010 --> 00:07:09,420 A مكدس في تزايد مستمر حتى في بمعنى أنه يكبر 80 00:07:09,420 --> 00:07:12,940 عناوين نحو أعلى للذاكرة، وكومة من ينمو باستمرار 81 00:07:12,940 --> 00:07:17,260 في هذا انها المتزايد نحو أقل عناوين الذاكرة. 82 00:07:17,260 --> 00:07:20,250 حتى إن القمة 0 والقول هي عناوين الذاكرة عالية. 83 00:07:20,250 --> 00:07:26,390 انهم على حد سواء المتنامية، فقط في معارضة الاتجاهات. 84 00:07:26,390 --> 00:07:29,230 [طالب] I يعني فقط أن لأنك كنت وضعت كومة قال في القاع 85 00:07:29,230 --> 00:07:33,640 لأنه يبدو أكثر سهولة لأن لمكدس لبدء في الجزء العلوي من كومة، 86 00:07:33,640 --> 00:07:37,520 كومة من على قمة نفسها أيضا، حتى that's - نعم >>. 87 00:07:37,520 --> 00:07:44,960 كنت أعتقد أيضا كومة ويشبون وأكبر، ولكن أكثر من ذلك مكدس. 88 00:07:44,960 --> 00:07:50,280 وبالتالي فإن المكدس هو أننا نوع من تريد أن تظهر يكبرون. 89 00:07:50,280 --> 00:07:55,390 ولكن في كل مكان نظرتم خلاف ذلك سوف تظهر عنوان 0 في الجزء العلوي 90 00:07:55,390 --> 00:07:59,590 وعنوان أعلى الذاكرة في الجزء السفلي، لذلك هذا هو وجهة نظركم المعتادة من الذاكرة. 91 00:07:59,590 --> 00:08:02,100 >> هل لديك سؤال؟ 92 00:08:02,100 --> 00:08:04,270 [طالب] هل لك أن تخبرنا المزيد عن كومة؟ 93 00:08:04,270 --> 00:08:06,180 نعم. سأحضر إلى أنه في الثانية. 94 00:08:06,180 --> 00:08:12,220 أولا، لماذا العودة إلى العودة & Y أمر سيئ، 95 00:08:12,220 --> 00:08:18,470 على المكدس لديك مجموعة من إطارات المكدس التي تمثل جميع وظائف 96 00:08:18,470 --> 00:08:20,460 وقد تم استدعاء الذي. 97 00:08:20,460 --> 00:08:27,990 حتى تجاهل الأشياء السابقة، أعلى الكدسة دائما ما تكون المهمة الرئيسية 98 00:08:27,990 --> 00:08:33,090 منذ هذا هو الوظيفة الأولى التي يجري يسمى. 99 00:08:33,090 --> 00:08:37,130 ثم عند استدعاء دالة أخرى، المكدس هو الذهاب الى تنمو باستمرار. 100 00:08:37,130 --> 00:08:41,640 إذا كان الأمر كذلك أدعو بعض من وظيفة، فو، وأنها تحصل على كومة إطاره الخاص، 101 00:08:41,640 --> 00:08:47,280 يمكن أن ندعو بعض من وظيفة، بار، بل يحصل إطاره كومة الخاصة. 102 00:08:47,280 --> 00:08:49,840 ويمكن أن تكون متكررة وشريط يمكن أن تسمي نفسها، 103 00:08:49,840 --> 00:08:54,150 وحتى المكالمة الثانية لشريط هو الذهاب الى الحصول إطاره كومة الخاصة. 104 00:08:54,150 --> 00:08:58,880 وهكذا ما يجري في هذه الأطر كلها كومة من المتغيرات المحلية 105 00:08:58,880 --> 00:09:03,450 وجميع الحجج الدالة التي - 106 00:09:03,450 --> 00:09:08,730 أي الأشياء التي هي خاصة بتطبيق محليا لهذه الوظيفة تذهب في هذه الإطارات المكدس. 107 00:09:08,730 --> 00:09:21,520 وهذا يعني عندما قلت شيئا مثل شريط هي وظيفة، 108 00:09:21,520 --> 00:09:29,270 انا فقط لإعلان عدد صحيح ومن ثم العودة مؤشر إلى أن عدد صحيح. 109 00:09:29,270 --> 00:09:33,790 حتى أين يعيش ذ؟ 110 00:09:33,790 --> 00:09:36,900 [طالب] ذ يعيش في البار. >> [بودين] نعم. 111 00:09:36,900 --> 00:09:45,010 في مكان ما في هذه الساحة قليلا من الذاكرة هو مربع أصغر لديها ذ فيه. 112 00:09:45,010 --> 00:09:53,370 عندما أعود & Y، أنا إرجاع المؤشر إلى هذه الكتلة قليلا من الذاكرة. 113 00:09:53,370 --> 00:09:58,400 ولكن بعد ذلك عندما ترجع الدالة، ويحصل برزت إطاره كومة من المكدس. 114 00:10:01,050 --> 00:10:03,530 وهذا هو السبب في انه دعا المكدس. 115 00:10:03,530 --> 00:10:06,570 انها مثل كومة بنية بيانات، إذا كنت تعرف ما هي. 116 00:10:06,570 --> 00:10:11,580 أو حتى مثل كومة من الأدراج هو دائما سبيل المثال، 117 00:10:11,580 --> 00:10:16,060 الرئيسية ستذهب على الجزء السفلي، ثم الدالة الأولى التي تدعو ستذهب على رأس ذلك، 118 00:10:16,060 --> 00:10:20,400 ويمكن أن لا تحصل العودة الى الأصل حتى تعود من جميع الوظائف التي تم استدعاء 119 00:10:20,400 --> 00:10:22,340 وضعت هذا على أعلى من ذلك. 120 00:10:22,340 --> 00:10:28,650 >> [طالب] حتى إذا كنت لم تفعل العودة ذ و، أن القيمة هي عرضة للتغيير دون إشعار. 121 00:10:28,650 --> 00:10:31,290 نعم، it's - >> [طالب] قد يكون الكتابة. نعم >>. 122 00:10:31,290 --> 00:10:34,660 انها تماما - وإذا حاولت - 123 00:10:34,660 --> 00:10:38,040 وهذا سيكون أيضا بار * الباحث لانها تعود مؤشر، 124 00:10:38,040 --> 00:10:41,310 ذلك هو عودة نوعه * INT. 125 00:10:41,310 --> 00:10:46,500 إذا حاولت استخدام قيمة الإرجاع من هذه الوظيفة، انه سلوك غير معروف 126 00:10:46,500 --> 00:10:51,770 لأن هذا المؤشر يشير إلى ذكرى سيئة. >> [طالب] حسنا. 127 00:10:51,770 --> 00:11:01,250 ولكن ماذا لو، على سبيل المثال، كنت أعلن الباحث * Y = malloc (sizeof (الباحث))؟ 128 00:11:01,250 --> 00:11:03,740 هذا أفضل. نعم. 129 00:11:03,740 --> 00:11:07,730 [طالب] تحدثنا حول كيفية عندما كنا سحب الأشياء التى لدينا سلة المهملات 130 00:11:07,730 --> 00:11:11,750 كنت لا تمحى أنها في الواقع، ونحن فقط تفقد المؤشرات الخاصة بهم. 131 00:11:11,750 --> 00:11:15,550 حتى في هذه الحالة هل نحن فعلا محو قيمة أم أنه لا يزال هناك في الذاكرة؟ 132 00:11:15,550 --> 00:11:19,130 بالنسبة للجزء الأكبر، فإنه سيكون لا يزال هناك. 133 00:11:19,130 --> 00:11:24,220 ولكن دعونا نقول اننا ندعو يحدث لبعض وظيفة أخرى، باز. 134 00:11:24,220 --> 00:11:28,990 الباز هو الذهاب الى الحصول إطاره كومة الخاصة هنا. 135 00:11:28,990 --> 00:11:31,470 انها سوف تكون الكتابة فوق كل هذه الاشياء، 136 00:11:31,470 --> 00:11:34,180 ثم إذا حاولت في وقت لاحق واستخدام المؤشر الذي حصل من قبل، 137 00:11:34,180 --> 00:11:35,570 انها لن تكون نفس القيمة. 138 00:11:35,570 --> 00:11:38,150 انها ستكون لدينا مجرد تغيير لأنك يسمى الباز وظيفة. 139 00:11:38,150 --> 00:11:43,080 [طالب] ولكن كان علينا أن لا، ونحن لا يزال الحصول على 3؟ 140 00:11:43,080 --> 00:11:44,990 [بودين] في جميع الاحتمالات، وكنت. 141 00:11:44,990 --> 00:11:49,670 ولكن لا يمكنك الاعتماد على ذلك. C يقول فقط السلوك غير معروف. 142 00:11:49,670 --> 00:11:51,920 >> [طالب] أوه، لا. حسنا. 143 00:11:51,920 --> 00:11:58,190 حتى عندما تريد إرجاع المؤشر، هذا هو المكان الذي يأتي في malloc الاستخدام. 144 00:12:00,930 --> 00:12:15,960 أنا أكتب في الواقع مجرد العودة malloc (3 * sizeof (الباحث)). 145 00:12:17,360 --> 00:12:24,050 سوف نذهب أكثر من malloc أكثر في الثانية، ولكن هي فكرة malloc جميع المتغيرات المحلية 146 00:12:24,050 --> 00:12:26,760 دائما الذهاب على المكدس. 147 00:12:26,760 --> 00:12:31,570 أي شيء يذهب malloced على كومة، وسوف يكون دائما وإلى الأبد على كومة 148 00:12:31,570 --> 00:12:34,490 حتى تحرير بشكل صريح. 149 00:12:34,490 --> 00:12:42,130 لذلك هذا يعني أنه عند malloc شيء، انها سوف البقاء على قيد الحياة بعد عودة وظيفة. 150 00:12:42,130 --> 00:12:46,800 [طالب] هل البقاء على قيد الحياة بعد إيقاف تشغيل البرنامج؟ رقم >> 151 00:12:46,800 --> 00:12:53,180 حسنا، لذلك ستكون هناك حتى هذا البرنامج هو كل وسيلة يتم تشغيل. نعم >>. 152 00:12:53,180 --> 00:12:57,510 يمكننا أن نذهب أكثر من تفاصيل ما يحدث عندما يتوقف البرنامج عن التشغيل. 153 00:12:57,510 --> 00:13:02,150 قد تحتاج إلى تذكير لي، ولكن هذا أمر منفصل تماما. 154 00:13:02,150 --> 00:13:04,190 [طالب] وهكذا يخلق مؤشر malloc؟ نعم >>. 155 00:13:04,190 --> 00:13:13,030 Malloc - >> [طالب] أعتقد malloc يعين كتلة من الذاكرة التي يمكن استخدامها مؤشر. 156 00:13:15,400 --> 00:13:19,610 [بودين] أريد أن الرسم مرة أخرى. >> [طالب] لذلك هذه الوظيفة يعمل، على الرغم من؟ 157 00:13:19,610 --> 00:13:26,430 [طالب] نعم، malloc يعين كتلة من الذاكرة التي يمكن استخدامها، 158 00:13:26,430 --> 00:13:30,470 ومن ثم فإنها ترجع عنوان كتلة الأول من تلك الذاكرة. 159 00:13:30,470 --> 00:13:36,750 >> [بودين] نعم. حتى عندما كنت malloc، كنت الاستيلاء على بعض كتلة من الذاكرة 160 00:13:36,750 --> 00:13:38,260 هذا حاليا في الكومة. 161 00:13:38,260 --> 00:13:43,040 إذا الكومة صغير جدا، ثم كومة هو مجرد الذهاب الى النمو، وأنها تنمو في هذا الاتجاه. 162 00:13:43,040 --> 00:13:44,650 لذلك دعونا نقول كومة صغيرة جدا. 163 00:13:44,650 --> 00:13:49,960 ثم انها على وشك تنمو قليلا والعودة مؤشر إلى هذه الكتلة التي نشأت للتو. 164 00:13:49,960 --> 00:13:55,130 عند الاشياء مجانا، وكنت مما يجعل مجالا أكبر في كومة، 165 00:13:55,130 --> 00:14:00,030 بحيث ثم مكالمة في وقت لاحق لإعادة استخدام malloc أن الذاكرة التي كنت قد حررت من قبل. 166 00:14:00,030 --> 00:14:09,950 الشيء المهم حول malloc وحرة هو أنه يتيح لك السيطرة الكاملة 167 00:14:09,950 --> 00:14:12,700 على مدى عمر هذه الكتل الذاكرة. 168 00:14:12,700 --> 00:14:15,420 المتغيرات العالمية هي دائما على قيد الحياة. 169 00:14:15,420 --> 00:14:18,500 المتغيرات المحلية على قيد الحياة داخل نطاقها. 170 00:14:18,500 --> 00:14:22,140 حالما تذهب الماضي متعرج، والمتغيرات المحلية قد لقوا حتفهم. 171 00:14:22,140 --> 00:14:28,890 الذاكرة Malloced على قيد الحياة عندما تريد أن يكون على قيد الحياة 172 00:14:28,890 --> 00:14:33,480 ومن ثم يتم تحريرها عند أقول ذلك ليتم الافراج عنهم. 173 00:14:33,480 --> 00:14:38,420 تلك هي في الواقع سوى 3 أنواع من الذاكرة، حقا. 174 00:14:38,420 --> 00:14:41,840 هناك آلية إدارة الذاكرة، والذي هو المكدس. 175 00:14:41,840 --> 00:14:43,840 الأمور بالنسبة لك تلقائيا. 176 00:14:43,840 --> 00:14:46,910 عندما تقول X الباحث، يتم تخصيص الذاكرة ل x الباحث. 177 00:14:46,910 --> 00:14:51,630 عندما X يخرج من نطاق، هو استخلاص الذاكرة ل x. 178 00:14:51,630 --> 00:14:54,790 ثم هناك ديناميكية إدارة الذاكرة، وهذا ما هو malloc، 179 00:14:54,790 --> 00:14:56,740 وهو عندما يكون لديك السيطرة. 180 00:14:56,740 --> 00:15:01,290 عليك أن تقرر متى يجب حيوي والذاكرة لا ينبغي تخصيصها. 181 00:15:01,290 --> 00:15:05,050 وبعد ذلك هناك ثابت، وهو ما يعني فقط أنه يعيش إلى الأبد، 182 00:15:05,050 --> 00:15:06,610 وهو ما هي المتغيرات العالمية. 183 00:15:06,610 --> 00:15:10,240 انهم دائما في الذاكرة فقط. 184 00:15:10,960 --> 00:15:12,760 >> الأسئلة؟ 185 00:15:14,490 --> 00:15:17,230 [طالب] يمكنك تحديد كتلة فقط باستخدام الأقواس المتعرجة 186 00:15:17,230 --> 00:15:21,220 ولكن لا وجود لديك؟ إذا البيان أو بيان أو حين شيء من هذا القبيل 187 00:15:21,220 --> 00:15:29,130 يمكنك تحديد كتلة كما هو الحال في وظيفة، ولكن لديها أيضا الأقواس المتعرجة. 188 00:15:29,130 --> 00:15:32,100 [طالب] لذلك لا يمكن أن يكون تماما مثل الزوج عشوائية من الأقواس المتعرجة في التعليمات البرمجية 189 00:15:32,100 --> 00:15:35,680 التي لديها المتغيرات المحلية؟ نعم >>، يمكنك. 190 00:15:35,680 --> 00:15:45,900 داخل شريط الباحث أن لدينا {الباحث ذ = 3؛}. 191 00:15:45,900 --> 00:15:48,440 من المفترض أن تكون هنا. 192 00:15:48,440 --> 00:15:52,450 ولكن الذي يعرف تماما مدى كثافة العمليات ذ. 193 00:15:52,450 --> 00:15:57,320 بعد ذلك متعرج الثاني يمكن، وليس Y استخدامها بعد الآن. 194 00:15:57,910 --> 00:16:00,630 أنت لا تفعل ذلك تقريبا، وإن كان. 195 00:16:02,940 --> 00:16:07,370 العودة الى ما يحدث عندما ينتهي البرنامج، 196 00:16:07,370 --> 00:16:18,760 هناك نوع من سوء الفهم كذبة / نصف أن نعطي من أجل جعل الأمور أسهل فقط. 197 00:16:18,760 --> 00:16:24,410 نقول لكم أنه عند تخصيص الذاكرة 198 00:16:24,410 --> 00:16:29,860 كنت تخصيص بعض قطعة من RAM لهذا المتغير. 199 00:16:29,860 --> 00:16:34,190 ولكن كنت حقا لا لمس مباشرة RAM أي وقت مضى في البرامج الخاصة بك. 200 00:16:34,190 --> 00:16:37,490 إذا كنت التفكير في الأمر، كيف وجهت - 201 00:16:37,490 --> 00:16:44,330 وفعلا، إذا كنت تذهب من خلال GDB في سترى نفس الشيء. 202 00:16:51,120 --> 00:16:57,590 بغض النظر عن عدد مرات تشغيل البرنامج أو ما البرنامج الذي كنت تعمل، 203 00:16:57,590 --> 00:16:59,950 المكدس دائما ما تبدأ - 204 00:16:59,950 --> 00:17:06,510 كنت دائما ما أنظر المتغيرات حول شيء oxbffff العنوان. 205 00:17:06,510 --> 00:17:09,470 انها عادة ما تكون في مكان ما في تلك المنطقة. 206 00:17:09,470 --> 00:17:18,760 ولكن كيف يمكن أن يكون ربما 2 برامج المؤشرات إلى نفس الذاكرة؟ 207 00:17:20,640 --> 00:17:27,650 [طالب] هناك بعض تسمية التعسفي من حيث يفترض أن تكون oxbfff على RAM 208 00:17:27,650 --> 00:17:31,320 يمكن أن يكون في الواقع في أماكن مختلفة اعتمادا على عندما تم استدعاء الدالة. 209 00:17:31,320 --> 00:17:35,920 نعم. هذا المصطلح الذاكرة الظاهرية. 210 00:17:35,920 --> 00:17:42,250 والفكرة هي أن كل عملية واحدة، كل برنامج واحد الذي يعمل على جهاز الكمبيوتر الخاص بك 211 00:17:42,250 --> 00:17:49,450 الخاصة به - لنفترض 32 بت - مستقلة تماما مساحة العنوان. 212 00:17:49,450 --> 00:17:51,590 هذا هو مساحة العنوان. 213 00:17:51,590 --> 00:17:56,220 انها لديها قناعاتها مستقلة تماما 4 غيغا بايت للاستخدام. 214 00:17:56,220 --> 00:18:02,220 >> حتى إذا قمت بتشغيل 2 برامج في وقت واحد، وهذا البرنامج يرى 4 غيغا بايت لنفسها، 215 00:18:02,220 --> 00:18:04,870 يرى هذا البرنامج 4 غيغا بايت لنفسها، 216 00:18:04,870 --> 00:18:07,720 وأنه من المستحيل لهذا البرنامج لإلغاء مرجعية مؤشر 217 00:18:07,720 --> 00:18:10,920 وينتهي مع الذاكرة من هذا البرنامج. 218 00:18:10,920 --> 00:18:18,200 وما هي الذاكرة الظاهرية تعيين من مساحة العنوان عمليات 219 00:18:18,200 --> 00:18:20,470 إلى أشياء الفعلي على RAM. 220 00:18:20,470 --> 00:18:22,940 لذلك فمن يصل إلى نظام التشغيل الخاص بك لمعرفة ذلك، 221 00:18:22,940 --> 00:18:28,080 مهلا، هذا المؤشر عند dereferences oxbfff الرجل، وهذا يعني حقا 222 00:18:28,080 --> 00:18:31,040 انه يريد RAM بايت 1000، 223 00:18:31,040 --> 00:18:38,150 في حين إذا كانت هذه oxbfff dereferences برنامج، وقال انه يريد فعلا RAM بايت 10000. 224 00:18:38,150 --> 00:18:41,590 فإنها يمكن أن تكون بعيدة بشكل تعسفي على حدة. 225 00:18:41,590 --> 00:18:48,730 هذا صحيح حتى من الأشياء داخل مسافة واحدة عنوان العمليات. 226 00:18:48,730 --> 00:18:54,770 مثل لذلك يرى أن كل غيغا بايت 4 إلى نفسها، ولكن دعونا نقول - 227 00:18:54,770 --> 00:18:57,290 [طالب] هل كل عملية واحدة - 228 00:18:57,290 --> 00:19:01,350 دعونا نقول لديك جهاز كمبيوتر مع فقط 4 غيغابايت من ذاكرة الوصول العشوائي. 229 00:19:01,350 --> 00:19:06,430 لا كل عملية واحدة ترى كل 4 غيغا بايت؟ نعم >>. 230 00:19:06,430 --> 00:19:13,060 4 غيغا بايت ولكن تراه هو كذب. 231 00:19:13,060 --> 00:19:20,460 انها مجرد أنها تعتقد أنه لديه كل هذه الذاكرة لأنه لا يعرف أي عملية أخرى موجودة. 232 00:19:20,460 --> 00:19:28,140 فإنه يستخدم الذاكرة فقط بقدر ما يحتاج فعلا. 233 00:19:28,140 --> 00:19:32,340 نظام التشغيل لن تعطي لهذه العملية RAM 234 00:19:32,340 --> 00:19:35,750 اذا كان لا تستخدم أي الذاكرة في هذه المنطقة بأسرها. 235 00:19:35,750 --> 00:19:39,300 انها لن تقدم له الذاكرة لتلك المنطقة. 236 00:19:39,300 --> 00:19:54,780 ولكن الفكرة هي أن - أنا أحاول أن أفكر في - لا أستطيع التفكير في القياس. 237 00:19:54,780 --> 00:19:56,780 من الصعب القياس. 238 00:19:57,740 --> 00:20:02,700 واحدة من القضايا من الذاكرة الظاهرية أو واحد من الأشياء انها حل 239 00:20:02,700 --> 00:20:06,810 هو أن العمليات يجب أن تكون على علم تماما عن بعضها البعض. 240 00:20:06,810 --> 00:20:12,140 وهكذا يمكنك كتابة أي برنامج dereferences فقط أي مؤشر، 241 00:20:12,140 --> 00:20:19,340 مجرد كتابة مثل برنامج الذي يقول * (ox1234)، 242 00:20:19,340 --> 00:20:22,890 وهذا عنوان الذاكرة يعتبر إلغاء مرجعية 1234. 243 00:20:22,890 --> 00:20:28,870 >> ولكن الامر متروك لنظام التشغيل لترجمة ما ثم 1234 وسيلة. 244 00:20:28,870 --> 00:20:33,960 لذلك إذا صادف أن يكون 1234 عنوان ذاكرة صالحة لهذه العملية، 245 00:20:33,960 --> 00:20:38,800 انها مثل في بنية تخزين العناصر أو شيء ما، فإن هذا إرجاع قيمة ذلك عنوان الذاكرة 246 00:20:38,800 --> 00:20:41,960 بقدر ما يعرف عملية. 247 00:20:41,960 --> 00:20:47,520 ولكن إذا لم 1234 غير عنوانا صالحا، كما يحدث على الأرض 248 00:20:47,520 --> 00:20:52,910 في بعض قطعة صغيرة من الذاكرة هنا أن يتجاوز مكدس كومة وما بعده 249 00:20:52,910 --> 00:20:57,200 وكنت لم تستخدم حقا ذلك، ثم ذلك عندما تحصل أشياء مثل segfaults 250 00:20:57,200 --> 00:21:00,260 لأنك لمس الذاكرة التي يجب أن لا يتم لمس. 251 00:21:07,180 --> 00:21:09,340 هذا صحيح أيضا - 252 00:21:09,340 --> 00:21:15,440 نظام 32 بت و 32 بت يعني أن لديك 32 بت لتعريف عنوان الذاكرة. 253 00:21:15,440 --> 00:21:22,970 ذلك هو السبب في مؤشرات هي 8 بايت 32 بت لهي 8 بايت - بايت أو 4. 254 00:21:22,970 --> 00:21:25,250 مؤشرات هي 4 بايت. 255 00:21:25,250 --> 00:21:33,680 لذلك عندما تشاهد مثل مؤشر oxbfffff، وهذا هو - 256 00:21:33,680 --> 00:21:40,080 ضمن أي برنامج معين يمكنك بناء أي مؤشر فقط التعسفي، 257 00:21:40,080 --> 00:21:46,330 في أي مكان من ox0 لf's 8 الثور - FFFFFFFF. 258 00:21:46,330 --> 00:21:49,180 [طالب] لم تقولون انهم 4 بايت؟ نعم >>. 259 00:21:49,180 --> 00:21:52,730 [طالب] ثم كل بايت سيكون لها - >> سداسي عشري [بودين]. 260 00:21:52,730 --> 00:21:59,360 عشري - 5 و 6 و 7 و 8. مؤشرات ذلك وأنت تسير لتراها دوما بالنظام الست عشري. 261 00:21:59,360 --> 00:22:01,710 انها مجرد كيف نصنف المؤشرات. 262 00:22:01,710 --> 00:22:05,240 كل الأرقام الست عشرية 2 من هو 1 بايت. 263 00:22:05,240 --> 00:22:09,600 لذلك هناك سيكون 8 أرقام ست عشرية لمدة 4 بايت. 264 00:22:09,600 --> 00:22:14,190 لذلك كل مؤشر واحد على نظام 32 بت ستكون 4 بايت، 265 00:22:14,190 --> 00:22:18,550 مما يعني أنه في عملية الخاص بك يمكنك بناء أي التعسفي 4 بايت 266 00:22:18,550 --> 00:22:20,550 وجعل مؤشر للخروج منه، 267 00:22:20,550 --> 00:22:32,730 وهو ما يعني أنه بقدر ما انها على علم، فإنه يمكن معالجة قدرها 2 بايت بأكمله إلى 32 من الذاكرة. 268 00:22:32,730 --> 00:22:34,760 على الرغم من أنه لا يملك في الواقع الوصول إلى ذلك، 269 00:22:34,760 --> 00:22:40,190 حتى لو جهاز الكمبيوتر الخاص بك ليس لديها سوى 512 ميغا، فإنه يعتقد أن لديها الكثير من الذاكرة. 270 00:22:40,190 --> 00:22:44,930 ونظام التشغيل ذكي بما فيه الكفاية أنه سيحدد فقط ما تحتاجه فعلا. 271 00:22:44,930 --> 00:22:49,630 فإنه لا يذهب فقط، أوه، عملية جديدة: 4 العربات. 272 00:22:49,630 --> 00:22:51,930 >> نعم. >> [طالب] ماذا يعني الثور؟ لماذا الكتابة؟ 273 00:22:51,930 --> 00:22:54,980 انها مجرد رمز للعشري. 274 00:22:54,980 --> 00:22:59,590 عندما ترى بداية مع عدد ثور، والأشياء المتعاقبة هي الست عشري. 275 00:23:01,930 --> 00:23:05,760 [طالب] وأنت تشرح ما يحدث عندما ينتهي البرنامج. نعم >>. 276 00:23:05,760 --> 00:23:09,480 ماذا يحدث عندما ينتهي برنامج هو نظام التشغيل 277 00:23:09,480 --> 00:23:13,600 يمحو مجرد أن لديها مخططات لهذه العناوين، وهذا كل شيء. 278 00:23:13,600 --> 00:23:17,770 يمكن لنظام التشغيل الآن مجرد اعطاء تلك الذاكرة إلى برنامج آخر للاستخدام. 279 00:23:17,770 --> 00:23:19,490 [طالب] حسنا. 280 00:23:19,490 --> 00:23:24,800 حتى عندما كنت تخصيص شيء على كومة أو المتغيرات العالمية أو كومة أو أي شيء، 281 00:23:24,800 --> 00:23:27,010 أنهم جميعا تختفي بمجرد أن ينتهي البرنامج 282 00:23:27,010 --> 00:23:32,120 لأن نظام التشغيل هو الآن مجانا لإعطاء تلك الذاكرة إلى أي عملية أخرى. 283 00:23:32,120 --> 00:23:35,150 [طالب] على الرغم من أن هناك وربما لا يزال يكتب في القيم؟ نعم >>. 284 00:23:35,150 --> 00:23:37,740 القيم من المحتمل أن تبقى هناك. 285 00:23:37,740 --> 00:23:41,570 انها مجرد انها سوف يكون من الصعب الحصول عليها. 286 00:23:41,570 --> 00:23:45,230 انها أكثر صعوبة للحصول على عليهم مما هو عليه في الحصول على ملف حذف 287 00:23:45,230 --> 00:23:51,450 لأن نوع الملف المحذوف من يجلس هناك لفترة طويلة وكان القرص الصلب هو أكبر كثيرا. 288 00:23:51,450 --> 00:23:54,120 ذلك انه سيكون للكتابة فوق أجزاء مختلفة من الذاكرة 289 00:23:54,120 --> 00:23:58,640 قبل أن يحدث للكتابة فوق قطعة من الذاكرة التي تستخدم لهذا الملف ان تكون على. 290 00:23:58,640 --> 00:24:04,520 ولكن الذاكرة الرئيسية، RAM، كنت تنقل على نحو أسرع كثيرا، 291 00:24:04,520 --> 00:24:08,040 لذلك يحدث بسرعة كبيرة لتكون الكتابة. 292 00:24:10,300 --> 00:24:13,340 أسئلة حول هذا أو أي شيء آخر؟ 293 00:24:13,340 --> 00:24:16,130 [طالب] لدي أسئلة حول موضوع مختلف. حسنا >>. 294 00:24:16,130 --> 00:24:19,060 هل لديها أسئلة حول هذا؟ 295 00:24:20,170 --> 00:24:23,120 >> حسنا. مختلفة الموضوع. >> [طالب] حسنا. 296 00:24:23,120 --> 00:24:26,550 كنت ذاهبا من خلال بعض اختبارات الممارسة، 297 00:24:26,550 --> 00:24:30,480 واحد منهم كان من الحديث عن sizeof 298 00:24:30,480 --> 00:24:35,630 وبالقيمة التي تقوم بإرجاع متغير أو أنواع مختلفة. نعم >>. 299 00:24:35,630 --> 00:24:45,060 وقال أن كل من الباحث والطويل على حد سواء العودة 4، حتى انهم على حد سواء 4 بايت طويلة. 300 00:24:45,060 --> 00:24:48,070 هل هناك أي فرق بين الباحث ومنذ فترة طويلة، أم أنه نفس الشيء؟ 301 00:24:48,070 --> 00:24:50,380 نعم، هناك فرق. 302 00:24:50,380 --> 00:24:52,960 وC القياسية - 303 00:24:52,960 --> 00:24:54,950 انا ذاهب على الارجح أن تصل الفوضى. 304 00:24:54,950 --> 00:24:58,800 معيار C هو تماما مثل ما هو C، الوثائق الرسمية للC. 305 00:24:58,800 --> 00:25:00,340 هذا هو ما تقول. 306 00:25:00,340 --> 00:25:08,650 وبالتالي فإن معيار C يقول فقط أن شار إلى الأبد وسوف يكون دائما و1 بايت. 307 00:25:10,470 --> 00:25:19,040 كل شيء بعد ذلك - هو دائما قصيرة محددة فقط بأنها أكبر من أو يساوي إلى شار. 308 00:25:19,040 --> 00:25:23,010 وهذا قد يكون أكبر من بدقة، ولكن لا الإيجابية. 309 00:25:23,010 --> 00:25:31,940 ويعرف الباحث مجرد كونه أكبر من أو يساوي قصيرة. 310 00:25:31,940 --> 00:25:36,210 ويتم تعريف مجرد طويلة بأنها أكبر من أو يساوي إلى int. 311 00:25:36,210 --> 00:25:41,600 ومنذ فترة طويلة طويلة أكبر من أو يساوي طويلة. 312 00:25:41,600 --> 00:25:46,610 وبالتالي فإن الشيء الوحيد الذي يحدد مستوى C هو ترتيب النسبي من كل شيء. 313 00:25:46,610 --> 00:25:54,880 المبلغ الفعلي للذاكرة أن الأمور يستغرق عموما حتى التنفيذ، 314 00:25:54,880 --> 00:25:57,640 ولكن هذا ما يرام تعريفه في هذه المرحلة. >> [طالب] حسنا. 315 00:25:57,640 --> 00:26:02,490 حتى السراويل هي دائما تقريبا ستكون 2 بايت. 316 00:26:04,920 --> 00:26:09,950 رجات هي دائما تقريبا ستكون 4 بايت. 317 00:26:12,070 --> 00:26:15,340 صفقات الشراء طويلة هي دائما تقريبا ستكون 8 بايت. 318 00:26:17,990 --> 00:26:23,160 ويتوق، فإنه يعتمد على ما إذا كنت تستخدم 32 بت أو نظام 64 بت. 319 00:26:23,160 --> 00:26:27,450 لذلك منذ فترة طويلة هو الذهاب الى تتوافق مع نوع من النظام. 320 00:26:27,450 --> 00:26:31,920 إذا كنت تستخدم نظام 32 بت مثل الأجهزة، فإنه سيكون من 4 بايت. 321 00:26:34,530 --> 00:26:42,570 إذا كنت تستخدم 64 بت مثل الكثير من أجهزة الكمبيوتر الحديثة، فإنه سيكون من 8 بايت. 322 00:26:42,570 --> 00:26:45,230 >> رجات هي دائما تقريبا 4 بايت في هذه المرحلة. 323 00:26:45,230 --> 00:26:47,140 صفقات الشراء طويلة هي دائما تقريبا 8 بايت. 324 00:26:47,140 --> 00:26:50,300 في الماضي، وتستخدم فقط ليكون رجات 2 بايت. 325 00:26:50,300 --> 00:26:56,840 ولكن لاحظ أن هذا يرضي تماما كل هذه العلاقات أكبر من ويساوي. 326 00:26:56,840 --> 00:27:01,280 طالما يسمح تماما ليكون بنفس حجم عدد صحيح، 327 00:27:01,280 --> 00:27:04,030 وأتاح أيضا أن يكون بنفس حجم طويلة طويلة. 328 00:27:04,030 --> 00:27:11,070 ويحدث ذلك فقط أن يكون ذلك في 99.999٪ من أنظمة، فإنه سيكون مساويا ل 329 00:27:11,070 --> 00:27:15,800 إما الباحث أو طويل. ذلك يعتمد فقط على بت 32 أو 64 بت. >> [طالب] حسنا. 330 00:27:15,800 --> 00:27:24,600 في العوامات، وكيف هي النقطة العشرية المعين من حيث بت؟ 331 00:27:24,600 --> 00:27:27,160 مثل ما ثنائي؟ نعم >>. 332 00:27:27,160 --> 00:27:30,570 لا تحتاج أن تعرف أن لCS50. 333 00:27:30,570 --> 00:27:32,960 كنت لا تعلم حتى أنه في 61. 334 00:27:32,960 --> 00:27:37,350 كنت لا تعلم أن حقا في أي مسار. 335 00:27:37,350 --> 00:27:42,740 انها مجرد تمثيل. 336 00:27:42,740 --> 00:27:45,440 انسى المخصصات بت بالضبط. 337 00:27:45,440 --> 00:27:53,380 فكرة النقطة العائمة هو أنك تخصيص عدد محدد من البتات لتمثيل - 338 00:27:53,380 --> 00:27:56,550 أساسا، كل شيء في العلمي. 339 00:27:56,550 --> 00:28:05,600 حتى تتمكن تخصيص عدد محدد من البتات لتمثيل الرقم نفسه، مثل 1.2345. 340 00:28:05,600 --> 00:28:10,200 لا يمكنني أبدا أن تمثل عدد الأرقام أكثر مع من 5. 341 00:28:12,200 --> 00:28:26,300 ثم تخصيص أيضا عدد محدد من البتات بحيث يميل إلى أن يكون مثل 342 00:28:26,300 --> 00:28:32,810 يمكنك الذهاب فقط حتى عدد معين، مثل هذا هو أكبر داعية يمكن أن يكون، 343 00:28:32,810 --> 00:28:36,190 ويمكن أن تذهب فقط لتصل إلى الأس معينة، 344 00:28:36,190 --> 00:28:38,770 مثل هذا هو أصغر داعية يمكن أن يكون. 345 00:28:38,770 --> 00:28:44,410 >> أنا لا أتذكر يتم تعيين بت الطريقة الدقيقة لجميع هذه القيم، 346 00:28:44,410 --> 00:28:47,940 ولكن نحن ملتزمون عدد معين من البتات إلى 1.2345، 347 00:28:47,940 --> 00:28:50,930 هي مكرسة آخر عدد معين من البتات إلى الأس، 348 00:28:50,930 --> 00:28:55,670 وانها الوحيدة الممكنة لتمثيل الأس من حجم معين. 349 00:28:55,670 --> 00:29:01,100 [طالب] ومزدوجة؟ هو أن مثل تعويم وطويلة جدا؟ نعم >>. 350 00:29:01,100 --> 00:29:07,940 انها نفس الشيء مثل عدد عشري إلا الآن كنت تستخدم 8 بايت بدلا من 4 بايت. 351 00:29:07,940 --> 00:29:11,960 الآن عليك أن تكون قادرا على استخدام أرقام أو 9 أرقام 10، 352 00:29:11,960 --> 00:29:16,630 وهذا سوف يكون قادرا على الذهاب تصل إلى 300 بدلا من 100. >> [طالب] حسنا. 353 00:29:16,630 --> 00:29:21,550 ويطفو أيضا 4 بايت. نعم >>. 354 00:29:21,550 --> 00:29:27,520 حسنا، مرة أخرى، فإنه يعتمد على تنفيذ ربما الشاملة العامة، 355 00:29:27,520 --> 00:29:30,610 ولكن يطفو هي 4 بايت، الزوجي هي 8. 356 00:29:30,610 --> 00:29:33,440 وتسمى الزوجي المزدوج لأنها ضعف حجم يطفو. 357 00:29:33,440 --> 00:29:38,380 [طالب] حسنا. وهناك الزوجي المزدوج؟ ليست هناك >>. 358 00:29:38,380 --> 00:29:43,660 أعتقد - >> [طالب] مثل صفقات الشراء طويلة؟ نعم >>. لا اعتقد هذا. نعم. 359 00:29:43,660 --> 00:29:45,950 [طالب] في اختبار العام الماضي كان هناك سؤال عن المهمة الرئيسية 360 00:29:45,950 --> 00:29:49,490 الحاجة إلى أن تكون جزءا من البرنامج. 361 00:29:49,490 --> 00:29:52,310 كان الجواب أنه ليس من الضروري أن تكون جزءا من البرنامج. 362 00:29:52,310 --> 00:29:55,100 في ما الوضع؟ هذا ما رأيت. 363 00:29:55,100 --> 00:29:59,090 [بودين] يبدو - >> [طالب] ما الوضع؟ 364 00:29:59,090 --> 00:30:02,880 هل لديك مشكلة؟ >> [طالب] نعم، أنا بالتأكيد يمكن سحب عنه. 365 00:30:02,880 --> 00:30:07,910 فإنه ليس من الضروري أن يكون، من الناحية الفنية، ولكن أساسا انها ستكون. 366 00:30:07,910 --> 00:30:10,030 [طالب] رأيت واحدا على في العام مختلفة. 367 00:30:10,030 --> 00:30:16,220 كان مثل صحيح أم خطأ: A صالحة - أوه >>، ملف ج.؟ 368 00:30:16,220 --> 00:30:18,790 [طالب] يجب أن يكون أي ملف ج - [كلا يتحدث في وقت واحد - غير مفهومة] 369 00:30:18,790 --> 00:30:21,120 حسنا. ولهذا منفصلة. 370 00:30:21,120 --> 00:30:26,800 >> ملف ج. يحتاج فقط لاحتواء الوظائف. 371 00:30:26,800 --> 00:30:32,400 يمكنك تجميع ملف إلى رمز الجهاز، ثنائي، أيا كان، 372 00:30:32,400 --> 00:30:36,620 دون أن يكون قابل للتنفيذ بعد. 373 00:30:36,620 --> 00:30:39,420 يجب للتنفيذ صالحة لها وظيفة رئيسية. 374 00:30:39,420 --> 00:30:45,460 يمكنك كتابة 100 وظائف في 1 الملف ولكن لا الرئيسي 375 00:30:45,460 --> 00:30:48,800 وثم ترجمة ذلك إلى أسفل إلى ثنائي، 376 00:30:48,800 --> 00:30:54,460 ثم تكتب ملف آخر يحتوي على المعلومات الرئيسية لكنها تدعو مجموعة من هذه الوظائف 377 00:30:54,460 --> 00:30:56,720 في هذا الملف الثنائي أكثر من هنا. 378 00:30:56,720 --> 00:31:01,240 وحتى عندما كنت جعل قابل للتنفيذ، وهذا ما لا رابط 379 00:31:01,240 --> 00:31:05,960 وأنه يجمع هذه الملفات الثنائية 2 في ملف قابل للتنفيذ. 380 00:31:05,960 --> 00:31:11,400 حتى ملف ج. لا تحتاج إلى أن يكون المهمة الرئيسية على الإطلاق. 381 00:31:11,400 --> 00:31:19,220 وعلى قواعد رمز كبير سترى الآلاف من الملفات ج. و 1 الملف الرئيسي. 382 00:31:23,960 --> 00:31:26,110 المزيد من الأسئلة؟ 383 00:31:29,310 --> 00:31:31,940 [طالب] وكان هناك سؤال آخر. 384 00:31:31,940 --> 00:31:36,710 وقال انه جعل هو مترجم. صواب أم خطأ؟ 385 00:31:36,710 --> 00:31:42,030 وكان الجواب كاذبة، وفهمت لماذا انها ليست مثل ضجيج. 386 00:31:42,030 --> 00:31:44,770 ولكن ماذا نسمي جعل إذا لم تكن؟ 387 00:31:44,770 --> 00:31:49,990 جعل هو في الأساس فقط - أستطيع أن أرى تماما ما يسميها. 388 00:31:49,990 --> 00:31:52,410 ولكن تشغيله فقط الأوامر. 389 00:31:53,650 --> 00:31:55,650 القيام بها. 390 00:31:58,240 --> 00:32:00,870 يمكنني سحب هذا الأمر. نعم. 391 00:32:10,110 --> 00:32:13,180 أوه، نعم. لا تجعل أيضا ذلك. 392 00:32:13,180 --> 00:32:17,170 هذا يقول الغرض من الأداة المساعدة هو جعل لتحديد تلقائيا 393 00:32:17,170 --> 00:32:19,610 التي قطعة من برنامج واسع تحتاج إلى أن يكون recompiled 394 00:32:19,610 --> 00:32:22,350 وإصدار الأوامر إلى إعادة ترجمة لهم. 395 00:32:22,350 --> 00:32:27,690 يمكنك جعل الملفات التي تجعل ضخمة للغاية. 396 00:32:27,690 --> 00:32:33,210 جعل يبحث في الوقت الطوابع من الملفات و، كما قلنا من قبل، 397 00:32:33,210 --> 00:32:36,930 يمكنك تجميع الملفات الفردية لأسفل، وانها ليست حتى تحصل على رابط 398 00:32:36,930 --> 00:32:39,270 أن كنت وضعوا معا في ملف قابل للتنفيذ. 399 00:32:39,270 --> 00:32:43,810 إذا كان الأمر كذلك لديك 10 ملف مختلف وقمت بإجراء تغيير إلى 1 منهم، 400 00:32:43,810 --> 00:32:47,870 ثم ما جعل هو بصدد القيام به هو إعادة ترجمة الملف فقط أن 1 401 00:32:47,870 --> 00:32:50,640 وبعد ذلك كل شيء إعادة ربط معا. 402 00:32:50,640 --> 00:32:53,020 ولكن هذا غباء من ذلك بكثير. 403 00:32:53,020 --> 00:32:55,690 والامر متروك لكم لتحديد تماما أن هذا ما ينبغي أن تفعله. 404 00:32:55,690 --> 00:32:59,560 بشكل افتراضي لديه القدرة على التعرف على هذه الاشياء الطابع الزمني، 405 00:32:59,560 --> 00:33:03,220 ولكن يمكنك كتابة ملف تكوين لفعل أي شيء. 406 00:33:03,220 --> 00:33:09,150 يمكنك كتابة الملف بحيث تجعل عند كتابة تجعل من مجرد مؤتمر نزع السلاح إلى دليل آخر. 407 00:33:09,150 --> 00:33:15,560 تم الحصول على بالاحباط لأنني كل شيء تك داخل جهاز بلدي 408 00:33:15,560 --> 00:33:21,740 وبعد ذلك عرض PDF من ماك. 409 00:33:21,740 --> 00:33:30,720 >> حتى أذهب إلى الباحث عن وأستطيع أن أمضي لا، الاتصال بخادم، 410 00:33:30,720 --> 00:33:36,950 وخادم I الاتصال به هو جهاز الكمبيوتر، ومن ثم I فتح PDF 411 00:33:36,950 --> 00:33:40,190 يحصل ذلك عن طريق تجميع اللثي. 412 00:33:40,190 --> 00:33:49,320 ولكن تم الحصول على بالاحباط لأنني في كل مرة كنت بحاجة لتحديث PDF، 413 00:33:49,320 --> 00:33:53,900 كان لي لنسخه إلى دليل محدد أن يمكن الوصول 414 00:33:53,900 --> 00:33:57,710 وكان من الحصول على مزعج. 415 00:33:57,710 --> 00:34:02,650 لذلك كتب بدلا I ملف تكوين، التي لديك لتحديد كيف يجعل الامور. 416 00:34:02,650 --> 00:34:06,130 كيف تقوم بها في هذا اللثي PDF. 417 00:34:06,130 --> 00:34:10,090 تماما مثل أي ملف تكوين أخرى - أو اعتقد انك لم أر جعل الملفات، 418 00:34:10,090 --> 00:34:13,510 ولكن لدينا في ملف تكوين الأجهزة العالمية التي تقول فقط، 419 00:34:13,510 --> 00:34:16,679 إذا كنت تجميع ملف C، استخدم ضجيج. 420 00:34:16,679 --> 00:34:20,960 وحتى هنا في ملف جعل بلدي أن أجعل أقول، 421 00:34:20,960 --> 00:34:25,020 هذا الملف كنت تريد الذهاب الى ترجمة مع اللثي PDF. 422 00:34:25,020 --> 00:34:27,889 ولذا فمن اللثي PDF الذي يفعل في تجميع. 423 00:34:27,889 --> 00:34:31,880 لا تجعل تجميع. انها تعمل فقط هذه الأوامر في تسلسل I المحدد. 424 00:34:31,880 --> 00:34:36,110 نسخه بحيث يتم تشغيله PDF اللثي، إلى الدليل أريد أن أكون نسخه إلى، 425 00:34:36,110 --> 00:34:38,270 من مؤتمر نزع السلاح إلى الدليل ويفعل أشياء أخرى، 426 00:34:38,270 --> 00:34:42,380 ولكن كل ما يفعله هو الاعتراف عند تحول الملف، 427 00:34:42,380 --> 00:34:45,489 وإذا كان تغيير، ثم أنه سيتم تشغيل الأوامر التي من المفترض أن تعمل 428 00:34:45,489 --> 00:34:48,760 عندما يتغير الملف. >> [طالب] حسنا. 429 00:34:50,510 --> 00:34:54,420 أنا لا أعرف من أين جعل الملفات العالمية هي بالنسبة لي للتحقق من ذلك. 430 00:34:57,210 --> 00:35:04,290 أسئلة أخرى؟ أي شيء من الماضي مسابقات؟ أي أشياء المؤشر؟ 431 00:35:06,200 --> 00:35:08,730 هناك أشياء خفية مع مؤشرات مثل - 432 00:35:08,730 --> 00:35:10,220 أنا لن تكون قادرة على العثور على سؤال مسابقة على ذلك - 433 00:35:10,220 --> 00:35:16,250 ولكن تماما مثل هذا النوع من الاشياء. 434 00:35:19,680 --> 00:35:24,060 تأكد من أنك تفهم أنه عندما أقول الباحث * X * Y - 435 00:35:24,890 --> 00:35:28,130 هذه ليست بالضبط أي شيء هنا، وأنا أعتقد. 436 00:35:28,130 --> 00:35:32,140 * ولكن مثل X * Y، تلك هي 2 المتغيرات التي هي على المكدس. 437 00:35:32,140 --> 00:35:37,220 عندما أقول س = malloc (sizeof (الباحث))، لا يزال X متغير في بنية تخزين العناصر، 438 00:35:37,220 --> 00:35:41,180 malloc هو أكثر من بعض كتلة في الكومة، ونحن لها X أشر إلى الكومة. 439 00:35:41,180 --> 00:35:43,900 >> ذلك شيء على النقاط كومة إلى كومة. 440 00:35:43,900 --> 00:35:48,100 كلما malloc أي شيء، وأنت حتما تخزين ذلك من داخل المؤشر. 441 00:35:48,100 --> 00:35:55,940 بحيث المؤشر على المكدس، هو كتلة malloced على الكومة. 442 00:35:55,940 --> 00:36:01,240 وهناك الكثير من الناس الحصول على الخلط ويقول الباحث * س = malloc؛ x هو على كومة. 443 00:36:01,240 --> 00:36:04,100 رقم يشير إلى ما هو X على الكومة. 444 00:36:04,100 --> 00:36:08,540 X نفسه على المكدس، لأي سبب من الأسباب إلا إذا كنت قد يكون X متغير عمومي، 445 00:36:08,540 --> 00:36:11,960 وفي هذه الحالة يحدث أن تكون في منطقة أخرى من الذاكرة. 446 00:36:13,450 --> 00:36:20,820 حتى تتبع هذه المخططات مربع والسهم شائعة جدا لهذه المسابقة. 447 00:36:20,820 --> 00:36:25,740 أو إذا لم يكن في مسابقة 0، سوف يكون على الاختبار 1. 448 00:36:27,570 --> 00:36:31,940 يجب أن نعرف كل هذه الخطوات في تجميع 449 00:36:31,940 --> 00:36:35,740 منذ كان لديك للإجابة على الأسئلة على تلك. نعم. 450 00:36:35,740 --> 00:36:38,940 [طالب] هل يمكن أن نذهب أكثر من تلك الخطوات - بالتأكيد >>. 451 00:36:48,340 --> 00:36:58,640 قبل الخطوات وتجميع لدينا تجهيزها، 452 00:36:58,640 --> 00:37:16,750 تجميع، تجميع، وربط. 453 00:37:16,750 --> 00:37:21,480 تجهيزها. ماذا تفعل ذلك؟ 454 00:37:29,720 --> 00:37:32,290 هو أسهل خطوة في - حسنا، ليس مثل - 455 00:37:32,290 --> 00:37:35,770 هذا لا يعني أنه ينبغي أن يكون واضحا، ولكن من أسهل خطوة. 456 00:37:35,770 --> 00:37:38,410 يمكن يا رفاق تنفيذه أنفسكم. نعم. 457 00:37:38,410 --> 00:37:43,410 [طالب] خذ ما لديك في الخاص بك يتضمن مثل هذا وينسخ ومن ثم يعرف أيضا. 458 00:37:43,410 --> 00:37:49,250 فإنه يبحث عن أشياء مثل تضمين # # تعريف و، 459 00:37:49,250 --> 00:37:53,800 وأنها مجرد نسخ ولصق ما هي تلك تعني في الواقع. 460 00:37:53,800 --> 00:37:59,240 حتى عندما تقول تشمل # cs50.h، وقبل المعالج والنسخ واللصق cs50.h 461 00:37:59,240 --> 00:38:01,030 في هذا الخط. 462 00:38:01,030 --> 00:38:06,640 عندما تقول # تعريف X ليكون 4، وقبل المعالج يمر البرنامج بالكامل 463 00:38:06,640 --> 00:38:10,400 ويحل محل كافة مثيلات X مع 4. 464 00:38:10,400 --> 00:38:17,530 وبالتالي فإن المعالج يأخذ ملف C صالح وإخراج ملف C صالح 465 00:38:17,530 --> 00:38:20,300 حيث تم نسخ ولصق الأشياء. 466 00:38:20,300 --> 00:38:24,230 حتى الآن تجميع. ماذا تفعل ذلك؟ 467 00:38:25,940 --> 00:38:28,210 [طالب] وغني من C إلى ثنائي. 468 00:38:28,210 --> 00:38:30,970 >> [بودين] لا يذهب كل في طريقه إلى ثنائي. 469 00:38:30,970 --> 00:38:34,220 [طالب] إلى رمز الجهاز بعد ذلك؟ انها ليست >> رمز الجهاز. 470 00:38:34,220 --> 00:38:35,700 [طالب] الجمعية؟ الجمعية >>. 471 00:38:35,700 --> 00:38:38,890 فإنه يذهب إلى الجمعية قبل أن يذهب كل في طريقه إلى رمز C، 472 00:38:38,890 --> 00:38:45,010 ومعظم اللغات تفعل شيئا مثل هذا. 473 00:38:47,740 --> 00:38:50,590 اختيار أي لغة عالية المستوى، وإذا كنت تريد الذهاب لترجمة عليه 474 00:38:50,590 --> 00:38:52,390 فمن المحتمل أن يجمع في الخطوات التالية. 475 00:38:52,390 --> 00:38:58,140 لأول مرة يجري تجميع بايثون لC، ثم انه سيكون لتجميع C إلى الجمعية، 476 00:38:58,140 --> 00:39:01,600 ومن ثم يجري الجمعية للحصول على ترجمة إلى ثنائي. 477 00:39:01,600 --> 00:39:07,800 لذلك يجري تجميع لتبرز من C إلى الجمعية. 478 00:39:07,800 --> 00:39:12,130 الكلمة تجميع يعني عادة إعادته من مستوى أعلى 479 00:39:12,130 --> 00:39:14,340 إلى لغة البرمجة مستوى أقل. 480 00:39:14,340 --> 00:39:19,190 لذلك هذا هو الخطوة الوحيدة في تجميع حيث تبدأ مع لغة عالية المستوى 481 00:39:19,190 --> 00:39:23,270 وينتهي بهم الأمر في لغة منخفضة المستوى، وهذا هو السبب في ما يسمى الخطوة تجميع. 482 00:39:25,280 --> 00:39:33,370 [طالب] خلال تجميع، دعنا نقول أن كنت قد فعلت # تشمل cs50.h. 483 00:39:33,370 --> 00:39:42,190 ستقوم إعادة ترجمة المترجم cs50.h، مثل الوظائف التي هي في هناك، 484 00:39:42,190 --> 00:39:45,280 وترجمة ذلك إلى رمز الجمعية أيضا، 485 00:39:45,280 --> 00:39:50,830 أو أنه سوف نسخ ولصق شيء وهذا ما كان قبل الجمعية؟ 486 00:39:50,830 --> 00:39:56,910 سوف cs50.h أبدا الى حد كبير في نهاية المطاف في الجمعية. 487 00:39:59,740 --> 00:40:03,680 أشياء مثل نماذج وظيفة والأمور لمجرد أنك لتوخي الحذر. 488 00:40:03,680 --> 00:40:09,270 كما أنه يضمن المترجم يمكن أن تحقق أشياء مثل كنت استدعاء دالات 489 00:40:09,270 --> 00:40:12,910 مع عودة الحق وأنواع الحجج الحق والاشياء. 490 00:40:12,910 --> 00:40:18,350 >> لذلك سيتم preprocessed cs50.h في الملف، ومن ثم عندما يكون تجميع 491 00:40:18,350 --> 00:40:22,310 انها القيت في الأساس بعيدا بعد أن يتأكد أن يتم استدعاء كل شيء بشكل صحيح. 492 00:40:22,310 --> 00:40:29,410 ولكن للمهام المحددة في مكتبة CS50، والتي هي منفصلة عن cs50.h، 493 00:40:29,410 --> 00:40:33,610 لن يتم تجميع تلك على حدة. 494 00:40:33,610 --> 00:40:37,270 التي سوف تأتي في الواقع إلى أسفل في الخطوة ربط، وهكذا لن نصل إلى أنه في الثانية. 495 00:40:37,270 --> 00:40:40,100 ولكن أولا، ما هو تجميع؟ 496 00:40:41,850 --> 00:40:44,500 [طالب] الجمعية إلى ثنائي؟ نعم >>. 497 00:40:46,300 --> 00:40:48,190 تجميع. 498 00:40:48,190 --> 00:40:54,710 نحن لا نسميها تجميع لأن الجمعية هو الى حد كبير الترجمة نقية من ثنائي. 499 00:40:54,710 --> 00:41:00,230 هناك القليل جدا من المنطق في الذهاب إلى ثنائي من الجمعية. 500 00:41:00,230 --> 00:41:03,180 انها مجرد مثل يبحث حتى في جدول، أوه، لدينا هذه التعليمات؛ 501 00:41:03,180 --> 00:41:06,290 الذي يتوافق مع ثنائي 01110. 502 00:41:10,200 --> 00:41:15,230 وبالتالي فإن تجميع الملفات التي عادة النواتج. الملفات س. 503 00:41:15,230 --> 00:41:19,020 و. الملفات يا هي ما كنا نقول من قبل، 504 00:41:19,020 --> 00:41:21,570 كيف يمكن لملف لا يحتاج إلى وظيفة الرئيسي. 505 00:41:21,570 --> 00:41:27,640 ويمكن تجميع أي ملف الى ملف س. طالما انها ملف C صالح. 506 00:41:27,640 --> 00:41:30,300 يمكن جمعه من أسفل إلى. س. 507 00:41:30,300 --> 00:41:43,030 الآن، وربط الواقع هو ما يجلب مجموعة من ملفات الإخراج ويجلب لهم لللتنفيذ. 508 00:41:43,030 --> 00:41:51,110 وهكذا ما يفعله هو ربط يمكن ان يخطر لك مكتبة CS50 كملف س. 509 00:41:51,110 --> 00:41:56,980 وهو ملف ثنائي جمعت بالفعل. 510 00:41:56,980 --> 00:42:03,530 وذلك عند ترجمة الملف الخاص بك، hello.c الخاص بك، والذي يدعو GetString، 511 00:42:03,530 --> 00:42:06,360 يحصل المترجمة hello.c وصولا الى hello.o، 512 00:42:06,360 --> 00:42:08,910 hello.o الآن في ثنائي. 513 00:42:08,910 --> 00:42:12,830 ويستخدم GetString، لذلك يحتاج للذهاب الى cs50.o، 514 00:42:12,830 --> 00:42:16,390 ورابط smooshes بعضهم البعض، ونسخ هذا الملف إلى GetString 515 00:42:16,390 --> 00:42:20,640 ويخرج مع ملف قابل للتنفيذ الذي يحتوي على كافة الوظائف التي تحتاجها. 516 00:42:20,640 --> 00:42:32,620 لذلك ليست في الواقع cs50.o ملف O، لكنه قريب بما يكفي أنه لا يوجد اختلاف جوهري. 517 00:42:32,620 --> 00:42:36,880 لذلك ربط فقط يجلب مجموعة من الملفات معا 518 00:42:36,880 --> 00:42:41,390 التي تحتوي على حدة كل وظائف ولست بحاجة لاستخدام 519 00:42:41,390 --> 00:42:46,120 ويخلق القابل للتنفيذ الذي سيقوم بتشغيل الواقع. 520 00:42:48,420 --> 00:42:50,780 >> وحتى هذا أيضا ما كنا نقول قبل 521 00:42:50,780 --> 00:42:55,970 حيث يمكن أن يكون 1000. ج الملفات، يمكنك ترجمة كل منهم لملفات الإخراج، 522 00:42:55,970 --> 00:43:00,040 الذي قد يستغرق بعض الوقت، ثم قمت بتغيير 1. ج الملف. 523 00:43:00,040 --> 00:43:05,480 تحتاج فقط إلى إعادة ترجمة هذا الملف ج 1. ومن ثم إعادة ربط كل شيء آخر، 524 00:43:05,480 --> 00:43:07,690 ربط كل شيء معا مرة أخرى. 525 00:43:09,580 --> 00:43:11,430 [طالب] عندما نحن نكتب ربط lcs50؟ 526 00:43:11,430 --> 00:43:20,510 نعم، ما lcs50. أن الإشارات إلى العلم رابط التي يجب أن تكون في ربط تلك المكتبة. 527 00:43:26,680 --> 00:43:28,910 الأسئلة؟ 528 00:43:41,310 --> 00:43:46,860 وقد ذهب أكثر من أننا ثنائي غير أن 5 ثوان في المحاضرة الأولى؟ 529 00:43:50,130 --> 00:43:53,010 لا اعتقد هذا. 530 00:43:55,530 --> 00:43:58,820 يجب أن نعرف كل من نظام التشغيل الكبيرة التي خضنا في، 531 00:43:58,820 --> 00:44:02,670 ويجب أن تكون قادرة على ذلك، إذا أعطينا لك وظيفة، 532 00:44:02,670 --> 00:44:09,410 يجب أن تكون قادرة على القول انها كبيرة O، تقريبا. أو حسنا، يا كبير هو الخام. 533 00:44:09,410 --> 00:44:15,300 إذا كان الأمر كذلك انظر متداخلة الحلقات لكم على حلقات أكثر من نفس العدد من الأشياء، 534 00:44:15,300 --> 00:44:22,260 مثل كثافة العمليات ط، ط <ن؛ كثافة العمليات ياء، ي <ن - >> [طالب] ن المربعة. >> فإنه يميل إلى أن يكون غير المربعة. 535 00:44:22,260 --> 00:44:25,280 إذا كان لديك تداخل الثلاثي، فإنه يميل إلى أن يكون ن مكعبة. 536 00:44:25,280 --> 00:44:29,330 لذلك هذا النوع من الاشياء يجب أن تكون قادرة على الإشارة على الفور. 537 00:44:29,330 --> 00:44:33,890 عليك أن تعرف نوع ونوع الإدراج فقاعة نوع ودمج وكل هؤلاء جميعا. 538 00:44:33,890 --> 00:44:41,420 فإنه من السهل أن نفهم لماذا هم أولئك ن ن والمربعة وسجل ن كل ذلك 539 00:44:41,420 --> 00:44:47,810 لأنني أعتقد أن هناك كان على سنة واحدة حيث مسابقة أعطينا أساسا كنت 540 00:44:47,810 --> 00:44:55,050 وقال تنفيذا لنوع فقاعة و، "ما هو الوقت المناسب لتشغيل هذه الوظيفة؟" 541 00:44:55,050 --> 00:45:01,020 حتى إذا كنت تعترف بأنها نوع فقاعة، ثم يمكنك أن تقول على الفور ن المربعة. 542 00:45:01,020 --> 00:45:05,470 ولكن إذا كنت مجرد إلقاء نظرة على ذلك، لا تحتاج حتى إلى تحقيق نوع انها فقاعة؛ 543 00:45:05,470 --> 00:45:08,990 يمكنك فقط أن أقول هذا وفعل هذا وهذا. هذا هو ن مربع. 544 00:45:12,350 --> 00:45:14,710 [طالب] هل هناك أي أمثلة صعبة يمكنك الخروج مع، 545 00:45:14,710 --> 00:45:20,370 مثل فكرة مماثلة من معرفة؟ 546 00:45:20,370 --> 00:45:24,450 >> لا أعتقد أننا سوف يعطي لك أي أمثلة صعبة. 547 00:45:24,450 --> 00:45:30,180 الشيء نوع فقاعة على وشك صعبة كما كنا نذهب، 548 00:45:30,180 --> 00:45:36,280 وحتى ذلك، طالما أن نفهم أن كنت بالتكرار عبر مجموعة 549 00:45:36,280 --> 00:45:41,670 لكل عنصر في الصفيف، والتي ستكون شيء أن يكون ن المربعة. 550 00:45:45,370 --> 00:45:49,940 هناك أسئلة عامة، مثل الحق هنا لدينا - أوه. 551 00:45:55,290 --> 00:45:58,530 فقط في اليوم الآخر، وادعى دوغ، "قد اخترع I خوارزمية يمكن فرز مجموعة 552 00:45:58,530 --> 00:46:01,780 "من الأرقام n في O (سجل ن) الوقت!" 553 00:46:01,780 --> 00:46:04,900 فكيف لنا أن نعرف أن من المستحيل؟ 554 00:46:04,900 --> 00:46:08,850 [رد الطالب غير مسموع] >> نعم. 555 00:46:08,850 --> 00:46:13,710 على أقل تقدير، لديك لمسة كل عنصر في صفيف، 556 00:46:13,710 --> 00:46:16,210 لذلك فمن المستحيل لفرز مجموعة من - 557 00:46:16,210 --> 00:46:20,850 إذا كان كل شيء في محله لم يتم فرزها، ثم كنت على وشك أن لمس كل شيء في الصفيف، 558 00:46:20,850 --> 00:46:25,320 لذلك فمن المستحيل أن تفعل ذلك في أقل من O ن. 559 00:46:27,430 --> 00:46:30,340 [طالب] أظهرت لنا أن المثال يمكنك أن تكون قادرة على القيام بذلك في O ن 560 00:46:30,340 --> 00:46:33,920 إذا كنت تستخدم الكثير من الذاكرة. نعم >>. 561 00:46:33,920 --> 00:46:37,970 وthat's - I ننسى ما that's - هل العد الفرز؟ 562 00:46:47,360 --> 00:46:51,330 هم. هذا هو خوارزمية الفرز صحيح. 563 00:46:59,850 --> 00:47:05,100 كنت أبحث عن اسم خاص لهذا لانني لم أستطع تذكر الاسبوع الماضي. 564 00:47:05,100 --> 00:47:13,000 نعم. هذه هي أنواع من أنواع الأشياء التي يمكن أن تنجز في O كبير من ن. 565 00:47:13,000 --> 00:47:18,430 ولكن هناك قيود، مثل يمكنك استخدام الأعداد الصحيحة فقط حتى عدد معين. 566 00:47:20,870 --> 00:47:24,560 زائد إذا كنت تحاول فرز that's شيء - 567 00:47:24,560 --> 00:47:30,750 إذا كان الصفيف الخاص بك هو 012، -12، 151، 4 ملايين، 568 00:47:30,750 --> 00:47:35,120 ثم أن عنصر واحد هو الذهاب الى الخراب تماما الفرز بأكملها. 569 00:47:42,060 --> 00:47:44,030 >> الأسئلة؟ 570 00:47:49,480 --> 00:47:58,870 [طالب] إذا كان لديك وظيفة العودية ويجعل مجرد دعوات متكررة 571 00:47:58,870 --> 00:48:02,230 ضمن بيان عودة، وهذا الذيل متكررة، 572 00:48:02,230 --> 00:48:07,360 وسوف بحيث لا تستخدم أكثر من الذاكرة أثناء وقت التشغيل 573 00:48:07,360 --> 00:48:12,550 أم أنه على الأقل قابلة للمقارنة واستخدام الذاكرة تكرارية الحل؟ 574 00:48:12,550 --> 00:48:14,530 [بودين] نعم. 575 00:48:14,530 --> 00:48:19,840 فإنه من المرجح أن تكون أبطأ إلى حد ما، ولكن ليس حقا. 576 00:48:19,840 --> 00:48:23,290 الذيل العودية هو جيد جدا. 577 00:48:23,290 --> 00:48:32,640 يبحث مرة أخرى في إطارات المكدس، دعنا نقول لدينا الرئيسي 578 00:48:32,640 --> 00:48:42,920 ونحن لدينا شريط الباحث (الباحث خ) أو شيء من هذا. 579 00:48:42,920 --> 00:48:52,310 هذه ليست وظيفة مثالية متكررة، ولكن شريط عودة (س - 1). 580 00:48:52,310 --> 00:48:57,620 من الواضح جدا، وهذا هو معيب. تحتاج حالات قاعدة والاشياء. 581 00:48:57,620 --> 00:49:00,360 ولكن الفكرة هنا هي أن هذا هو الذيل متكررة، 582 00:49:00,360 --> 00:49:06,020 وهو ما يعني عند حجب المكالمات الرئيسي انه سيكون للحصول على إطاره المكدس. 583 00:49:09,550 --> 00:49:12,440 في هذا الإطار هناك كومة ستكون كتلة صغيرة من الذاكرة 584 00:49:12,440 --> 00:49:17,490 الذي يتوافق مع X حجتها. 585 00:49:17,490 --> 00:49:25,840 ولذلك دعونا نقول الرئيسية يحدث لاستدعاء شريط (100)؛ 586 00:49:25,840 --> 00:49:30,050 حتى X سوف تبدأ على النحو 100. 587 00:49:30,050 --> 00:49:35,660 إذا كان المترجم يعترف بأن هذه هي وظيفة الذيل متكررة، 588 00:49:35,660 --> 00:49:38,540 ثم عندما يجعل شريط دعوتها عودي إلى بار، 589 00:49:38,540 --> 00:49:45,490 بدلا من جعل إطار مكدس الجديد، الذي هو المكان الذي يبدأ كومة المتزايد إلى حد كبير، 590 00:49:45,490 --> 00:49:48,220 في نهاية المطاف سوف تصل الى كومة ثم تحصل segfaults 591 00:49:48,220 --> 00:49:51,590 لأن الذاكرة يبدأ الاصطدام. 592 00:49:51,590 --> 00:49:54,830 >> وذلك بدلا من جعل إطاره كومة الخاصة، يمكن أن ندرك، 593 00:49:54,830 --> 00:49:59,080 مهلا، أنا لا حقا بحاجة إلى العودة إلى هذا الإطار مكدس، 594 00:49:59,080 --> 00:50:08,040 وذلك بدلا سوف تحل محل هذه الحجة فقط مع 99 ثم قم بتشغيل شريط في كل مكان. 595 00:50:08,040 --> 00:50:11,810 وبعد ذلك سوف نفعل ذلك مرة أخرى، وسوف تصل إلى شريط عودة (س - 1)، 596 00:50:11,810 --> 00:50:17,320 وبدلا من جعل إطار مكدس الجديدة، فإنه سيتم استبدال فقط حجتها الحالي مع 98 597 00:50:17,320 --> 00:50:20,740 و من ثم اقفز إلى بداية الشريط. 598 00:50:23,860 --> 00:50:30,430 تلك العمليات، لتحل محل تلك القيمة 1 في كومة والقفز مرة أخرى إلى البداية، 599 00:50:30,430 --> 00:50:32,430 هي فعالة جدا. 600 00:50:32,430 --> 00:50:41,500 لذلك ليس هذا فقط هو استخدام نفس الذاكرة بوصفها وظيفة منفصلة الذي متكررة 601 00:50:41,500 --> 00:50:45,390 لأنك كنت تستخدم فقط 1 الإطار مكدس، ولكن كنت لا تعاني من سلبيات 602 00:50:45,390 --> 00:50:47,240 من الاضطرار إلى استدعاء وظائف. 603 00:50:47,240 --> 00:50:50,240 يمكن استدعاء وظائف تكون مكلفة بعض الشيء لأنه له علاقة كل هذا الإعداد 604 00:50:50,240 --> 00:50:52,470 و tearDown وجميع هذه الأشياء. 605 00:50:52,470 --> 00:50:58,160 لذلك هذا العودية ذيل جيدة. 606 00:50:58,160 --> 00:51:01,170 [طالب] لماذا لم يخلق خطوات جديدة؟ 607 00:51:01,170 --> 00:51:02,980 لأنه يدرك أنه لا حاجة إليها. 608 00:51:02,980 --> 00:51:07,800 الدعوة إلى شريط يعود فقط الدعوة العودية. 609 00:51:07,800 --> 00:51:12,220 لذلك لا تحتاج إلى القيام بأي شيء مع قيمة الإرجاع. 610 00:51:12,220 --> 00:51:15,120 انها مجرد الذهاب الى العودة فورا. 611 00:51:15,120 --> 00:51:20,530 لذلك يحدث فقط ليحل محل الحجة الخاصة به والبدء من جديد. 612 00:51:20,530 --> 00:51:25,780 وأيضا، إذا لم يكن لديك الإصدار الذيل متكررة، 613 00:51:25,780 --> 00:51:31,460 ثم تحصل على كل هذه القضبان حيث عندما يعود هذا الشريط 614 00:51:31,460 --> 00:51:36,010 عليه أن يعود إلى قيمته هذا واحد، ثم أن شريط بإرجاع مباشرة 615 00:51:36,010 --> 00:51:39,620 وتقوم بإرجاع القيمة الخاصة به إلى هذا واحد، ثم انها مجرد الذهاب الى العودة فورا 616 00:51:39,620 --> 00:51:41,350 والعودة قيمته إلى هذا واحد. 617 00:51:41,350 --> 00:51:45,350 لذلك كنت تقوم بحفظ هذا ظهرت كل هذه الأمور الخروج من كومة 618 00:51:45,350 --> 00:51:48,730 منذ قيمة الإرجاع هو مجرد الذهاب لتمريرها كل في طريق العودة على أي حال. 619 00:51:48,730 --> 00:51:55,400 فلماذا لا تحل محل فقط وجهة نظرنا مع حجة تحديث والبدء من جديد؟ 620 00:51:57,460 --> 00:52:01,150 إذا كانت وظيفة ليست متكررة الذيل، إذا كنت تفعل شيئا مثل - 621 00:52:01,150 --> 00:52:07,530 [طالب] إذا بار (X + 1). نعم >>. 622 00:52:07,530 --> 00:52:11,770 >> إذا كان الأمر كذلك كنت وضعت في حالة، ثم كنت تفعل شيئا مع قيمة الإرجاع. 623 00:52:11,770 --> 00:52:16,260 أو حتى إذا كنت تفعل ذلك تماما العودة 2 * شريط (س - 1). 624 00:52:16,260 --> 00:52:23,560 حتى الآن شريط (س - 1) يحتاج للعودة من اجل ان لحساب تلك القيمة 2 مرات، 625 00:52:23,560 --> 00:52:26,140 حتى الآن لا تحتاج الخاصة الإطار كومة منفصلة، 626 00:52:26,140 --> 00:52:31,180 والآن، مهما كان صعبا وحاولت، وكنت بحاجة الى الذهاب الى - 627 00:52:31,180 --> 00:52:34,410 هذا ليس الذيل العودية. 628 00:52:34,410 --> 00:52:37,590 [طالب] هل أحاول جلب العودية لهدف لالعودية ذيل - 629 00:52:37,590 --> 00:52:41,450 [بودين] في عالم مثالي، ولكن في CS50 لم يكن لديك ل. 630 00:52:43,780 --> 00:52:49,280 من أجل الحصول على العودية الذيل، عموما، تقوم بإعداد وسيطة إضافية 631 00:52:49,280 --> 00:52:53,550 حيث ستمنع اتخاذ X Y الباحث في 632 00:52:53,550 --> 00:52:56,990 و y يقابل الشيء في نهاية المطاف تريد العودة. 633 00:52:56,990 --> 00:53:03,650 لذلك فإن هذا كنت على وشك أن يعود شريط (س - 1)، 2 * ذ. 634 00:53:03,650 --> 00:53:09,810 بحيث مجرد رفيع المستوى كيف تحول الأشياء أن يكون الذيل العودية. 635 00:53:09,810 --> 00:53:13,790 لكن حجة اضافية - 636 00:53:13,790 --> 00:53:17,410 ثم في النهاية عندما تصل قضيتك قاعدة، يمكنك العودة فقط Y 637 00:53:17,410 --> 00:53:22,740 لأن كنت قد تم تجميع طوال الوقت قيمة الإرجاع الذي تريده. 638 00:53:22,740 --> 00:53:27,280 كنت قد فعل ذلك النوع من تكراري ولكن باستخدام المكالمات العودية. 639 00:53:32,510 --> 00:53:34,900 الأسئلة؟ 640 00:53:34,900 --> 00:53:39,890 [طالب] ربما عن الحساب المؤشر، مثل عند استخدام السلاسل. بالتأكيد >>. 641 00:53:39,890 --> 00:53:43,610 مؤشر الحساب. 642 00:53:43,610 --> 00:53:48,440 عند استخدام السلاسل لأنه من السهل سلاسل من النجوم شار، 643 00:53:48,440 --> 00:53:51,860 حرف إلى الأبد ودائما بايت واحد، 644 00:53:51,860 --> 00:53:57,540 وذلك مؤشر الحساب ما يعادل الحسابية العادية عندما كنت تتعامل مع السلاسل. 645 00:53:57,540 --> 00:54:08,790 دعنا نقول فقط شار * S = "مرحبا". 646 00:54:08,790 --> 00:54:11,430 لذلك لدينا كتلة في الذاكرة. 647 00:54:19,490 --> 00:54:22,380 انها تحتاج 6 بايت لأنك بحاجة دائما فاصل فارغة. 648 00:54:22,380 --> 00:54:28,620 وشار * S يجري للإشارة إلى بداية هذه المجموعة. 649 00:54:28,620 --> 00:54:32,830 ق ذلك يشير هناك. 650 00:54:32,830 --> 00:54:36,710 الآن، وهذا هو في الأساس كيف يمكن لأي مجموعة تعمل، 651 00:54:36,710 --> 00:54:40,780 بغض النظر عما إذا كان عائدا من malloc أو سواء كان ذلك على المكدس. 652 00:54:40,780 --> 00:54:47,110 أي مجموعة هو في الأساس المؤشر إلى بداية مجموعة، 653 00:54:47,110 --> 00:54:53,640 ثم أي عملية الصفيف، أي الفهرسة، هو مجرد الذهاب الى أن مجموعة معينة الإزاحة. 654 00:54:53,640 --> 00:55:05,360 >> لذلك عندما أقول شيء من هذا القبيل ليالي [3]، وهذا هو الذهاب الى ليالي والعد 3 حرف فيه. 655 00:55:05,360 --> 00:55:12,490 ق ذلك [3]، لدينا 0، 1، 2، 3، لذا هي [3] هو الذهاب للإشارة إلى هذا لتر. 656 00:55:12,490 --> 00:55:20,460 [طالب] ويمكن أن نصل إلى نفس القيمة من خلال العمل + 3 ليالي ومن ثم قوسين النجوم؟ 657 00:55:20,460 --> 00:55:22,570 نعم. 658 00:55:22,570 --> 00:55:26,010 وهذا يعادل * (3 + ق)؛ 659 00:55:26,010 --> 00:55:31,240 وهذا هو إلى الأبد ودائما ما يعادلها بغض النظر عن ما تفعله. 660 00:55:31,240 --> 00:55:34,070 أنت لا تحتاج إلى استخدام بناء الجملة قوس. 661 00:55:34,070 --> 00:55:37,770 يمكنك دائما استخدام * (ق + 3) في بناء الجملة. 662 00:55:37,770 --> 00:55:40,180 يميل الناس الى مثل قوس بناء الجملة، وإن كان. 663 00:55:40,180 --> 00:55:43,860 [طالب] لذلك كل المصفوفات هي في الواقع مجرد مؤشرات. 664 00:55:43,860 --> 00:55:53,630 هناك فرق طفيف عندما أقول الباحث X [4]؛ >> [طالب] هل خلق أن الذاكرة؟ 665 00:55:53,630 --> 00:56:03,320 [بودين] وهذا هو الذهاب الى إنشاء 4 رجات على المكدس، لذلك العام 16 بايت. 666 00:56:03,320 --> 00:56:05,700 انه سيكون لإنشاء 16 بايت على المكدس. 667 00:56:05,700 --> 00:56:09,190 لا يتم تخزين X في أي مكان. 668 00:56:09,190 --> 00:56:13,420 انها مجرد رمز يشير إلى بداية شيء. 669 00:56:13,420 --> 00:56:17,680 لأن أعلن لكم مجموعة داخل هذه الوظيفة، 670 00:56:17,680 --> 00:56:22,340 ما هو مترجم بصدد القيام به هو استبدال كافة مثيلات فقط المتغير x 671 00:56:22,340 --> 00:56:26,400 حيث حدث مع اختيار لوضع هذه بايت 16. 672 00:56:26,400 --> 00:56:30,040 فإنه لا يمكن القيام بذلك مع شار * S ليالي هو مؤشر الفعلية. 673 00:56:30,040 --> 00:56:32,380 فهو حر في أن يشير بعد ذلك إلى أمور أخرى. 674 00:56:32,380 --> 00:56:36,140 x هو ثابت. لا يمكنك الحصول عليها أشر إلى مجموعة مختلفة. >> [طالب] حسنا. 675 00:56:36,140 --> 00:56:43,420 ولكن هذه الفكرة، وهذا الفهرسة، هو نفسه بغض النظر عن سواء كان ذلك في مجموعة التقليدية 676 00:56:43,420 --> 00:56:48,230 أو إذا كان مؤشر إلى شيء أو إذا كان مؤشر إلى مجموعة malloced. 677 00:56:48,230 --> 00:56:59,770 في واقع الأمر، فإنه ما يعادل ذلك أن هذا هو أيضا نفس الشيء. 678 00:56:59,770 --> 00:57:05,440 تبقى عليه في الواقع يترجم فقط ما هو داخل الأقواس وماذا عن أقواس، 679 00:57:05,440 --> 00:57:07,970 يضيف بعضهم البعض، وdereferences. 680 00:57:07,970 --> 00:57:14,710 لذلك هذا هو صحيحة تماما كما * (ق + 3) أو S [3]. 681 00:57:16,210 --> 00:57:22,090 [طالب] هل لديك مؤشرات مشيرا إلى 2 الأبعاد صفائف؟ 682 00:57:22,090 --> 00:57:27,380 >> انها أكثر صعوبة. تقليديا، لا. 683 00:57:27,380 --> 00:57:34,720 A مجموعة 2-الأبعاد هو مجرد مجموعة 1-الأبعاد مع بعض بناء الجملة مريحة 684 00:57:34,720 --> 00:57:54,110 لأنه عندما أقول الباحث العاشر [3] [3]، وهذا هو حقا فقط 1 مع 9 مجموعة القيم. 685 00:57:55,500 --> 00:58:03,000 وحتى عندما مؤشر، المترجم يعرف ما أعنيه. 686 00:58:03,000 --> 00:58:13,090 إذا قلت x [1] [2]، فهو يعرف أريد أن أذهب إلى الصف الثاني، لذلك سيكون لتخطي ال 3 الأولى، 687 00:58:13,090 --> 00:58:17,460 وبعد ذلك يريد الشيء الثاني في هذا، لذلك سيكون للحصول على هذا واحد. 688 00:58:17,460 --> 00:58:20,480 لكنه لا يزال مجرد مجموعة واحدة الأبعاد. 689 00:58:20,480 --> 00:58:23,660 وحتى إذا أردت أن تعيين مؤشر إلى أن مجموعة، 690 00:58:23,660 --> 00:58:29,770 وأود أن أقول الباحث * ص = س؛ 691 00:58:29,770 --> 00:58:33,220 نوع x هو فقط - 692 00:58:33,220 --> 00:58:38,280 انها نوع الخام قول X لأنه هو مجرد رمز وليس متغير الفعلية، 693 00:58:38,280 --> 00:58:40,140 ولكنه هو مجرد * INT. 694 00:58:40,140 --> 00:58:44,840 x هو مجرد مؤشر إلى بداية هذا. >> [طالب] حسنا. 695 00:58:44,840 --> 00:58:52,560 ولذا فإنني لن تكون قادرة على الوصول [1] [2]. 696 00:58:52,560 --> 00:58:58,370 أعتقد أن هناك بناء جملة خاص للاعلان المؤشر، 697 00:58:58,370 --> 00:59:12,480 شيء سخيف مثل الباحث (* ص [-. شيء مثير للسخرية تماما أنا لا أعرف حتى. 698 00:59:12,480 --> 00:59:17,090 ولكن هناك جملة مؤشرات لإعلان مثل الأقواس ومع الأشياء. 699 00:59:17,090 --> 00:59:22,960 قد لا تسمح لك حتى تفعل ذلك. 700 00:59:22,960 --> 00:59:26,640 ويمكنني أن ننظر إلى الوراء في شيء من شأنه أن تقول لي الحقيقة. 701 00:59:26,640 --> 00:59:34,160 وسوف نبحث عن ذلك في وقت لاحق، إذا كان هناك بناء الجملة من أجل نقطة. ولكن سوف ترى ذلك أبدا. 702 00:59:34,160 --> 00:59:39,670 وحتى بناء الجملة القديمة بحيث إذا كنت تريد استخدامه، وسيتم حيرة الناس. 703 00:59:39,670 --> 00:59:43,540 صفائف متعددة الأبعاد نادرة جدا كما هو. 704 00:59:43,540 --> 00:59:44,630 كنت الى حد كبير - 705 00:59:44,630 --> 00:59:48,490 حسنا، إذا كنت تفعل الأشياء مصفوفة انها لن تكون نادرة، 706 00:59:48,490 --> 00:59:56,730 ولكن في C وأنت تسير نادرا ما تستخدم المصفوفات متعددة الأبعاد. 707 00:59:57,630 --> 01:00:00,470 نعم. >> [طالب] دعونا نقول لديك مجموعة وطويلة حقا. 708 01:00:00,470 --> 01:00:03,900 >> حتى في الذاكرة الظاهرية على ما يبدو أن يكون كل على التوالي، 709 01:00:03,900 --> 01:00:05,640 مثل العناصر بجوار بعضها البعض، 710 01:00:05,640 --> 01:00:08,770 ولكن في الذاكرة الفعلية، هل من الممكن لهذا أن تقسيم؟ نعم >>. 711 01:00:08,770 --> 01:00:16,860 كيف يعمل الذاكرة الظاهرية أنه يفصل فقط - 712 01:00:19,220 --> 01:00:24,860 تخصيص وحدة عبارة عن صفحة، والذي يميل إلى أن يكون 4 كيلو بايت، 713 01:00:24,860 --> 01:00:29,680 وذلك عندما يقول عملية، مهلا، أريد استخدام هذه الذاكرة، 714 01:00:29,680 --> 01:00:35,970 نظام التشغيل هو الذهاب الى تحيله 4 كيلو بايت للكتلة التي القليل من الذاكرة. 715 01:00:35,970 --> 01:00:39,100 حتى إذا كنت تستخدم فقط بايت واحد يذكر في كتلة كاملة من الذاكرة، 716 01:00:39,100 --> 01:00:42,850 نظام التشغيل هو الذهاب الى اعطائها كامل 4 كيلو بايت. 717 01:00:42,850 --> 01:00:49,410 وذلك ما يعنيه هذا هو أن لدي - دعنا نقول هذا هو مكدس بلدي. 718 01:00:49,410 --> 01:00:53,180 يمكن فصل هذا المكدس. يمكن أن يكون بلدي كومة ميغا بايت وميغابايت. 719 01:00:53,180 --> 01:00:55,020 يمكن أن يكون بلدي كومة ضخمة. 720 01:00:55,020 --> 01:01:00,220 لكن المكدس نفسه لابد من تقسيمها إلى صفحات فردية، 721 01:01:00,220 --> 01:01:09,010 التي إذا نظرنا إلى أكثر من هنا دعونا نقول أن هذا RAM لدينا، 722 01:01:09,010 --> 01:01:16,600 إذا كان لدي 2 غيغا بايت من ذاكرة الوصول العشوائي، وهذا هو 0 العنوان الفعلي البايت مثل 0 من ذاكرة الوصول العشوائي بلدي، 723 01:01:16,600 --> 01:01:22,210 وهذا هو 2 غيغابايت على طول الطريق هنا. 724 01:01:22,210 --> 01:01:27,230 لذلك قد تتوافق هذه الصفحة إلى هذه الكتلة أكثر من هنا. 725 01:01:27,230 --> 01:01:29,400 هذه الصفحة قد تتوافق مع هذه الكتلة أكثر من هنا. 726 01:01:29,400 --> 01:01:31,560 هذا واحد قد تتوافق مع هذا واحد أكثر من هنا. 727 01:01:31,560 --> 01:01:35,540 وبالتالي فإن نظام التشغيل لتعيين مجانا الذاكرة الفعلية 728 01:01:35,540 --> 01:01:39,320 إلى أي صفحة فردية تعسفية. 729 01:01:39,320 --> 01:01:46,180 وهذا يعني أنه إذا كان هذا يحدث لتمتد الحدود صفيف، 730 01:01:46,180 --> 01:01:50,070 مجموعة يحدث أن تترك هذا الحق وهذا أمر من الصفحة، 731 01:01:50,070 --> 01:01:54,460 ثم أن مجموعة سوف يتم تقسيم في الذاكرة الفعلية. 732 01:01:54,460 --> 01:01:59,280 وبعد ذلك عندما كنت إنهاء البرنامج، عندما تنتهي العملية، 733 01:01:59,280 --> 01:02:05,690 هذه تعيينات الحصول على محوها وثم انها حرة في استخدام هذه الكتل قليلا لأمور أخرى. 734 01:02:14,730 --> 01:02:17,410 المزيد من الأسئلة؟ 735 01:02:17,410 --> 01:02:19,960 [طالب] مؤشر الحساب. أوه نعم >>. 736 01:02:19,960 --> 01:02:28,410 كانت السلاسل أسهل، ولكن بالنظر إلى ما يشبه رجات، 737 01:02:28,410 --> 01:02:35,000 العودة إلى ذلك الباحث X [4]؛ 738 01:02:35,000 --> 01:02:41,810 ما إذا كان هذا عبارة عن صفيف أو سواء كان ذلك في مؤشر إلى مجموعة malloced من 4 أعداد صحيحة، 739 01:02:41,810 --> 01:02:47,060 انها تسير في أن يعامل بنفس الطريقة. 740 01:02:50,590 --> 01:02:53,340 [طالب] وهكذا هي صفائف على الكومة؟ 741 01:03:01,400 --> 01:03:05,270 [بودين] ليست صالحة على الكومة. >> [طالب] أوه. 742 01:03:05,270 --> 01:03:08,320 >> [بودين] هذا النوع من مجموعة يميل إلى أن يكون على المكدس 743 01:03:08,320 --> 01:03:12,220 ما لم يعلن لك أنه في - تجاهل المتغيرات العالمية. لا تستخدم المتغيرات العالمية. 744 01:03:12,220 --> 01:03:16,280 وظيفة داخل أقول الباحث X [4]؛ 745 01:03:16,280 --> 01:03:22,520 انه سيكون لإنشاء كتلة 4-صحيحا على المكدس لهذه المجموعة. 746 01:03:22,520 --> 01:03:26,960 ولكن هذا malloc (4 * sizeof (الباحث))؛ ستذهب على الكومة. 747 01:03:26,960 --> 01:03:31,870 ولكن بعد هذه النقطة يمكن استخدام x و p في الطرق الى حد كبير نفس، 748 01:03:31,870 --> 01:03:36,140 غير استثناءات قلت من قبل عن يمكنك إعادة تعيين ف. 749 01:03:36,140 --> 01:03:40,960 من الناحية الفنية وأحجامها تختلف إلى حد ما، ولكن هذا غير ذي صلة تماما. 750 01:03:40,960 --> 01:03:43,310 كنت تستخدم أبدا في الواقع أحجامها. 751 01:03:48,020 --> 01:03:56,810 ع يمكن أن أقول ف [3] = 2، أو X [3] = 2؛ 752 01:03:56,810 --> 01:03:59,680 يمكنك استخدامها بطرق نفسها تماما. 753 01:03:59,680 --> 01:04:01,570 حتى الآن مؤشر الحساب - نعم. 754 01:04:01,570 --> 01:04:07,390 [طالب] هل لم يكن لديك للقيام P * إذا كان لديك الأقواس؟ 755 01:04:07,390 --> 01:04:11,720 الأقواس هي إلغاء مرجعية ضمنية. حسنا >>. 756 01:04:11,720 --> 01:04:20,200 في الواقع، يمكن أيضا ما تقوله مع صفائف متعددة الأبعاد تحصل 757 01:04:20,200 --> 01:05:02,650 مع مؤشرات، ما يمكنك القيام به هو شيء من هذا القبيل، دعنا نقول، وكثافة العمليات ** ص = malloc (sizeof (كثافة العمليات *) * 5)؛ 758 01:05:02,650 --> 01:05:06,900 أنا أكتب كل شيء فقط لأول مرة. 759 01:05:37,880 --> 01:05:41,020 لم أكن أريد أن واحدا. 760 01:05:41,020 --> 01:05:42,550 حسنا. 761 01:05:42,550 --> 01:05:48,910 ما فعلته هنا هو - أن يكون PP [أنا]. 762 01:05:48,910 --> 01:05:53,680 PP ذلك هو مؤشر إلى مؤشر. 763 01:05:53,680 --> 01:06:02,420 كنت mallocing ص للإشارة إلى مجموعة من 5 نجوم الباحث. 764 01:06:02,420 --> 01:06:10,950 حتى في الذاكرة لديك على كومة ص 765 01:06:10,950 --> 01:06:20,150 انه سيكون للإشارة إلى مجموعة من 5 بنات وكلها مؤشرات أنفسهم. 766 01:06:20,150 --> 01:06:28,210 ثم عندما malloc إلى هنا، وأنا malloc أن كل تلك المؤشرات الفردية 767 01:06:28,210 --> 01:06:32,080 يجب أن يشير إلى كتلة منفصلة من 4 بايت على الكومة. 768 01:06:32,080 --> 01:06:35,870 ولذلك فإن هذا يشير إلى 4 بايت. 769 01:06:37,940 --> 01:06:40,660 وهذا نقطة واحدة إلى 4 بايت مختلفة. 770 01:06:40,660 --> 01:06:43,200 >> وجميع من لهم إشارة إلى بايت. 4 الخاصة. 771 01:06:43,200 --> 01:06:49,080 هذا يعطيني وسيلة للقيام بهذه الأمور متعددة الأبعاد. 772 01:06:49,080 --> 01:06:58,030 يمكن أن أقول ص [3] [4]، ولكن الآن هذا ليس نفس الشيء مثل صفائف متعددة الأبعاد 773 01:06:58,030 --> 01:07:05,390 لأن المصفوفات متعددة الأبعاد ترجمته [3] [4] إلى واحدة تعويض في مجموعة س. 774 01:07:05,390 --> 01:07:14,790 هذه الصفحة dereferences، يصل المؤشر الثالث، ثم dereferences أن 775 01:07:14,790 --> 01:07:20,790 والوصول إلى - 4 أن تكون غير صالحة و- المؤشر الثاني. 776 01:07:24,770 --> 01:07:31,430 في حين عندما كان لدينا الباحث العاشر [3] [4] كما كان من قبل مجموعة متعددة الأبعاد 777 01:07:31,430 --> 01:07:35,740 وعند النقر المزدوج قوس انها حقا سوى إلغاء مرجعية واحدة، 778 01:07:35,740 --> 01:07:40,490 كنت بعد مؤشر واحد ومن ثم تعويض ل، 779 01:07:40,490 --> 01:07:42,850 هذا هو حقا مراجع 2D. 780 01:07:42,850 --> 01:07:45,840 2 اتباع مؤشرات منفصلة. 781 01:07:45,840 --> 01:07:50,420 لذلك هذا أيضا يسمح من الناحية الفنية أن يكون لديك صفائف متعددة الأبعاد 782 01:07:50,420 --> 01:07:53,550 حيث كل فرد هو مجموعة أحجام مختلفة. 783 01:07:53,550 --> 01:07:58,000 لذلك أعتقد صفائف متعددة الأبعاد خشنة هو ما يطلق عليه 784 01:07:58,000 --> 01:08:01,870 منذ أول شيء حقا يمكن أن تشير إلى شيء له 10 عناصر، 785 01:08:01,870 --> 01:08:05,540 يمكن الشيء الثاني يشير إلى ما لديها 100 عناصر. 786 01:08:05,540 --> 01:08:10,790 [طالب] هل هناك أي حد لعدد من المؤشرات التي يمكن أن يكون لها 787 01:08:10,790 --> 01:08:14,290 مشيرا إلى مؤشرات أخرى؟ رقم >> 788 01:08:14,290 --> 01:08:17,010 هل يمكن أن يكون الباحث ***** ف. 789 01:08:18,050 --> 01:08:23,760 عودة إلى الحساب المؤشر - >> [طالب] أوه. نعم >>. 790 01:08:23,760 --> 01:08:35,649 [طالب] إذا كان لدي الباحث *** ع ثم أفعل يعتبر إلغاء مرجعية وأنا أقول ف * تساوي هذه القيمة، 791 01:08:35,649 --> 01:08:39,560 الحال الوحيدة للقيام 1 المستوى من يعتبر إلغاء مرجعية؟ نعم >>. 792 01:08:39,560 --> 01:08:43,340 حتى لو كنت تريد الوصول إلى شيء أن المؤشر الأخير يشير في - 793 01:08:43,340 --> 01:08:46,210 ثم لديك ع ***. حسنا >>. 794 01:08:46,210 --> 01:08:54,080 لذلك هذا هو نقطة ص إلى 1 كتلة، كتلة نقطة إلى أخرى، يشير إلى كتلة أخرى. 795 01:08:54,080 --> 01:09:02,010 ثم إذا كنت تفعل * p = شيء آخر، فأنت تتغير هذه 796 01:09:02,010 --> 01:09:13,640 للإشارة الآن إلى كتلة مختلفة. حسنا >>. 797 01:09:13,640 --> 01:09:17,649 >> [بودين] وإذا كانت هذه malloced، ثم كنت قد تسربت الآن الذاكرة 798 01:09:17,649 --> 01:09:20,430 إلا إذا كنت يحدث لديها مراجع مختلفة من هذه 799 01:09:20,430 --> 01:09:25,270 منذ لا يمكنك العودة إلى تلك تلك التي رمى فقط. 800 01:09:25,270 --> 01:09:29,550 مؤشر الحساب. 801 01:09:29,550 --> 01:09:36,310 الباحث X [4]؛ هو الذهاب الى تخصيص مجموعة من 4 أعداد صحيحة 802 01:09:36,310 --> 01:09:40,670 حيث x هو الذهاب للإشارة إلى بداية الصفيف. 803 01:09:40,670 --> 01:09:50,420 لذلك عندما أقول شيء من هذا القبيل [1] X؛ أريد أن يعني الذهاب الى العدد الصحيح الثاني في مجموعة، 804 01:09:50,420 --> 01:09:53,319 التي من شأنها أن تكون هذه واحدة. 805 01:09:53,319 --> 01:10:04,190 ولكن في الحقيقة، وهذا هو 4 بايت في مجموعة وبما أن هذا صحيح يستغرق 4 بايت. 806 01:10:04,190 --> 01:10:08,470 حتى إزاحة من 1 يعني حقا إزاحة من 1 807 01:10:08,470 --> 01:10:12,030 أضعاف حجم مهما كان نوع الصفيف هو. 808 01:10:12,030 --> 01:10:17,170 هذا هو مجموعة من الأعداد الصحيحة، لذلك يعرف أن تفعل 1 مرات حجم الباحث عندما يريد أن يقابل. 809 01:10:17,170 --> 01:10:25,260 بناء الجملة الأخرى. تذكر أن هذا هو ما يعادل * (1 + س)؛ 810 01:10:25,260 --> 01:10:35,250 عندما أقول المؤشر + 1، ما أن يعود هو العنوان الذي يتم تخزين المؤشر 811 01:10:35,250 --> 01:10:40,360 زائد 1 مرات حجم النوع من المؤشر. 812 01:10:40,360 --> 01:10:59,510 إذا كان الأمر كذلك س = ox100، ثم X + 1 = ox104. 813 01:10:59,510 --> 01:11:19,750 ويمكنك تعاطي هذا وتقول شيئا مثل تشار * ج = (تشار *) ×؛ 814 01:11:19,750 --> 01:11:23,050 والآن ج سيكون عنوان نفس X. 815 01:11:23,050 --> 01:11:26,040 ج سوف يكون مساويا لox100، 816 01:11:26,040 --> 01:11:31,490 لكن ج + 1 ستكون مساوية لox101 817 01:11:31,490 --> 01:11:38,030 منذ الحسابية المؤشر يعتمد على نوع المؤشر التي تقوم بإضافتها إلى. 818 01:11:38,030 --> 01:11:45,390 حتى ج + 1، فإنه يبحث في ج، انها مؤشر شار، لذلك سيكون لإضافة 1 مرات حجم شار، 819 01:11:45,390 --> 01:11:48,110 التي دائما ما تكون 1، حتى تحصل على 101، 820 01:11:48,110 --> 01:11:54,890 في حين إذا كنت تفعل العاشر، الذي هو أيضا لا يزال 100، X + 1 ستكون 104. 821 01:11:56,660 --> 01:12:06,340 [طالب] يمكنك استخدام ج + + من أجل المضي قدما المؤشر بنسبة 1؟ 822 01:12:06,340 --> 01:12:09,810 نعم، يمكنك ذلك. 823 01:12:09,810 --> 01:12:16,180 لا يمكنك أن تفعل ذلك مع لX x هو مجرد رمز، بل هو مستمر؛ لا يمكنك تغيير X. 824 01:12:16,180 --> 01:12:22,610 >> ولكن يحدث أن تكون ج مجرد مؤشر، لذلك ج + + هو صحيح تماما، وسوف زيادة بمقدار 1. 825 01:12:22,610 --> 01:12:32,440 إذا كانت مجرد ج * الباحث، ثم ج + + سوف 104. 826 01:12:32,440 --> 01:12:41,250 + + مؤشر الحساب كما يفعل فقط ج + 1 قد فعلت الحساب المؤشر. 827 01:12:43,000 --> 01:12:48,870 هذا هو في الواقع كيف يمكن لكثير من الأشياء مثل نوع الدمج - 828 01:12:49,670 --> 01:12:55,710 بدلا من إنشاء نسخ من الأشياء، يمكنك تمرير بدلا من ذلك - 829 01:12:55,710 --> 01:13:02,400 مثل إذا أردت أن تمرير هذا الصفيف نصف - دعونا محو بعض من هذا. 830 01:13:04,770 --> 01:13:10,520 دعنا نقول أردت أن تمرير هذا الجانب من الصفيف إلى وظيفة. 831 01:13:10,520 --> 01:13:12,700 ماذا أمرر لتلك الوظيفة؟ 832 01:13:12,700 --> 01:13:17,050 إذا كنت تمر X، وأنا يمر هذا العنوان. 833 01:13:17,050 --> 01:13:23,780 ولكن أريد أن تمرير هذا العنوان خاص. ذلك ما ينبغي أن أمرر؟ 834 01:13:23,780 --> 01:13:26,590 [طالب] مؤشر + 2؟ 835 01:13:26,590 --> 01:13:29,350 [بودين] لذا X + 2. نعم. 836 01:13:29,350 --> 01:13:31,620 وهذا سوف يكون هذا العنوان. 837 01:13:31,620 --> 01:13:42,810 عليك أيضا كثيرا جدا يراها X [2] وبعد ذلك عنوان ذلك. 838 01:13:42,810 --> 01:13:47,850 لذلك تحتاج إلى اتخاذ عنوان ذلك لأن قوس هو إلغاء مرجعية ضمنية. 839 01:13:47,850 --> 01:13:53,250 x [2] يشير إلى القيمة التي هي في هذا الإطار، ومن ثم تريد أن عنوان مربع، 840 01:13:53,250 --> 01:13:56,850 لذلك كنت أقول & X [2]. 841 01:13:56,850 --> 01:14:02,880 لذلك هذه هي الطريقة شيء في دمج النوع حيث تريد تمرير نصف قائمة إلى شيء 842 01:14:02,880 --> 01:14:08,790 كنت حقا يمر & X [2]، والآن بقدر ما يتعلق الأمر دعوة متكررة، 843 01:14:08,790 --> 01:14:12,510 مجموعة بلدي جديد يبدأ هناك. 844 01:14:12,510 --> 01:14:15,130 أسئلة اللحظة الأخيرة. 845 01:14:15,130 --> 01:14:20,050 [طالب] إذا لم نضع العطف أو -؟ ما الذي دعا ستار >>؟ 846 01:14:20,050 --> 01:14:23,200 [طالب] ستار. >> من الناحية الفنية، مشغل إلغاء مرجعية، ولكن - >> [طالب] إلغاء مرجعية. 847 01:14:23,200 --> 01:14:29,310 >> إذا لم نضع نجمة أو العطف على ما يحدث فقط إذا قلت Y = x و x هو مؤشر؟ 848 01:14:29,310 --> 01:14:34,620 ما هو نوع Y؟ >> [طالب] أنا أقول فقط انها مؤشر 2. 849 01:14:34,620 --> 01:14:38,270 إذا كان الأمر كذلك كنت أقول ص = س، س والآن نقطة Y لنفس الشيء. >> [طالب] نقطة إلى الشيء نفسه. 850 01:14:38,270 --> 01:14:45,180 وإذا كان x هو مؤشر كثافة العمليات؟ ومن يشكو >> لأنه لا يمكن تعيين المؤشرات. 851 01:14:45,180 --> 01:14:46,540 [طالب] حسنا. 852 01:14:46,540 --> 01:14:51,860 تذكر أن المؤشرات، على الرغم من أننا الاستفادة منها والسهام، 853 01:14:51,860 --> 01:15:02,010 حقا كل ما مخزن - الباحث * X - X حقا كل شيء يتم تخزين مثل ox100، 854 01:15:02,010 --> 01:15:06,490 الذي يحدث لأننا كما تمثل مشيرا إلى كتلة المخزنة في 100. 855 01:15:06,490 --> 01:15:19,660 لذلك عندما أقول الباحث * ص = س؛ أنا مجرد نسخ ox100 إلى ذ، 856 01:15:19,660 --> 01:15:24,630 ونحن في طريقنا الذي لتمثيل فقط كما ذ، مشيرا أيضا إلى ox100. 857 01:15:24,630 --> 01:15:39,810 وإذا قلت كثافة العمليات ط = (الباحث) ×، ثم أنا ذاهب الى تخزين مهما كانت قيمة ox100 هو 858 01:15:39,810 --> 01:15:45,100 داخل منه، ولكن الآن انها سوف تفسر كعدد بدلا من المؤشر. 859 01:15:45,100 --> 01:15:49,310 ولكن عليك المدلى بها وإلا فإنه سوف يشكو. 860 01:15:49,310 --> 01:15:53,300 [طالب] إذا هل يعني للادلاء - 861 01:15:53,300 --> 01:16:00,290 الحال أن يلقي الباحث من الباحث X أو Y صب؟ 862 01:16:00,290 --> 01:16:03,700 [بودين] ماذا؟ 863 01:16:03,700 --> 01:16:07,690 [طالب] حسنا. بعد هذه الأقواس وهناك سوف يكون هناك المنعم يوسف x أو؟ 864 01:16:07,690 --> 01:16:11,500 >> [بودين] أيضا. x و y هي ما يعادلها. >> [طالب] حسنا. 865 01:16:11,500 --> 01:16:14,390 لأنهم على حد سواء مؤشرات. نعم >>. 866 01:16:14,390 --> 01:16:21,050 [طالب] لذلك فإنه تخزين ال 100 في شكل عشري صحيح؟ >> [بودين] نعم. 867 01:16:21,050 --> 01:16:23,620 ولكن لا قيمة كل ما يشير إلى. 868 01:16:23,620 --> 01:16:29,940 [بودين] نعم. >> [طالب] حتى مجرد عنوان في شكل صحيح. حسنا. 869 01:16:29,940 --> 01:16:34,720 [بودين] إذا أردت لسبب غريب، 870 01:16:34,720 --> 01:16:38,900 هل يمكن التعامل حصرا مع مؤشرات والتعامل مع الأعداد الصحيحة أبدا 871 01:16:38,900 --> 01:16:49,240 ويصبح مثل كثافة العمليات * 0 = س. 872 01:16:49,240 --> 01:16:53,000 ثم وأنت تسير في الحصول على الخلط حقا مرة واحدة يبدأ الحساب مؤشر يحدث. 873 01:16:53,000 --> 01:16:56,570 وبالتالي فإن الأرقام التي لا معنى لها التي تخزن. 874 01:16:56,570 --> 01:16:58,940 انها فقط كيف كنت في نهاية المطاف تفسيرها. 875 01:16:58,940 --> 01:17:02,920 لذلك أنا حرة لنسخ ox100 من * الباحث إلى int، 876 01:17:02,920 --> 01:17:07,790 وأنا حر في تعيين - تذهبين إلى الارجح الى الحصول صرخ في والصب لعدم - 877 01:17:07,790 --> 01:17:18,160 أنا حرة لتعيين شيء من هذا القبيل (الباحث *) * ox1234 في هذا الباحث التعسفي. 878 01:17:18,160 --> 01:17:25,480 حتى ox123 تماما كما هو ساري المفعول عنوان ذاكرة كما هو وذ. 879 01:17:25,480 --> 01:17:32,060 وY يحدث شيء للعودة الى حد كبير ox123. 880 01:17:32,060 --> 01:17:35,430 [طالب] هل يكون ذلك وسيلة باردة حقا للانتقال من شكل سداسي عشري إلى عشري، 881 01:17:35,430 --> 01:17:39,230 إذا كان لديك مثل مؤشر وأنت صبغه باعتباره الباحث؟ 882 01:17:39,230 --> 01:17:44,860 [بودين] يمكنك فقط حقا مثل الطباعة باستخدام printf. 883 01:17:44,860 --> 01:17:50,300 دعنا نقول لدي الباحث ذ = 100. 884 01:17:50,300 --> 01:18:02,700 printf ذلك (٪ د \ ن - كما يجب أن نعرف بالفعل - أن طباعة كعدد X٪. 885 01:18:02,700 --> 01:18:05,190 سنقوم طباعة فقط على أنها الست عشري. 886 01:18:05,190 --> 01:18:10,760 حتى لا يتم تخزين مؤشر والست عشري، 887 01:18:10,760 --> 01:18:12,960 لا يتم تخزين وعدد صحيح كما عشرية. 888 01:18:12,960 --> 01:18:14,700 يتم تخزين كل شيء كما الثنائية. 889 01:18:14,700 --> 01:18:17,950 انها مجرد أننا تميل إلى إظهار مؤشرات وعشري 890 01:18:17,950 --> 01:18:23,260 لأننا التفكير في الأمور من هذه الكتل 4-بايت، 891 01:18:23,260 --> 01:18:25,390 وعناوين الذاكرة تميل إلى أن تكون مألوفة. 892 01:18:25,390 --> 01:18:28,890 نحن مثل، إذا كان يبدأ مع فرنك بلجيكي، فإنه يحدث أن تكون على المكدس. 893 01:18:28,890 --> 01:18:35,560 حتى انها مجرد تفسيرنا للمؤشرات كما الست عشري. 894 01:18:35,560 --> 01:18:39,200 حسنا. أي أسئلة الماضي؟ 895 01:18:39,200 --> 01:18:41,700 >> سأكون هنا قليلا بعد إذا كان لديك أي شيء آخر. 896 01:18:41,700 --> 01:18:46,070 وهذا هو نهاية ذلك. 897 01:18:46,070 --> 01:18:48,360 >> [طالب] ياي! [تصفيق] 898 01:18:51,440 --> 01:18:53,000 >> [CS50.TV]