[Powered by Google Translate] [القسم 4 - أكثر راحة] [روب بودين - جامعة هارفارد] [هذا CS50. - CS50.TV] لدينا غدا اختبار، في حال كنت لا تعرف الرجال ذلك. انها في الاساس على كل ما يمكن أن ينظر في الصف أو يفترض أن يكون ينظر في الصف. يتضمن مؤشرات، على الرغم من انهم موضوع حديث جدا. يجب أن لا يقل عن فهم مستويات عالية منها. أي شيء ذهب أكثر في الصف يجب أن نفهم لهذه المسابقة. حتى إذا كان لديك أسئلة عليهم، يمكنك أن تطلب منهم الآن. ولكن هذا سيكون جلسة للغاية التي قادها الطلبة حيث يمكنك طرح الأسئلة الرجال، نأمل من الناس لديهم أسئلة. لا أحد لديك أسئلة؟ نعم. >> [طالب] هل يمكن أن يذهب أكثر المؤشرات مرة أخرى؟ سأذهب على المؤشرات. جميع المتغيرات الخاصة بك العيش بالضرورة في الذاكرة، ولكن عادة لا تقلق بشأن ذلك وكنت أقول X و y + 2 + 3 وسوف المترجم معرفة أين يعيشون الأشياء بالنسبة لك. مرة كنت تتعامل مع مؤشرات، والآن كنت تستخدم هذه العناوين صراحة الذاكرة. لذلك سوف متغير واحد فقط من أي وقت مضى يعيشون في عنوان واحد في أي وقت من الأوقات. إذا كنا نريد أن يعلن المؤشر، ما هو نوع سوف تبدو؟ أريد أن يعلن ف المؤشر. ماذا تبدو مثل نوع؟ [طالب] * الباحث ف. نعم >>. ذلك الباحث * ص. وكيف يمكنني جعله يشير إلى x؟ >> [طالب] علامة الضم. [بودين] لذا يسمى حرفيا العطف عنوان المشغل. لذلك عندما أقول & X هو الحصول على عنوان الذاكرة للمتغير x. حتى الآن لدي ع المؤشر، وفي أي مكان في قانون بلدي يمكنني استخدامها * ع أو أنا يمكن استخدام x و سيكون نفس الشيء بالضبط. (* ع). ما هو هذا العمل؟ ماذا يعني هذا النجم؟ [طالب] وهذا يعني قيمة في تلك المرحلة. نعم >>. لذلك إذا نظرنا إلى ذلك، يمكن أن يكون مفيدا جدا لاستخلاص الرسوم البيانية عندما يكون ذلك قليلا مربع من الذاكرة لX، والذي يحدث أن يكون قيمة 4، ثم لدينا قليلا مربع من الذاكرة لف، وهكذا ف لنقطة X، لذلك نحن رسم سهم من ص إلى x. لذلك عندما نقول * ف نقوله انتقل إلى المربع الذي هو ع. نجوم اتبع السهم ثم تفعل ما تريد مع هذا المربع هناك. لذلك أستطيع أن أقول * ص = 7، والتي من شأنها أن تذهب إلى المربع الذي هو X والتغيير الذي ل7. أو يمكن أن أقول الباحث Z = P * 2 *، وهذا هو الخلط لأنه نجم، نجمة. نجم واحد هو يعتبر إلغاء مرجعية ف، نجم الآخر هو ضرب من قبل 2. لاحظت أنا فقط يمكن أن يكون كذلك استبدال P * مع س. يمكنك استخدامها بنفس الطريقة. ومن ثم يمكن في وقت لاحق لدي ف أشر إلى شيء جديد تماما. ويمكنني أن أقول فقط P = &z؛ حتى الآن لم تعد ع يشير إلى X، بل يشير إلى الياء. وأي وقت أفعل * ع انها تفعل نفس Z. ذلك الشيء المفيد في هذا هو أن نبدأ مرة واحدة في الحصول على وظائف. انه نوع من العبث أن يعلن مؤشر يشير إلى شيء ويعتبر إلغاء مرجعية ثم كنت فقط عندما كنت يمكن أن تستخدم المتغير الأصلي لتبدأ. ولكن عندما تحصل في وظائف - لذلك دعونا نقول لدينا بعض من وظيفة، وكثافة العمليات فو، التي تأخذ مؤشر ويفعل فقط * ص = 6؛ كما رأينا من قبل مع مبادلة، لا يمكنك أن تفعل مبادلة فعالة ومستقلة وظيفة أعداد صحيحة فقط عن طريق تمرير لأن كل شيء في C يمر دائما من حيث القيمة. حتى عندما كنت تمر مؤشرات كنت تمر من حيث القيمة. انها مجرد أن ذلك يحدث هذه القيم هي عناوين الذاكرة. لذلك عندما أقول فو (ع)؛ أنا تمرير المؤشر إلى وظيفة فو ومن ثم يقوم به فو * p = 6؛ حتى داخل هذه المهمة، ف * لا يزال يعادل س، ولكن لا يمكنني استخدام X داخل تلك الوظيفة لأنها ليست خاصة بتطبيق داخل تلك الوظيفة. * حتى ف = 6 هو السبيل الوحيد الذي يمكنني الوصول إلى المتغير المحلي من وظيفة أخرى. أو، أيضا، مؤشرات هي السبيل الوحيد الذي يمكنني الوصول إلى المتغير المحلي من وظيفة أخرى. [طالب] دعونا نقول لكم تريد العودة مؤشر. بالضبط كيف تفعل ذلك؟ [بودين] العودة مؤشر كما هو الحال في شيء من هذا القبيل الباحث 3 = ذ؛ عودة & Y؟ >> [طالب] نعم. [بودين] حسنا. يجب أن يفعلوا ذلك أبدا. هذا غير صحيح. أعتقد أنني رأيت في هذه المحاضرة التي كنت الشرائح رؤية هذا المخطط كله من الذاكرة حيث هنا حتى كنت قد حصلت على عنوان الذاكرة 0 وإلى هنا كان لديك ذاكرة العربات العنوان 4 أو 2 إلى 32. حتى ذلك الحين كنت قد حصلت على بعض الاشياء والاشياء وبعض ثم لديك الكدسة وكنت قد حصلت على كومة الخاص بك، والتي بدأت للتو تعلم، يكبرون. [طالب] أليس في كومة فوق كومة؟ نعم. كومة على رأس، أليس كذلك؟ >> [طالب] حسنا، على حد تعبيره 0 على القمة. [طالب] أوه، على حد تعبيره 0 على القمة. >> [طالب] أوه، حسنا. تنويه: في أي مكان مع CS50 كنت تريد الذهاب لرؤيته بهذه الطريقة. >> [طالب] حسنا. انها مجرد عندما كنت يروه المداخن، مثل عندما تفكر في كومة تفكر في الأشياء التراص على رأس واحد آخر. لذلك فإننا نميل إلى هذا الوجه نحو ذلك المكدس ينمو مثل كومة عادة بدلا من المكدس المتدلية. >> [طالب] لا تنمو أكوام من الناحية الفنية حتى للغاية، على الرغم من؟ ذلك يعتمد على ما تعنيه ب يكبر. كومة كومة وتنمو دائما في اتجاهين معاكسين. A مكدس في تزايد مستمر حتى في بمعنى أنه يكبر عناوين نحو أعلى للذاكرة، وكومة من ينمو باستمرار في هذا انها المتزايد نحو أقل عناوين الذاكرة. حتى إن القمة 0 والقول هي عناوين الذاكرة عالية. انهم على حد سواء المتنامية، فقط في معارضة الاتجاهات. [طالب] I يعني فقط أن لأنك كنت وضعت كومة قال في القاع لأنه يبدو أكثر سهولة لأن لمكدس لبدء في الجزء العلوي من كومة، كومة من على قمة نفسها أيضا، حتى that's - نعم >>. كنت أعتقد أيضا كومة ويشبون وأكبر، ولكن أكثر من ذلك مكدس. وبالتالي فإن المكدس هو أننا نوع من تريد أن تظهر يكبرون. ولكن في كل مكان نظرتم خلاف ذلك سوف تظهر عنوان 0 في الجزء العلوي وعنوان أعلى الذاكرة في الجزء السفلي، لذلك هذا هو وجهة نظركم المعتادة من الذاكرة. هل لديك سؤال؟ [طالب] هل لك أن تخبرنا المزيد عن كومة؟ نعم. سأحضر إلى أنه في الثانية. أولا، لماذا العودة إلى العودة & Y أمر سيئ، على المكدس لديك مجموعة من إطارات المكدس التي تمثل جميع وظائف وقد تم استدعاء الذي. حتى تجاهل الأشياء السابقة، أعلى الكدسة دائما ما تكون المهمة الرئيسية منذ هذا هو الوظيفة الأولى التي يجري يسمى. ثم عند استدعاء دالة أخرى، المكدس هو الذهاب الى تنمو باستمرار. إذا كان الأمر كذلك أدعو بعض من وظيفة، فو، وأنها تحصل على كومة إطاره الخاص، يمكن أن ندعو بعض من وظيفة، بار، بل يحصل إطاره كومة الخاصة. ويمكن أن تكون متكررة وشريط يمكن أن تسمي نفسها، وحتى المكالمة الثانية لشريط هو الذهاب الى الحصول إطاره كومة الخاصة. وهكذا ما يجري في هذه الأطر كلها كومة من المتغيرات المحلية وجميع الحجج الدالة التي - أي الأشياء التي هي خاصة بتطبيق محليا لهذه الوظيفة تذهب في هذه الإطارات المكدس. وهذا يعني عندما قلت شيئا مثل شريط هي وظيفة، انا فقط لإعلان عدد صحيح ومن ثم العودة مؤشر إلى أن عدد صحيح. حتى أين يعيش ذ؟ [طالب] ذ يعيش في البار. >> [بودين] نعم. في مكان ما في هذه الساحة قليلا من الذاكرة هو مربع أصغر لديها ذ فيه. عندما أعود & Y، أنا إرجاع المؤشر إلى هذه الكتلة قليلا من الذاكرة. ولكن بعد ذلك عندما ترجع الدالة، ويحصل برزت إطاره كومة من المكدس. وهذا هو السبب في انه دعا المكدس. انها مثل كومة بنية بيانات، إذا كنت تعرف ما هي. أو حتى مثل كومة من الأدراج هو دائما سبيل المثال، الرئيسية ستذهب على الجزء السفلي، ثم الدالة الأولى التي تدعو ستذهب على رأس ذلك، ويمكن أن لا تحصل العودة الى الأصل حتى تعود من جميع الوظائف التي تم استدعاء وضعت هذا على أعلى من ذلك. [طالب] حتى إذا كنت لم تفعل العودة ذ و، أن القيمة هي عرضة للتغيير دون إشعار. نعم، it's - >> [طالب] قد يكون الكتابة. نعم >>. انها تماما - وإذا حاولت - وهذا سيكون أيضا بار * الباحث لانها تعود مؤشر، ذلك هو عودة نوعه * INT. إذا حاولت استخدام قيمة الإرجاع من هذه الوظيفة، انه سلوك غير معروف لأن هذا المؤشر يشير إلى ذكرى سيئة. >> [طالب] حسنا. ولكن ماذا لو، على سبيل المثال، كنت أعلن الباحث * Y = malloc (sizeof (الباحث))؟ هذا أفضل. نعم. [طالب] تحدثنا حول كيفية عندما كنا سحب الأشياء التى لدينا سلة المهملات كنت لا تمحى أنها في الواقع، ونحن فقط تفقد المؤشرات الخاصة بهم. حتى في هذه الحالة هل نحن فعلا محو قيمة أم أنه لا يزال هناك في الذاكرة؟ بالنسبة للجزء الأكبر، فإنه سيكون لا يزال هناك. ولكن دعونا نقول اننا ندعو يحدث لبعض وظيفة أخرى، باز. الباز هو الذهاب الى الحصول إطاره كومة الخاصة هنا. انها سوف تكون الكتابة فوق كل هذه الاشياء، ثم إذا حاولت في وقت لاحق واستخدام المؤشر الذي حصل من قبل، انها لن تكون نفس القيمة. انها ستكون لدينا مجرد تغيير لأنك يسمى الباز وظيفة. [طالب] ولكن كان علينا أن لا، ونحن لا يزال الحصول على 3؟ [بودين] في جميع الاحتمالات، وكنت. ولكن لا يمكنك الاعتماد على ذلك. C يقول فقط السلوك غير معروف. [طالب] أوه، لا. حسنا. حتى عندما تريد إرجاع المؤشر، هذا هو المكان الذي يأتي في malloc الاستخدام. أنا أكتب في الواقع مجرد العودة malloc (3 * sizeof (الباحث)). سوف نذهب أكثر من malloc أكثر في الثانية، ولكن هي فكرة malloc جميع المتغيرات المحلية دائما الذهاب على المكدس. أي شيء يذهب malloced على كومة، وسوف يكون دائما وإلى الأبد على كومة حتى تحرير بشكل صريح. لذلك هذا يعني أنه عند malloc شيء، انها سوف البقاء على قيد الحياة بعد عودة وظيفة. [طالب] هل البقاء على قيد الحياة بعد إيقاف تشغيل البرنامج؟ رقم >> حسنا، لذلك ستكون هناك حتى هذا البرنامج هو كل وسيلة يتم تشغيل. نعم >>. يمكننا أن نذهب أكثر من تفاصيل ما يحدث عندما يتوقف البرنامج عن التشغيل. قد تحتاج إلى تذكير لي، ولكن هذا أمر منفصل تماما. [طالب] وهكذا يخلق مؤشر malloc؟ نعم >>. Malloc - >> [طالب] أعتقد malloc يعين كتلة من الذاكرة التي يمكن استخدامها مؤشر. [بودين] أريد أن الرسم مرة أخرى. >> [طالب] لذلك هذه الوظيفة يعمل، على الرغم من؟ [طالب] نعم، malloc يعين كتلة من الذاكرة التي يمكن استخدامها، ومن ثم فإنها ترجع عنوان كتلة الأول من تلك الذاكرة. [بودين] نعم. حتى عندما كنت malloc، كنت الاستيلاء على بعض كتلة من الذاكرة هذا حاليا في الكومة. إذا الكومة صغير جدا، ثم كومة هو مجرد الذهاب الى النمو، وأنها تنمو في هذا الاتجاه. لذلك دعونا نقول كومة صغيرة جدا. ثم انها على وشك تنمو قليلا والعودة مؤشر إلى هذه الكتلة التي نشأت للتو. عند الاشياء مجانا، وكنت مما يجعل مجالا أكبر في كومة، بحيث ثم مكالمة في وقت لاحق لإعادة استخدام malloc أن الذاكرة التي كنت قد حررت من قبل. الشيء المهم حول malloc وحرة هو أنه يتيح لك السيطرة الكاملة على مدى عمر هذه الكتل الذاكرة. المتغيرات العالمية هي دائما على قيد الحياة. المتغيرات المحلية على قيد الحياة داخل نطاقها. حالما تذهب الماضي متعرج، والمتغيرات المحلية قد لقوا حتفهم. الذاكرة Malloced على قيد الحياة عندما تريد أن يكون على قيد الحياة ومن ثم يتم تحريرها عند أقول ذلك ليتم الافراج عنهم. تلك هي في الواقع سوى 3 أنواع من الذاكرة، حقا. هناك آلية إدارة الذاكرة، والذي هو المكدس. الأمور بالنسبة لك تلقائيا. عندما تقول X الباحث، يتم تخصيص الذاكرة ل x الباحث. عندما X يخرج من نطاق، هو استخلاص الذاكرة ل x. ثم هناك ديناميكية إدارة الذاكرة، وهذا ما هو malloc، وهو عندما يكون لديك السيطرة. عليك أن تقرر متى يجب حيوي والذاكرة لا ينبغي تخصيصها. وبعد ذلك هناك ثابت، وهو ما يعني فقط أنه يعيش إلى الأبد، وهو ما هي المتغيرات العالمية. انهم دائما في الذاكرة فقط. الأسئلة؟ [طالب] يمكنك تحديد كتلة فقط باستخدام الأقواس المتعرجة ولكن لا وجود لديك؟ إذا البيان أو بيان أو حين شيء من هذا القبيل يمكنك تحديد كتلة كما هو الحال في وظيفة، ولكن لديها أيضا الأقواس المتعرجة. [طالب] لذلك لا يمكن أن يكون تماما مثل الزوج عشوائية من الأقواس المتعرجة في التعليمات البرمجية التي لديها المتغيرات المحلية؟ نعم >>، يمكنك. داخل شريط الباحث أن لدينا {الباحث ذ = 3؛}. من المفترض أن تكون هنا. ولكن الذي يعرف تماما مدى كثافة العمليات ذ. بعد ذلك متعرج الثاني يمكن، وليس Y استخدامها بعد الآن. أنت لا تفعل ذلك تقريبا، وإن كان. العودة الى ما يحدث عندما ينتهي البرنامج، هناك نوع من سوء الفهم كذبة / نصف أن نعطي من أجل جعل الأمور أسهل فقط. نقول لكم أنه عند تخصيص الذاكرة كنت تخصيص بعض قطعة من RAM لهذا المتغير. ولكن كنت حقا لا لمس مباشرة RAM أي وقت مضى في البرامج الخاصة بك. إذا كنت التفكير في الأمر، كيف وجهت - وفعلا، إذا كنت تذهب من خلال GDB في سترى نفس الشيء. بغض النظر عن عدد مرات تشغيل البرنامج أو ما البرنامج الذي كنت تعمل، المكدس دائما ما تبدأ - كنت دائما ما أنظر المتغيرات حول شيء oxbffff العنوان. انها عادة ما تكون في مكان ما في تلك المنطقة. ولكن كيف يمكن أن يكون ربما 2 برامج المؤشرات إلى نفس الذاكرة؟ [طالب] هناك بعض تسمية التعسفي من حيث يفترض أن تكون oxbfff على RAM يمكن أن يكون في الواقع في أماكن مختلفة اعتمادا على عندما تم استدعاء الدالة. نعم. هذا المصطلح الذاكرة الظاهرية. والفكرة هي أن كل عملية واحدة، كل برنامج واحد الذي يعمل على جهاز الكمبيوتر الخاص بك الخاصة به - لنفترض 32 بت - مستقلة تماما مساحة العنوان. هذا هو مساحة العنوان. انها لديها قناعاتها مستقلة تماما 4 غيغا بايت للاستخدام. حتى إذا قمت بتشغيل 2 برامج في وقت واحد، وهذا البرنامج يرى 4 غيغا بايت لنفسها، يرى هذا البرنامج 4 غيغا بايت لنفسها، وأنه من المستحيل لهذا البرنامج لإلغاء مرجعية مؤشر وينتهي مع الذاكرة من هذا البرنامج. وما هي الذاكرة الظاهرية تعيين من مساحة العنوان عمليات إلى أشياء الفعلي على RAM. لذلك فمن يصل إلى نظام التشغيل الخاص بك لمعرفة ذلك، مهلا، هذا المؤشر عند dereferences oxbfff الرجل، وهذا يعني حقا انه يريد RAM بايت 1000، في حين إذا كانت هذه oxbfff dereferences برنامج، وقال انه يريد فعلا RAM بايت 10000. فإنها يمكن أن تكون بعيدة بشكل تعسفي على حدة. هذا صحيح حتى من الأشياء داخل مسافة واحدة عنوان العمليات. مثل لذلك يرى أن كل غيغا بايت 4 إلى نفسها، ولكن دعونا نقول - [طالب] هل كل عملية واحدة - دعونا نقول لديك جهاز كمبيوتر مع فقط 4 غيغابايت من ذاكرة الوصول العشوائي. لا كل عملية واحدة ترى كل 4 غيغا بايت؟ نعم >>. 4 غيغا بايت ولكن تراه هو كذب. انها مجرد أنها تعتقد أنه لديه كل هذه الذاكرة لأنه لا يعرف أي عملية أخرى موجودة. فإنه يستخدم الذاكرة فقط بقدر ما يحتاج فعلا. نظام التشغيل لن تعطي لهذه العملية RAM اذا كان لا تستخدم أي الذاكرة في هذه المنطقة بأسرها. انها لن تقدم له الذاكرة لتلك المنطقة. ولكن الفكرة هي أن - أنا أحاول أن أفكر في - لا أستطيع التفكير في القياس. من الصعب القياس. واحدة من القضايا من الذاكرة الظاهرية أو واحد من الأشياء انها حل هو أن العمليات يجب أن تكون على علم تماما عن بعضها البعض. وهكذا يمكنك كتابة أي برنامج dereferences فقط أي مؤشر، مجرد كتابة مثل برنامج الذي يقول * (ox1234)، وهذا عنوان الذاكرة يعتبر إلغاء مرجعية 1234. ولكن الامر متروك لنظام التشغيل لترجمة ما ثم 1234 وسيلة. لذلك إذا صادف أن يكون 1234 عنوان ذاكرة صالحة لهذه العملية، انها مثل في بنية تخزين العناصر أو شيء ما، فإن هذا إرجاع قيمة ذلك عنوان الذاكرة بقدر ما يعرف عملية. ولكن إذا لم 1234 غير عنوانا صالحا، كما يحدث على الأرض في بعض قطعة صغيرة من الذاكرة هنا أن يتجاوز مكدس كومة وما بعده وكنت لم تستخدم حقا ذلك، ثم ذلك عندما تحصل أشياء مثل segfaults لأنك لمس الذاكرة التي يجب أن لا يتم لمس. هذا صحيح أيضا - نظام 32 بت و 32 بت يعني أن لديك 32 بت لتعريف عنوان الذاكرة. ذلك هو السبب في مؤشرات هي 8 بايت 32 بت لهي 8 بايت - بايت أو 4. مؤشرات هي 4 بايت. لذلك عندما تشاهد مثل مؤشر oxbfffff، وهذا هو - ضمن أي برنامج معين يمكنك بناء أي مؤشر فقط التعسفي، في أي مكان من ox0 لf's 8 الثور - FFFFFFFF. [طالب] لم تقولون انهم 4 بايت؟ نعم >>. [طالب] ثم كل بايت سيكون لها - >> سداسي عشري [بودين]. عشري - 5 و 6 و 7 و 8. مؤشرات ذلك وأنت تسير لتراها دوما بالنظام الست عشري. انها مجرد كيف نصنف المؤشرات. كل الأرقام الست عشرية 2 من هو 1 بايت. لذلك هناك سيكون 8 أرقام ست عشرية لمدة 4 بايت. لذلك كل مؤشر واحد على نظام 32 بت ستكون 4 بايت، مما يعني أنه في عملية الخاص بك يمكنك بناء أي التعسفي 4 بايت وجعل مؤشر للخروج منه، وهو ما يعني أنه بقدر ما انها على علم، فإنه يمكن معالجة قدرها 2 بايت بأكمله إلى 32 من الذاكرة. على الرغم من أنه لا يملك في الواقع الوصول إلى ذلك، حتى لو جهاز الكمبيوتر الخاص بك ليس لديها سوى 512 ميغا، فإنه يعتقد أن لديها الكثير من الذاكرة. ونظام التشغيل ذكي بما فيه الكفاية أنه سيحدد فقط ما تحتاجه فعلا. فإنه لا يذهب فقط، أوه، عملية جديدة: 4 العربات. نعم. >> [طالب] ماذا يعني الثور؟ لماذا الكتابة؟ انها مجرد رمز للعشري. عندما ترى بداية مع عدد ثور، والأشياء المتعاقبة هي الست عشري. [طالب] وأنت تشرح ما يحدث عندما ينتهي البرنامج. نعم >>. ماذا يحدث عندما ينتهي برنامج هو نظام التشغيل يمحو مجرد أن لديها مخططات لهذه العناوين، وهذا كل شيء. يمكن لنظام التشغيل الآن مجرد اعطاء تلك الذاكرة إلى برنامج آخر للاستخدام. [طالب] حسنا. حتى عندما كنت تخصيص شيء على كومة أو المتغيرات العالمية أو كومة أو أي شيء، أنهم جميعا تختفي بمجرد أن ينتهي البرنامج لأن نظام التشغيل هو الآن مجانا لإعطاء تلك الذاكرة إلى أي عملية أخرى. [طالب] على الرغم من أن هناك وربما لا يزال يكتب في القيم؟ نعم >>. القيم من المحتمل أن تبقى هناك. انها مجرد انها سوف يكون من الصعب الحصول عليها. انها أكثر صعوبة للحصول على عليهم مما هو عليه في الحصول على ملف حذف لأن نوع الملف المحذوف من يجلس هناك لفترة طويلة وكان القرص الصلب هو أكبر كثيرا. ذلك انه سيكون للكتابة فوق أجزاء مختلفة من الذاكرة قبل أن يحدث للكتابة فوق قطعة من الذاكرة التي تستخدم لهذا الملف ان تكون على. ولكن الذاكرة الرئيسية، RAM، كنت تنقل على نحو أسرع كثيرا، لذلك يحدث بسرعة كبيرة لتكون الكتابة. أسئلة حول هذا أو أي شيء آخر؟ [طالب] لدي أسئلة حول موضوع مختلف. حسنا >>. هل لديها أسئلة حول هذا؟ حسنا. مختلفة الموضوع. >> [طالب] حسنا. كنت ذاهبا من خلال بعض اختبارات الممارسة، واحد منهم كان من الحديث عن sizeof وبالقيمة التي تقوم بإرجاع متغير أو أنواع مختلفة. نعم >>. وقال أن كل من الباحث والطويل على حد سواء العودة 4، حتى انهم على حد سواء 4 بايت طويلة. هل هناك أي فرق بين الباحث ومنذ فترة طويلة، أم أنه نفس الشيء؟ نعم، هناك فرق. وC القياسية - انا ذاهب على الارجح أن تصل الفوضى. معيار C هو تماما مثل ما هو C، الوثائق الرسمية للC. هذا هو ما تقول. وبالتالي فإن معيار C يقول فقط أن شار إلى الأبد وسوف يكون دائما و1 بايت. كل شيء بعد ذلك - هو دائما قصيرة محددة فقط بأنها أكبر من أو يساوي إلى شار. وهذا قد يكون أكبر من بدقة، ولكن لا الإيجابية. ويعرف الباحث مجرد كونه أكبر من أو يساوي قصيرة. ويتم تعريف مجرد طويلة بأنها أكبر من أو يساوي إلى int. ومنذ فترة طويلة طويلة أكبر من أو يساوي طويلة. وبالتالي فإن الشيء الوحيد الذي يحدد مستوى C هو ترتيب النسبي من كل شيء. المبلغ الفعلي للذاكرة أن الأمور يستغرق عموما حتى التنفيذ، ولكن هذا ما يرام تعريفه في هذه المرحلة. >> [طالب] حسنا. حتى السراويل هي دائما تقريبا ستكون 2 بايت. رجات هي دائما تقريبا ستكون 4 بايت. صفقات الشراء طويلة هي دائما تقريبا ستكون 8 بايت. ويتوق، فإنه يعتمد على ما إذا كنت تستخدم 32 بت أو نظام 64 بت. لذلك منذ فترة طويلة هو الذهاب الى تتوافق مع نوع من النظام. إذا كنت تستخدم نظام 32 بت مثل الأجهزة، فإنه سيكون من 4 بايت. إذا كنت تستخدم 64 بت مثل الكثير من أجهزة الكمبيوتر الحديثة، فإنه سيكون من 8 بايت. رجات هي دائما تقريبا 4 بايت في هذه المرحلة. صفقات الشراء طويلة هي دائما تقريبا 8 بايت. في الماضي، وتستخدم فقط ليكون رجات 2 بايت. ولكن لاحظ أن هذا يرضي تماما كل هذه العلاقات أكبر من ويساوي. طالما يسمح تماما ليكون بنفس حجم عدد صحيح، وأتاح أيضا أن يكون بنفس حجم طويلة طويلة. ويحدث ذلك فقط أن يكون ذلك في 99.999٪ من أنظمة، فإنه سيكون مساويا ل إما الباحث أو طويل. ذلك يعتمد فقط على بت 32 أو 64 بت. >> [طالب] حسنا. في العوامات، وكيف هي النقطة العشرية المعين من حيث بت؟ مثل ما ثنائي؟ نعم >>. لا تحتاج أن تعرف أن لCS50. كنت لا تعلم حتى أنه في 61. كنت لا تعلم أن حقا في أي مسار. انها مجرد تمثيل. انسى المخصصات بت بالضبط. فكرة النقطة العائمة هو أنك تخصيص عدد محدد من البتات لتمثيل - أساسا، كل شيء في العلمي. حتى تتمكن تخصيص عدد محدد من البتات لتمثيل الرقم نفسه، مثل 1.2345. لا يمكنني أبدا أن تمثل عدد الأرقام أكثر مع من 5. ثم تخصيص أيضا عدد محدد من البتات بحيث يميل إلى أن يكون مثل يمكنك الذهاب فقط حتى عدد معين، مثل هذا هو أكبر داعية يمكن أن يكون، ويمكن أن تذهب فقط لتصل إلى الأس معينة، مثل هذا هو أصغر داعية يمكن أن يكون. أنا لا أتذكر يتم تعيين بت الطريقة الدقيقة لجميع هذه القيم، ولكن نحن ملتزمون عدد معين من البتات إلى 1.2345، هي مكرسة آخر عدد معين من البتات إلى الأس، وانها الوحيدة الممكنة لتمثيل الأس من حجم معين. [طالب] ومزدوجة؟ هو أن مثل تعويم وطويلة جدا؟ نعم >>. انها نفس الشيء مثل عدد عشري إلا الآن كنت تستخدم 8 بايت بدلا من 4 بايت. الآن عليك أن تكون قادرا على استخدام أرقام أو 9 أرقام 10، وهذا سوف يكون قادرا على الذهاب تصل إلى 300 بدلا من 100. >> [طالب] حسنا. ويطفو أيضا 4 بايت. نعم >>. حسنا، مرة أخرى، فإنه يعتمد على تنفيذ ربما الشاملة العامة، ولكن يطفو هي 4 بايت، الزوجي هي 8. وتسمى الزوجي المزدوج لأنها ضعف حجم يطفو. [طالب] حسنا. وهناك الزوجي المزدوج؟ ليست هناك >>. أعتقد - >> [طالب] مثل صفقات الشراء طويلة؟ نعم >>. لا اعتقد هذا. نعم. [طالب] في اختبار العام الماضي كان هناك سؤال عن المهمة الرئيسية الحاجة إلى أن تكون جزءا من البرنامج. كان الجواب أنه ليس من الضروري أن تكون جزءا من البرنامج. في ما الوضع؟ هذا ما رأيت. [بودين] يبدو - >> [طالب] ما الوضع؟ هل لديك مشكلة؟ >> [طالب] نعم، أنا بالتأكيد يمكن سحب عنه. فإنه ليس من الضروري أن يكون، من الناحية الفنية، ولكن أساسا انها ستكون. [طالب] رأيت واحدا على في العام مختلفة. كان مثل صحيح أم خطأ: A صالحة - أوه >>، ملف ج.؟ [طالب] يجب أن يكون أي ملف ج - [كلا يتحدث في وقت واحد - غير مفهومة] حسنا. ولهذا منفصلة. ملف ج. يحتاج فقط لاحتواء الوظائف. يمكنك تجميع ملف إلى رمز الجهاز، ثنائي، أيا كان، دون أن يكون قابل للتنفيذ بعد. يجب للتنفيذ صالحة لها وظيفة رئيسية. يمكنك كتابة 100 وظائف في 1 الملف ولكن لا الرئيسي وثم ترجمة ذلك إلى أسفل إلى ثنائي، ثم تكتب ملف آخر يحتوي على المعلومات الرئيسية لكنها تدعو مجموعة من هذه الوظائف في هذا الملف الثنائي أكثر من هنا. وحتى عندما كنت جعل قابل للتنفيذ، وهذا ما لا رابط وأنه يجمع هذه الملفات الثنائية 2 في ملف قابل للتنفيذ. حتى ملف ج. لا تحتاج إلى أن يكون المهمة الرئيسية على الإطلاق. وعلى قواعد رمز كبير سترى الآلاف من الملفات ج. و 1 الملف الرئيسي. المزيد من الأسئلة؟ [طالب] وكان هناك سؤال آخر. وقال انه جعل هو مترجم. صواب أم خطأ؟ وكان الجواب كاذبة، وفهمت لماذا انها ليست مثل ضجيج. ولكن ماذا نسمي جعل إذا لم تكن؟ جعل هو في الأساس فقط - أستطيع أن أرى تماما ما يسميها. ولكن تشغيله فقط الأوامر. القيام بها. يمكنني سحب هذا الأمر. نعم. أوه، نعم. لا تجعل أيضا ذلك. هذا يقول الغرض من الأداة المساعدة هو جعل لتحديد تلقائيا التي قطعة من برنامج واسع تحتاج إلى أن يكون recompiled وإصدار الأوامر إلى إعادة ترجمة لهم. يمكنك جعل الملفات التي تجعل ضخمة للغاية. جعل يبحث في الوقت الطوابع من الملفات و، كما قلنا من قبل، يمكنك تجميع الملفات الفردية لأسفل، وانها ليست حتى تحصل على رابط أن كنت وضعوا معا في ملف قابل للتنفيذ. إذا كان الأمر كذلك لديك 10 ملف مختلف وقمت بإجراء تغيير إلى 1 منهم، ثم ما جعل هو بصدد القيام به هو إعادة ترجمة الملف فقط أن 1 وبعد ذلك كل شيء إعادة ربط معا. ولكن هذا غباء من ذلك بكثير. والامر متروك لكم لتحديد تماما أن هذا ما ينبغي أن تفعله. بشكل افتراضي لديه القدرة على التعرف على هذه الاشياء الطابع الزمني، ولكن يمكنك كتابة ملف تكوين لفعل أي شيء. يمكنك كتابة الملف بحيث تجعل عند كتابة تجعل من مجرد مؤتمر نزع السلاح إلى دليل آخر. تم الحصول على بالاحباط لأنني كل شيء تك داخل جهاز بلدي وبعد ذلك عرض PDF من ماك. حتى أذهب إلى الباحث عن وأستطيع أن أمضي لا، الاتصال بخادم، وخادم I الاتصال به هو جهاز الكمبيوتر، ومن ثم I فتح PDF يحصل ذلك عن طريق تجميع اللثي. ولكن تم الحصول على بالاحباط لأنني في كل مرة كنت بحاجة لتحديث PDF، كان لي لنسخه إلى دليل محدد أن يمكن الوصول وكان من الحصول على مزعج. لذلك كتب بدلا I ملف تكوين، التي لديك لتحديد كيف يجعل الامور. كيف تقوم بها في هذا اللثي PDF. تماما مثل أي ملف تكوين أخرى - أو اعتقد انك لم أر جعل الملفات، ولكن لدينا في ملف تكوين الأجهزة العالمية التي تقول فقط، إذا كنت تجميع ملف C، استخدم ضجيج. وحتى هنا في ملف جعل بلدي أن أجعل أقول، هذا الملف كنت تريد الذهاب الى ترجمة مع اللثي PDF. ولذا فمن اللثي PDF الذي يفعل في تجميع. لا تجعل تجميع. انها تعمل فقط هذه الأوامر في تسلسل I المحدد. نسخه بحيث يتم تشغيله PDF اللثي، إلى الدليل أريد أن أكون نسخه إلى، من مؤتمر نزع السلاح إلى الدليل ويفعل أشياء أخرى، ولكن كل ما يفعله هو الاعتراف عند تحول الملف، وإذا كان تغيير، ثم أنه سيتم تشغيل الأوامر التي من المفترض أن تعمل عندما يتغير الملف. >> [طالب] حسنا. أنا لا أعرف من أين جعل الملفات العالمية هي بالنسبة لي للتحقق من ذلك. أسئلة أخرى؟ أي شيء من الماضي مسابقات؟ أي أشياء المؤشر؟ هناك أشياء خفية مع مؤشرات مثل - أنا لن تكون قادرة على العثور على سؤال مسابقة على ذلك - ولكن تماما مثل هذا النوع من الاشياء. تأكد من أنك تفهم أنه عندما أقول الباحث * X * Y - هذه ليست بالضبط أي شيء هنا، وأنا أعتقد. * ولكن مثل X * Y، تلك هي 2 المتغيرات التي هي على المكدس. عندما أقول س = malloc (sizeof (الباحث))، لا يزال X متغير في بنية تخزين العناصر، malloc هو أكثر من بعض كتلة في الكومة، ونحن لها X أشر إلى الكومة. ذلك شيء على النقاط كومة إلى كومة. كلما malloc أي شيء، وأنت حتما تخزين ذلك من داخل المؤشر. بحيث المؤشر على المكدس، هو كتلة malloced على الكومة. وهناك الكثير من الناس الحصول على الخلط ويقول الباحث * س = malloc؛ x هو على كومة. رقم يشير إلى ما هو X على الكومة. X نفسه على المكدس، لأي سبب من الأسباب إلا إذا كنت قد يكون X متغير عمومي، وفي هذه الحالة يحدث أن تكون في منطقة أخرى من الذاكرة. حتى تتبع هذه المخططات مربع والسهم شائعة جدا لهذه المسابقة. أو إذا لم يكن في مسابقة 0، سوف يكون على الاختبار 1. يجب أن نعرف كل هذه الخطوات في تجميع منذ كان لديك للإجابة على الأسئلة على تلك. نعم. [طالب] هل يمكن أن نذهب أكثر من تلك الخطوات - بالتأكيد >>. قبل الخطوات وتجميع لدينا تجهيزها، تجميع، تجميع، وربط. تجهيزها. ماذا تفعل ذلك؟ هو أسهل خطوة في - حسنا، ليس مثل - هذا لا يعني أنه ينبغي أن يكون واضحا، ولكن من أسهل خطوة. يمكن يا رفاق تنفيذه أنفسكم. نعم. [طالب] خذ ما لديك في الخاص بك يتضمن مثل هذا وينسخ ومن ثم يعرف أيضا. فإنه يبحث عن أشياء مثل تضمين # # تعريف و، وأنها مجرد نسخ ولصق ما هي تلك تعني في الواقع. حتى عندما تقول تشمل # cs50.h، وقبل المعالج والنسخ واللصق cs50.h في هذا الخط. عندما تقول # تعريف X ليكون 4، وقبل المعالج يمر البرنامج بالكامل ويحل محل كافة مثيلات X مع 4. وبالتالي فإن المعالج يأخذ ملف C صالح وإخراج ملف C صالح حيث تم نسخ ولصق الأشياء. حتى الآن تجميع. ماذا تفعل ذلك؟ [طالب] وغني من C إلى ثنائي. [بودين] لا يذهب كل في طريقه إلى ثنائي. [طالب] إلى رمز الجهاز بعد ذلك؟ انها ليست >> رمز الجهاز. [طالب] الجمعية؟ الجمعية >>. فإنه يذهب إلى الجمعية قبل أن يذهب كل في طريقه إلى رمز C، ومعظم اللغات تفعل شيئا مثل هذا. اختيار أي لغة عالية المستوى، وإذا كنت تريد الذهاب لترجمة عليه فمن المحتمل أن يجمع في الخطوات التالية. لأول مرة يجري تجميع بايثون لC، ثم انه سيكون لتجميع C إلى الجمعية، ومن ثم يجري الجمعية للحصول على ترجمة إلى ثنائي. لذلك يجري تجميع لتبرز من C إلى الجمعية. الكلمة تجميع يعني عادة إعادته من مستوى أعلى إلى لغة البرمجة مستوى أقل. لذلك هذا هو الخطوة الوحيدة في تجميع حيث تبدأ مع لغة عالية المستوى وينتهي بهم الأمر في لغة منخفضة المستوى، وهذا هو السبب في ما يسمى الخطوة تجميع. [طالب] خلال تجميع، دعنا نقول أن كنت قد فعلت # تشمل cs50.h. ستقوم إعادة ترجمة المترجم cs50.h، مثل الوظائف التي هي في هناك، وترجمة ذلك إلى رمز الجمعية أيضا، أو أنه سوف نسخ ولصق شيء وهذا ما كان قبل الجمعية؟ سوف cs50.h أبدا الى حد كبير في نهاية المطاف في الجمعية. أشياء مثل نماذج وظيفة والأمور لمجرد أنك لتوخي الحذر. كما أنه يضمن المترجم يمكن أن تحقق أشياء مثل كنت استدعاء دالات مع عودة الحق وأنواع الحجج الحق والاشياء. لذلك سيتم preprocessed cs50.h في الملف، ومن ثم عندما يكون تجميع انها القيت في الأساس بعيدا بعد أن يتأكد أن يتم استدعاء كل شيء بشكل صحيح. ولكن للمهام المحددة في مكتبة CS50، والتي هي منفصلة عن cs50.h، لن يتم تجميع تلك على حدة. التي سوف تأتي في الواقع إلى أسفل في الخطوة ربط، وهكذا لن نصل إلى أنه في الثانية. ولكن أولا، ما هو تجميع؟ [طالب] الجمعية إلى ثنائي؟ نعم >>. تجميع. نحن لا نسميها تجميع لأن الجمعية هو الى حد كبير الترجمة نقية من ثنائي. هناك القليل جدا من المنطق في الذهاب إلى ثنائي من الجمعية. انها مجرد مثل يبحث حتى في جدول، أوه، لدينا هذه التعليمات؛ الذي يتوافق مع ثنائي 01110. وبالتالي فإن تجميع الملفات التي عادة النواتج. الملفات س. و. الملفات يا هي ما كنا نقول من قبل، كيف يمكن لملف لا يحتاج إلى وظيفة الرئيسي. ويمكن تجميع أي ملف الى ملف س. طالما انها ملف C صالح. يمكن جمعه من أسفل إلى. س. الآن، وربط الواقع هو ما يجلب مجموعة من ملفات الإخراج ويجلب لهم لللتنفيذ. وهكذا ما يفعله هو ربط يمكن ان يخطر لك مكتبة CS50 كملف س. وهو ملف ثنائي جمعت بالفعل. وذلك عند ترجمة الملف الخاص بك، hello.c الخاص بك، والذي يدعو GetString، يحصل المترجمة hello.c وصولا الى hello.o، hello.o الآن في ثنائي. ويستخدم GetString، لذلك يحتاج للذهاب الى cs50.o، ورابط smooshes بعضهم البعض، ونسخ هذا الملف إلى GetString ويخرج مع ملف قابل للتنفيذ الذي يحتوي على كافة الوظائف التي تحتاجها. لذلك ليست في الواقع cs50.o ملف O، لكنه قريب بما يكفي أنه لا يوجد اختلاف جوهري. لذلك ربط فقط يجلب مجموعة من الملفات معا التي تحتوي على حدة كل وظائف ولست بحاجة لاستخدام ويخلق القابل للتنفيذ الذي سيقوم بتشغيل الواقع. وحتى هذا أيضا ما كنا نقول قبل حيث يمكن أن يكون 1000. ج الملفات، يمكنك ترجمة كل منهم لملفات الإخراج، الذي قد يستغرق بعض الوقت، ثم قمت بتغيير 1. ج الملف. تحتاج فقط إلى إعادة ترجمة هذا الملف ج 1. ومن ثم إعادة ربط كل شيء آخر، ربط كل شيء معا مرة أخرى. [طالب] عندما نحن نكتب ربط lcs50؟ نعم، ما lcs50. أن الإشارات إلى العلم رابط التي يجب أن تكون في ربط تلك المكتبة. الأسئلة؟ وقد ذهب أكثر من أننا ثنائي غير أن 5 ثوان في المحاضرة الأولى؟ لا اعتقد هذا. يجب أن نعرف كل من نظام التشغيل الكبيرة التي خضنا في، ويجب أن تكون قادرة على ذلك، إذا أعطينا لك وظيفة، يجب أن تكون قادرة على القول انها كبيرة O، تقريبا. أو حسنا، يا كبير هو الخام. إذا كان الأمر كذلك انظر متداخلة الحلقات لكم على حلقات أكثر من نفس العدد من الأشياء، مثل كثافة العمليات ط، ط <ن؛ كثافة العمليات ياء، ي <ن - >> [طالب] ن المربعة. >> فإنه يميل إلى أن يكون غير المربعة. إذا كان لديك تداخل الثلاثي، فإنه يميل إلى أن يكون ن مكعبة. لذلك هذا النوع من الاشياء يجب أن تكون قادرة على الإشارة على الفور. عليك أن تعرف نوع ونوع الإدراج فقاعة نوع ودمج وكل هؤلاء جميعا. فإنه من السهل أن نفهم لماذا هم أولئك ن ن والمربعة وسجل ن كل ذلك لأنني أعتقد أن هناك كان على سنة واحدة حيث مسابقة أعطينا أساسا كنت وقال تنفيذا لنوع فقاعة و، "ما هو الوقت المناسب لتشغيل هذه الوظيفة؟" حتى إذا كنت تعترف بأنها نوع فقاعة، ثم يمكنك أن تقول على الفور ن المربعة. ولكن إذا كنت مجرد إلقاء نظرة على ذلك، لا تحتاج حتى إلى تحقيق نوع انها فقاعة؛ يمكنك فقط أن أقول هذا وفعل هذا وهذا. هذا هو ن مربع. [طالب] هل هناك أي أمثلة صعبة يمكنك الخروج مع، مثل فكرة مماثلة من معرفة؟ لا أعتقد أننا سوف يعطي لك أي أمثلة صعبة. الشيء نوع فقاعة على وشك صعبة كما كنا نذهب، وحتى ذلك، طالما أن نفهم أن كنت بالتكرار عبر مجموعة لكل عنصر في الصفيف، والتي ستكون شيء أن يكون ن المربعة. هناك أسئلة عامة، مثل الحق هنا لدينا - أوه. فقط في اليوم الآخر، وادعى دوغ، "قد اخترع I خوارزمية يمكن فرز مجموعة "من الأرقام n في O (سجل ن) الوقت!" فكيف لنا أن نعرف أن من المستحيل؟ [رد الطالب غير مسموع] >> نعم. على أقل تقدير، لديك لمسة كل عنصر في صفيف، لذلك فمن المستحيل لفرز مجموعة من - إذا كان كل شيء في محله لم يتم فرزها، ثم كنت على وشك أن لمس كل شيء في الصفيف، لذلك فمن المستحيل أن تفعل ذلك في أقل من O ن. [طالب] أظهرت لنا أن المثال يمكنك أن تكون قادرة على القيام بذلك في O ن إذا كنت تستخدم الكثير من الذاكرة. نعم >>. وthat's - I ننسى ما that's - هل العد الفرز؟ هم. هذا هو خوارزمية الفرز صحيح. كنت أبحث عن اسم خاص لهذا لانني لم أستطع تذكر الاسبوع الماضي. نعم. هذه هي أنواع من أنواع الأشياء التي يمكن أن تنجز في O كبير من ن. ولكن هناك قيود، مثل يمكنك استخدام الأعداد الصحيحة فقط حتى عدد معين. زائد إذا كنت تحاول فرز that's شيء - إذا كان الصفيف الخاص بك هو 012، -12، 151، 4 ملايين، ثم أن عنصر واحد هو الذهاب الى الخراب تماما الفرز بأكملها. الأسئلة؟ [طالب] إذا كان لديك وظيفة العودية ويجعل مجرد دعوات متكررة ضمن بيان عودة، وهذا الذيل متكررة، وسوف بحيث لا تستخدم أكثر من الذاكرة أثناء وقت التشغيل أم أنه على الأقل قابلة للمقارنة واستخدام الذاكرة تكرارية الحل؟ [بودين] نعم. فإنه من المرجح أن تكون أبطأ إلى حد ما، ولكن ليس حقا. الذيل العودية هو جيد جدا. يبحث مرة أخرى في إطارات المكدس، دعنا نقول لدينا الرئيسي ونحن لدينا شريط الباحث (الباحث خ) أو شيء من هذا. هذه ليست وظيفة مثالية متكررة، ولكن شريط عودة (س - 1). من الواضح جدا، وهذا هو معيب. تحتاج حالات قاعدة والاشياء. ولكن الفكرة هنا هي أن هذا هو الذيل متكررة، وهو ما يعني عند حجب المكالمات الرئيسي انه سيكون للحصول على إطاره المكدس. في هذا الإطار هناك كومة ستكون كتلة صغيرة من الذاكرة الذي يتوافق مع X حجتها. ولذلك دعونا نقول الرئيسية يحدث لاستدعاء شريط (100)؛ حتى X سوف تبدأ على النحو 100. إذا كان المترجم يعترف بأن هذه هي وظيفة الذيل متكررة، ثم عندما يجعل شريط دعوتها عودي إلى بار، بدلا من جعل إطار مكدس الجديد، الذي هو المكان الذي يبدأ كومة المتزايد إلى حد كبير، في نهاية المطاف سوف تصل الى كومة ثم تحصل segfaults لأن الذاكرة يبدأ الاصطدام. وذلك بدلا من جعل إطاره كومة الخاصة، يمكن أن ندرك، مهلا، أنا لا حقا بحاجة إلى العودة إلى هذا الإطار مكدس، وذلك بدلا سوف تحل محل هذه الحجة فقط مع 99 ثم قم بتشغيل شريط في كل مكان. وبعد ذلك سوف نفعل ذلك مرة أخرى، وسوف تصل إلى شريط عودة (س - 1)، وبدلا من جعل إطار مكدس الجديدة، فإنه سيتم استبدال فقط حجتها الحالي مع 98 و من ثم اقفز إلى بداية الشريط. تلك العمليات، لتحل محل تلك القيمة 1 في كومة والقفز مرة أخرى إلى البداية، هي فعالة جدا. لذلك ليس هذا فقط هو استخدام نفس الذاكرة بوصفها وظيفة منفصلة الذي متكررة لأنك كنت تستخدم فقط 1 الإطار مكدس، ولكن كنت لا تعاني من سلبيات من الاضطرار إلى استدعاء وظائف. يمكن استدعاء وظائف تكون مكلفة بعض الشيء لأنه له علاقة كل هذا الإعداد و tearDown وجميع هذه الأشياء. لذلك هذا العودية ذيل جيدة. [طالب] لماذا لم يخلق خطوات جديدة؟ لأنه يدرك أنه لا حاجة إليها. الدعوة إلى شريط يعود فقط الدعوة العودية. لذلك لا تحتاج إلى القيام بأي شيء مع قيمة الإرجاع. انها مجرد الذهاب الى العودة فورا. لذلك يحدث فقط ليحل محل الحجة الخاصة به والبدء من جديد. وأيضا، إذا لم يكن لديك الإصدار الذيل متكررة، ثم تحصل على كل هذه القضبان حيث عندما يعود هذا الشريط عليه أن يعود إلى قيمته هذا واحد، ثم أن شريط بإرجاع مباشرة وتقوم بإرجاع القيمة الخاصة به إلى هذا واحد، ثم انها مجرد الذهاب الى العودة فورا والعودة قيمته إلى هذا واحد. لذلك كنت تقوم بحفظ هذا ظهرت كل هذه الأمور الخروج من كومة منذ قيمة الإرجاع هو مجرد الذهاب لتمريرها كل في طريق العودة على أي حال. فلماذا لا تحل محل فقط وجهة نظرنا مع حجة تحديث والبدء من جديد؟ إذا كانت وظيفة ليست متكررة الذيل، إذا كنت تفعل شيئا مثل - [طالب] إذا بار (X + 1). نعم >>. إذا كان الأمر كذلك كنت وضعت في حالة، ثم كنت تفعل شيئا مع قيمة الإرجاع. أو حتى إذا كنت تفعل ذلك تماما العودة 2 * شريط (س - 1). حتى الآن شريط (س - 1) يحتاج للعودة من اجل ان لحساب تلك القيمة 2 مرات، حتى الآن لا تحتاج الخاصة الإطار كومة منفصلة، والآن، مهما كان صعبا وحاولت، وكنت بحاجة الى الذهاب الى - هذا ليس الذيل العودية. [طالب] هل أحاول جلب العودية لهدف لالعودية ذيل - [بودين] في عالم مثالي، ولكن في CS50 لم يكن لديك ل. من أجل الحصول على العودية الذيل، عموما، تقوم بإعداد وسيطة إضافية حيث ستمنع اتخاذ X Y الباحث في و y يقابل الشيء في نهاية المطاف تريد العودة. لذلك فإن هذا كنت على وشك أن يعود شريط (س - 1)، 2 * ذ. بحيث مجرد رفيع المستوى كيف تحول الأشياء أن يكون الذيل العودية. لكن حجة اضافية - ثم في النهاية عندما تصل قضيتك قاعدة، يمكنك العودة فقط Y لأن كنت قد تم تجميع طوال الوقت قيمة الإرجاع الذي تريده. كنت قد فعل ذلك النوع من تكراري ولكن باستخدام المكالمات العودية. الأسئلة؟ [طالب] ربما عن الحساب المؤشر، مثل عند استخدام السلاسل. بالتأكيد >>. مؤشر الحساب. عند استخدام السلاسل لأنه من السهل سلاسل من النجوم شار، حرف إلى الأبد ودائما بايت واحد، وذلك مؤشر الحساب ما يعادل الحسابية العادية عندما كنت تتعامل مع السلاسل. دعنا نقول فقط شار * S = "مرحبا". لذلك لدينا كتلة في الذاكرة. انها تحتاج 6 بايت لأنك بحاجة دائما فاصل فارغة. وشار * S يجري للإشارة إلى بداية هذه المجموعة. ق ذلك يشير هناك. الآن، وهذا هو في الأساس كيف يمكن لأي مجموعة تعمل، بغض النظر عما إذا كان عائدا من malloc أو سواء كان ذلك على المكدس. أي مجموعة هو في الأساس المؤشر إلى بداية مجموعة، ثم أي عملية الصفيف، أي الفهرسة، هو مجرد الذهاب الى أن مجموعة معينة الإزاحة. لذلك عندما أقول شيء من هذا القبيل ليالي [3]، وهذا هو الذهاب الى ليالي والعد 3 حرف فيه. ق ذلك [3]، لدينا 0، 1، 2، 3، لذا هي [3] هو الذهاب للإشارة إلى هذا لتر. [طالب] ويمكن أن نصل إلى نفس القيمة من خلال العمل + 3 ليالي ومن ثم قوسين النجوم؟ نعم. وهذا يعادل * (3 + ق)؛ وهذا هو إلى الأبد ودائما ما يعادلها بغض النظر عن ما تفعله. أنت لا تحتاج إلى استخدام بناء الجملة قوس. يمكنك دائما استخدام * (ق + 3) في بناء الجملة. يميل الناس الى مثل قوس بناء الجملة، وإن كان. [طالب] لذلك كل المصفوفات هي في الواقع مجرد مؤشرات. هناك فرق طفيف عندما أقول الباحث X [4]؛ >> [طالب] هل خلق أن الذاكرة؟ [بودين] وهذا هو الذهاب الى إنشاء 4 رجات على المكدس، لذلك العام 16 بايت. انه سيكون لإنشاء 16 بايت على المكدس. لا يتم تخزين X في أي مكان. انها مجرد رمز يشير إلى بداية شيء. لأن أعلن لكم مجموعة داخل هذه الوظيفة، ما هو مترجم بصدد القيام به هو استبدال كافة مثيلات فقط المتغير x حيث حدث مع اختيار لوضع هذه بايت 16. فإنه لا يمكن القيام بذلك مع شار * S ليالي هو مؤشر الفعلية. فهو حر في أن يشير بعد ذلك إلى أمور أخرى. x هو ثابت. لا يمكنك الحصول عليها أشر إلى مجموعة مختلفة. >> [طالب] حسنا. ولكن هذه الفكرة، وهذا الفهرسة، هو نفسه بغض النظر عن سواء كان ذلك في مجموعة التقليدية أو إذا كان مؤشر إلى شيء أو إذا كان مؤشر إلى مجموعة malloced. في واقع الأمر، فإنه ما يعادل ذلك أن هذا هو أيضا نفس الشيء. تبقى عليه في الواقع يترجم فقط ما هو داخل الأقواس وماذا عن أقواس، يضيف بعضهم البعض، وdereferences. لذلك هذا هو صحيحة تماما كما * (ق + 3) أو S [3]. [طالب] هل لديك مؤشرات مشيرا إلى 2 الأبعاد صفائف؟ انها أكثر صعوبة. تقليديا، لا. A مجموعة 2-الأبعاد هو مجرد مجموعة 1-الأبعاد مع بعض بناء الجملة مريحة لأنه عندما أقول الباحث العاشر [3] [3]، وهذا هو حقا فقط 1 مع 9 مجموعة القيم. وحتى عندما مؤشر، المترجم يعرف ما أعنيه. إذا قلت x [1] [2]، فهو يعرف أريد أن أذهب إلى الصف الثاني، لذلك سيكون لتخطي ال 3 الأولى، وبعد ذلك يريد الشيء الثاني في هذا، لذلك سيكون للحصول على هذا واحد. لكنه لا يزال مجرد مجموعة واحدة الأبعاد. وحتى إذا أردت أن تعيين مؤشر إلى أن مجموعة، وأود أن أقول الباحث * ص = س؛ نوع x هو فقط - انها نوع الخام قول X لأنه هو مجرد رمز وليس متغير الفعلية، ولكنه هو مجرد * INT. x هو مجرد مؤشر إلى بداية هذا. >> [طالب] حسنا. ولذا فإنني لن تكون قادرة على الوصول [1] [2]. أعتقد أن هناك بناء جملة خاص للاعلان المؤشر، شيء سخيف مثل الباحث (* ص [-. شيء مثير للسخرية تماما أنا لا أعرف حتى. ولكن هناك جملة مؤشرات لإعلان مثل الأقواس ومع الأشياء. قد لا تسمح لك حتى تفعل ذلك. ويمكنني أن ننظر إلى الوراء في شيء من شأنه أن تقول لي الحقيقة. وسوف نبحث عن ذلك في وقت لاحق، إذا كان هناك بناء الجملة من أجل نقطة. ولكن سوف ترى ذلك أبدا. وحتى بناء الجملة القديمة بحيث إذا كنت تريد استخدامه، وسيتم حيرة الناس. صفائف متعددة الأبعاد نادرة جدا كما هو. كنت الى حد كبير - حسنا، إذا كنت تفعل الأشياء مصفوفة انها لن تكون نادرة، ولكن في C وأنت تسير نادرا ما تستخدم المصفوفات متعددة الأبعاد. نعم. >> [طالب] دعونا نقول لديك مجموعة وطويلة حقا. حتى في الذاكرة الظاهرية على ما يبدو أن يكون كل على التوالي، مثل العناصر بجوار بعضها البعض، ولكن في الذاكرة الفعلية، هل من الممكن لهذا أن تقسيم؟ نعم >>. كيف يعمل الذاكرة الظاهرية أنه يفصل فقط - تخصيص وحدة عبارة عن صفحة، والذي يميل إلى أن يكون 4 كيلو بايت، وذلك عندما يقول عملية، مهلا، أريد استخدام هذه الذاكرة، نظام التشغيل هو الذهاب الى تحيله 4 كيلو بايت للكتلة التي القليل من الذاكرة. حتى إذا كنت تستخدم فقط بايت واحد يذكر في كتلة كاملة من الذاكرة، نظام التشغيل هو الذهاب الى اعطائها كامل 4 كيلو بايت. وذلك ما يعنيه هذا هو أن لدي - دعنا نقول هذا هو مكدس بلدي. يمكن فصل هذا المكدس. يمكن أن يكون بلدي كومة ميغا بايت وميغابايت. يمكن أن يكون بلدي كومة ضخمة. لكن المكدس نفسه لابد من تقسيمها إلى صفحات فردية، التي إذا نظرنا إلى أكثر من هنا دعونا نقول أن هذا RAM لدينا، إذا كان لدي 2 غيغا بايت من ذاكرة الوصول العشوائي، وهذا هو 0 العنوان الفعلي البايت مثل 0 من ذاكرة الوصول العشوائي بلدي، وهذا هو 2 غيغابايت على طول الطريق هنا. لذلك قد تتوافق هذه الصفحة إلى هذه الكتلة أكثر من هنا. هذه الصفحة قد تتوافق مع هذه الكتلة أكثر من هنا. هذا واحد قد تتوافق مع هذا واحد أكثر من هنا. وبالتالي فإن نظام التشغيل لتعيين مجانا الذاكرة الفعلية إلى أي صفحة فردية تعسفية. وهذا يعني أنه إذا كان هذا يحدث لتمتد الحدود صفيف، مجموعة يحدث أن تترك هذا الحق وهذا أمر من الصفحة، ثم أن مجموعة سوف يتم تقسيم في الذاكرة الفعلية. وبعد ذلك عندما كنت إنهاء البرنامج، عندما تنتهي العملية، هذه تعيينات الحصول على محوها وثم انها حرة في استخدام هذه الكتل قليلا لأمور أخرى. المزيد من الأسئلة؟ [طالب] مؤشر الحساب. أوه نعم >>. كانت السلاسل أسهل، ولكن بالنظر إلى ما يشبه رجات، العودة إلى ذلك الباحث X [4]؛ ما إذا كان هذا عبارة عن صفيف أو سواء كان ذلك في مؤشر إلى مجموعة malloced من 4 أعداد صحيحة، انها تسير في أن يعامل بنفس الطريقة. [طالب] وهكذا هي صفائف على الكومة؟ [بودين] ليست صالحة على الكومة. >> [طالب] أوه. [بودين] هذا النوع من مجموعة يميل إلى أن يكون على المكدس ما لم يعلن لك أنه في - تجاهل المتغيرات العالمية. لا تستخدم المتغيرات العالمية. وظيفة داخل أقول الباحث X [4]؛ انه سيكون لإنشاء كتلة 4-صحيحا على المكدس لهذه المجموعة. ولكن هذا malloc (4 * sizeof (الباحث))؛ ستذهب على الكومة. ولكن بعد هذه النقطة يمكن استخدام x و p في الطرق الى حد كبير نفس، غير استثناءات قلت من قبل عن يمكنك إعادة تعيين ف. من الناحية الفنية وأحجامها تختلف إلى حد ما، ولكن هذا غير ذي صلة تماما. كنت تستخدم أبدا في الواقع أحجامها. ع يمكن أن أقول ف [3] = 2، أو X [3] = 2؛ يمكنك استخدامها بطرق نفسها تماما. حتى الآن مؤشر الحساب - نعم. [طالب] هل لم يكن لديك للقيام P * إذا كان لديك الأقواس؟ الأقواس هي إلغاء مرجعية ضمنية. حسنا >>. في الواقع، يمكن أيضا ما تقوله مع صفائف متعددة الأبعاد تحصل مع مؤشرات، ما يمكنك القيام به هو شيء من هذا القبيل، دعنا نقول، وكثافة العمليات ** ص = malloc (sizeof (كثافة العمليات *) * 5)؛ أنا أكتب كل شيء فقط لأول مرة. لم أكن أريد أن واحدا. حسنا. ما فعلته هنا هو - أن يكون PP [أنا]. PP ذلك هو مؤشر إلى مؤشر. كنت mallocing ص للإشارة إلى مجموعة من 5 نجوم الباحث. حتى في الذاكرة لديك على كومة ص انه سيكون للإشارة إلى مجموعة من 5 بنات وكلها مؤشرات أنفسهم. ثم عندما malloc إلى هنا، وأنا malloc أن كل تلك المؤشرات الفردية يجب أن يشير إلى كتلة منفصلة من 4 بايت على الكومة. ولذلك فإن هذا يشير إلى 4 بايت. وهذا نقطة واحدة إلى 4 بايت مختلفة. وجميع من لهم إشارة إلى بايت. 4 الخاصة. هذا يعطيني وسيلة للقيام بهذه الأمور متعددة الأبعاد. يمكن أن أقول ص [3] [4]، ولكن الآن هذا ليس نفس الشيء مثل صفائف متعددة الأبعاد لأن المصفوفات متعددة الأبعاد ترجمته [3] [4] إلى واحدة تعويض في مجموعة س. هذه الصفحة dereferences، يصل المؤشر الثالث، ثم dereferences أن والوصول إلى - 4 أن تكون غير صالحة و- المؤشر الثاني. في حين عندما كان لدينا الباحث العاشر [3] [4] كما كان من قبل مجموعة متعددة الأبعاد وعند النقر المزدوج قوس انها حقا سوى إلغاء مرجعية واحدة، كنت بعد مؤشر واحد ومن ثم تعويض ل، هذا هو حقا مراجع 2D. 2 اتباع مؤشرات منفصلة. لذلك هذا أيضا يسمح من الناحية الفنية أن يكون لديك صفائف متعددة الأبعاد حيث كل فرد هو مجموعة أحجام مختلفة. لذلك أعتقد صفائف متعددة الأبعاد خشنة هو ما يطلق عليه منذ أول شيء حقا يمكن أن تشير إلى شيء له 10 عناصر، يمكن الشيء الثاني يشير إلى ما لديها 100 عناصر. [طالب] هل هناك أي حد لعدد من المؤشرات التي يمكن أن يكون لها مشيرا إلى مؤشرات أخرى؟ رقم >> هل يمكن أن يكون الباحث ***** ف. عودة إلى الحساب المؤشر - >> [طالب] أوه. نعم >>. [طالب] إذا كان لدي الباحث *** ع ثم أفعل يعتبر إلغاء مرجعية وأنا أقول ف * تساوي هذه القيمة، الحال الوحيدة للقيام 1 المستوى من يعتبر إلغاء مرجعية؟ نعم >>. حتى لو كنت تريد الوصول إلى شيء أن المؤشر الأخير يشير في - ثم لديك ع ***. حسنا >>. لذلك هذا هو نقطة ص إلى 1 كتلة، كتلة نقطة إلى أخرى، يشير إلى كتلة أخرى. ثم إذا كنت تفعل * p = شيء آخر، فأنت تتغير هذه للإشارة الآن إلى كتلة مختلفة. حسنا >>. [بودين] وإذا كانت هذه malloced، ثم كنت قد تسربت الآن الذاكرة إلا إذا كنت يحدث لديها مراجع مختلفة من هذه منذ لا يمكنك العودة إلى تلك تلك التي رمى فقط. مؤشر الحساب. الباحث X [4]؛ هو الذهاب الى تخصيص مجموعة من 4 أعداد صحيحة حيث x هو الذهاب للإشارة إلى بداية الصفيف. لذلك عندما أقول شيء من هذا القبيل [1] X؛ أريد أن يعني الذهاب الى العدد الصحيح الثاني في مجموعة، التي من شأنها أن تكون هذه واحدة. ولكن في الحقيقة، وهذا هو 4 بايت في مجموعة وبما أن هذا صحيح يستغرق 4 بايت. حتى إزاحة من 1 يعني حقا إزاحة من 1 أضعاف حجم مهما كان نوع الصفيف هو. هذا هو مجموعة من الأعداد الصحيحة، لذلك يعرف أن تفعل 1 مرات حجم الباحث عندما يريد أن يقابل. بناء الجملة الأخرى. تذكر أن هذا هو ما يعادل * (1 + س)؛ عندما أقول المؤشر + 1، ما أن يعود هو العنوان الذي يتم تخزين المؤشر زائد 1 مرات حجم النوع من المؤشر. إذا كان الأمر كذلك س = ox100، ثم X + 1 = ox104. ويمكنك تعاطي هذا وتقول شيئا مثل تشار * ج = (تشار *) ×؛ والآن ج سيكون عنوان نفس X. ج سوف يكون مساويا لox100، لكن ج + 1 ستكون مساوية لox101 منذ الحسابية المؤشر يعتمد على نوع المؤشر التي تقوم بإضافتها إلى. حتى ج + 1، فإنه يبحث في ج، انها مؤشر شار، لذلك سيكون لإضافة 1 مرات حجم شار، التي دائما ما تكون 1، حتى تحصل على 101، في حين إذا كنت تفعل العاشر، الذي هو أيضا لا يزال 100، X + 1 ستكون 104. [طالب] يمكنك استخدام ج + + من أجل المضي قدما المؤشر بنسبة 1؟ نعم، يمكنك ذلك. لا يمكنك أن تفعل ذلك مع لX x هو مجرد رمز، بل هو مستمر؛ لا يمكنك تغيير X. ولكن يحدث أن تكون ج مجرد مؤشر، لذلك ج + + هو صحيح تماما، وسوف زيادة بمقدار 1. إذا كانت مجرد ج * الباحث، ثم ج + + سوف 104. + + مؤشر الحساب كما يفعل فقط ج + 1 قد فعلت الحساب المؤشر. هذا هو في الواقع كيف يمكن لكثير من الأشياء مثل نوع الدمج - بدلا من إنشاء نسخ من الأشياء، يمكنك تمرير بدلا من ذلك - مثل إذا أردت أن تمرير هذا الصفيف نصف - دعونا محو بعض من هذا. دعنا نقول أردت أن تمرير هذا الجانب من الصفيف إلى وظيفة. ماذا أمرر لتلك الوظيفة؟ إذا كنت تمر X، وأنا يمر هذا العنوان. ولكن أريد أن تمرير هذا العنوان خاص. ذلك ما ينبغي أن أمرر؟ [طالب] مؤشر + 2؟ [بودين] لذا X + 2. نعم. وهذا سوف يكون هذا العنوان. عليك أيضا كثيرا جدا يراها X [2] وبعد ذلك عنوان ذلك. لذلك تحتاج إلى اتخاذ عنوان ذلك لأن قوس هو إلغاء مرجعية ضمنية. x [2] يشير إلى القيمة التي هي في هذا الإطار، ومن ثم تريد أن عنوان مربع، لذلك كنت أقول & X [2]. لذلك هذه هي الطريقة شيء في دمج النوع حيث تريد تمرير نصف قائمة إلى شيء كنت حقا يمر & X [2]، والآن بقدر ما يتعلق الأمر دعوة متكررة، مجموعة بلدي جديد يبدأ هناك. أسئلة اللحظة الأخيرة. [طالب] إذا لم نضع العطف أو -؟ ما الذي دعا ستار >>؟ [طالب] ستار. >> من الناحية الفنية، مشغل إلغاء مرجعية، ولكن - >> [طالب] إلغاء مرجعية. إذا لم نضع نجمة أو العطف على ما يحدث فقط إذا قلت Y = x و x هو مؤشر؟ ما هو نوع Y؟ >> [طالب] أنا أقول فقط انها مؤشر 2. إذا كان الأمر كذلك كنت أقول ص = س، س والآن نقطة Y لنفس الشيء. >> [طالب] نقطة إلى الشيء نفسه. وإذا كان x هو مؤشر كثافة العمليات؟ ومن يشكو >> لأنه لا يمكن تعيين المؤشرات. [طالب] حسنا. تذكر أن المؤشرات، على الرغم من أننا الاستفادة منها والسهام، حقا كل ما مخزن - الباحث * X - X حقا كل شيء يتم تخزين مثل ox100، الذي يحدث لأننا كما تمثل مشيرا إلى كتلة المخزنة في 100. لذلك عندما أقول الباحث * ص = س؛ أنا مجرد نسخ ox100 إلى ذ، ونحن في طريقنا الذي لتمثيل فقط كما ذ، مشيرا أيضا إلى ox100. وإذا قلت كثافة العمليات ط = (الباحث) ×، ثم أنا ذاهب الى تخزين مهما كانت قيمة ox100 هو داخل منه، ولكن الآن انها سوف تفسر كعدد بدلا من المؤشر. ولكن عليك المدلى بها وإلا فإنه سوف يشكو. [طالب] إذا هل يعني للادلاء - الحال أن يلقي الباحث من الباحث X أو Y صب؟ [بودين] ماذا؟ [طالب] حسنا. بعد هذه الأقواس وهناك سوف يكون هناك المنعم يوسف x أو؟ [بودين] أيضا. x و y هي ما يعادلها. >> [طالب] حسنا. لأنهم على حد سواء مؤشرات. نعم >>. [طالب] لذلك فإنه تخزين ال 100 في شكل عشري صحيح؟ >> [بودين] نعم. ولكن لا قيمة كل ما يشير إلى. [بودين] نعم. >> [طالب] حتى مجرد عنوان في شكل صحيح. حسنا. [بودين] إذا أردت لسبب غريب، هل يمكن التعامل حصرا مع مؤشرات والتعامل مع الأعداد الصحيحة أبدا ويصبح مثل كثافة العمليات * 0 = س. ثم وأنت تسير في الحصول على الخلط حقا مرة واحدة يبدأ الحساب مؤشر يحدث. وبالتالي فإن الأرقام التي لا معنى لها التي تخزن. انها فقط كيف كنت في نهاية المطاف تفسيرها. لذلك أنا حرة لنسخ ox100 من * الباحث إلى int، وأنا حر في تعيين - تذهبين إلى الارجح الى الحصول صرخ في والصب لعدم - أنا حرة لتعيين شيء من هذا القبيل (الباحث *) * ox1234 في هذا الباحث التعسفي. حتى ox123 تماما كما هو ساري المفعول عنوان ذاكرة كما هو وذ. وY يحدث شيء للعودة الى حد كبير ox123. [طالب] هل يكون ذلك وسيلة باردة حقا للانتقال من شكل سداسي عشري إلى عشري، إذا كان لديك مثل مؤشر وأنت صبغه باعتباره الباحث؟ [بودين] يمكنك فقط حقا مثل الطباعة باستخدام printf. دعنا نقول لدي الباحث ذ = 100. printf ذلك (٪ د \ ن - كما يجب أن نعرف بالفعل - أن طباعة كعدد X٪. سنقوم طباعة فقط على أنها الست عشري. حتى لا يتم تخزين مؤشر والست عشري، لا يتم تخزين وعدد صحيح كما عشرية. يتم تخزين كل شيء كما الثنائية. انها مجرد أننا تميل إلى إظهار مؤشرات وعشري لأننا التفكير في الأمور من هذه الكتل 4-بايت، وعناوين الذاكرة تميل إلى أن تكون مألوفة. نحن مثل، إذا كان يبدأ مع فرنك بلجيكي، فإنه يحدث أن تكون على المكدس. حتى انها مجرد تفسيرنا للمؤشرات كما الست عشري. حسنا. أي أسئلة الماضي؟ سأكون هنا قليلا بعد إذا كان لديك أي شيء آخر. وهذا هو نهاية ذلك. [طالب] ياي! [تصفيق] [CS50.TV]