[Powered by Google Translate] [الأسبوع 4، تابع] [ديفيد J. مالان - جامعة هارفارد] [هذا CS50. - CS50.TV] هذا هو CS50، وهذا هو نهاية الأسبوع 4. حتى بعض الأخبار الجيدة وبعض الأخبار السيئة. تعيين أي مشكلة لا محاضرة يوم الاثنين الأسبوع المقبل. [الطلاب الهتاف] كنت لن تحب هذا حيث هو ذاهب. ولكننا بدلا من ذلك يكون هذا الأربعاء المقبل، وهناك أيضا في المحاضرة المنهج الجمعة 1 يوم الجمعة المقبل حتى نتمكن من البقاء على المسار الصحيح. ولكن كل شيء يتم تصويره كما هو معتاد، لذلك لا داعي للقلق. وفيما يتعلق مسابقة 0 ما سنفعل نحو نهاية الأسبوع وظيفة على موقع cs50.net في سياق تفسير من أي نوع من التوقعات يجب أن يكون عندما يتعلق الأمر هذه المسابقة الأولى. بشكل عام، سيكون من الاختيار من متعدد، الصواب والخطأ، الجواب القصير، القصير مشاكل الترميز. كنت لن يكون من المتوقع أن تنفذ ما يعادل مشكلة ان تشهدوا على pset، والتي لديك جهاز كمبيوتر ومصحح وما شابه ذلك، ولكن سيكون هناك مشاكل صغيرة الترميز. وبالفعل، فإن أفضل دليل للحصول على شعور ما CS50 مسابقات مثل هو الذهاب إلى cs50.net، انتقل إلى الارتباط مسابقات، وتستطيع أن ترى في السنوات الماضية العديد من المسابقات قيمتها. أدرك تماما أن المناهج الدراسية لم تكن دائما كما هي على مدى سنوات. في بعض الأحيان نضيف، طرح بعض الأحيان، لذلك إذا كنت ترى بعض الموضوع على واحدة من تلك القديمة المسابقات أن يكون لديك أي فكرة ما يتحدث عن، انها إما أننا لم تغطية ذلك أو أننا لا يغطي ذلك. ولكن في شكل استعراض، هذا الأحد، الاثنين، والثلاثاء وكذلك دورة على نطاق دورة الاستعراض ليلة الاحد - الوقت والمكان ليتم الإعلان على الصفحة الرئيسية لمسار - لديك كل فرصة لاستعراض مع الزملاء في تدريس هذه المادة المواد لهذا العام، سواء في القسم وكفئة كامل، وسيتم تصوير تلك كالعادة أيضا. حسنا. ذلك دون مزيد من اللغط، تعليق واحد على النجاح / الفشل وإضافة / إسقاط. قد رأيتم ملاحظاتي الليلة الماضية، وهذا هو في الحقيقة مجرد بعض الطمأنينة إضافية أنه إذا كنت من بين أولئك الذين لا سيما أقل راحة أو في مكان ما بين وكنت تشعر قليلا في فوق رأسك، ندرك أن الواقع هو طبيعي جدا، وهناك هيكل الدعم الكافي في المكان، واحدة منها كانت ساعات العمل عازمة على تحسين كل من في بلدي الليلة الماضية البريد الإلكتروني، وندرك أيضا أن خيار مثل النجاح / الفشل لفئة مثل هذه حقا هو المقصود كآلية لاتخاذ حافة الخروج من دورة من هذا القبيل، مرة أخرى بحيث إذا كنت تنفق هذه 10، 15، 20 ساعة مجرد محاولة للحصول على بعض pset للعمل وأنت تعرف أنك 90-95٪ من الطريق إلى هناك ولكن لا يمكنك العثور على بعض الشوائب لعنة، في النجاح / الفشل نموذج هذا النوع من حسنا. والفكرة هي أنه مع أن آلية يمكنك الذهاب ثم التركيز على psets الأخرى الخاصة بك أو النوم أو كل ما هو الذي تريد التركيز على ندرك بحيث يكون لديك حتى يوم الثلاثاء القادم هذا - من الناحية الفنية يوم الاثنين 5، ولكن هذا العيد، لذلك هذا الثلاثاء القادم - للتبديل من النجاح / الفشل إلى العكس متدرج أو بالعكس. وإذا كنت حقا على الهاوية وتفكر في اسقاط تماما، يرجى التقاط لي بعد المحاضرة أو قطرة لي ملاحظة. كنا نحب أن ما لا يقل عن دردشة قبل المناقصة داعا. حسنا. بدأ ذلك نحن اتخاذ قبالة عجلات التدريب في المرة السابقة. على وجه الخصوص، ركزنا على السلسلة. سلسلة هو امر أعلن في مكتبة CS50، على وجه التحديد في هذا الملف الذي دعا cs50.h سوف نبدأ في النظر في هذا الأسبوع والذي يليه. ولكن سلسلة حقا هو مجرد تبسيط شيء وهذا أكثر من ذلك بقليل arcanely كما هو موضح * شار. شار نحن على دراية. انها مجرد حرف واحد. ولكن تدل * اعتبارا من يوم الاثنين ماذا؟ >> [طالب] مؤشر. A المؤشر. وما هو المؤشر؟ >> [طالب] عنوان. انها مثل عنوان، أو موقع في الذاكرة. ما هو عنوان أو موقع أو الذاكرة؟ مرة أخرى، كل منا لديه كمبيوتر محمول مع أزعج أو 2 غيغابايت من ذاكرة الوصول العشوائي على الأرجح في هذه الأيام، وهذا يعني لديك مليار أو 2 مليار بايت من الذاكرة قيمتها. وأنه لا يهم حقا ما يبدو جسديا مثل، ولكن تأخذ على الإيمان التي يمكنك ترقيم كل بايت الفردية التي لديها الكمبيوتر المحمول الخاص بك - هذا هو 0 بايت، وهذا هو 1 بايت، وهذا هو البايت 2 مليار - وهذا هو بالضبط ما يفعله جهاز كمبيوتر. عند تخصيص مساحة لحرف واحد، على سبيل المثال، من الواضح لديه أن يعيش في مكان ما في ذاكرة الكمبيوتر الخاص بك، وربما انها في عدد البايت 12345، وهذا في مكان ما هنا حتى في ذاكرة الكمبيوتر الخاص بك. وعنوان تلك الشخصية ثم هو 12345. الآن، في الأسبوع 0 إلى الآن حتى الآن، ونحن لم تهتم حقا حيث الأشياء في الذاكرة يتم تخزين لأننا عادة استخدام الرموز، المتغيرات، والمصفوفات في الواقع للحصول على البيانات المتوفرة لدينا في. ولكن اعتبارا من الاثنين وأكثر كل اليوم، وأنت تسير أن يكون الآن كل الامكانات أكثر تعبيرا مع برامج الكتابة حقا لمعالجة الذاكرة للكمبيوتر ولكن هل تراه مناسبا، للأغراض الخير والشر، البق كونه نتيجة شائعة جدا في هذه المرحلة من تعلم هذه الاشياء. ولكن ما الذي يعنيه حقا أن تكون * شار؟ دعونا نمضي قدما إلى - ونحن سوف نعود إلى Binky كما وعدت اليوم. دعونا نذهب لمثال بسيط هنا. اسمحوا لي أن حفظ هذا الملف ك compare.c، واسمحوا لي أن مجرد الحصول على بعض التعليمات البرمجية قالب هنا وتشمل ذلك stdio.h، اسمحوا لي أن أقدم نفسي كما تشمل cs50.h. أنا تكبير تصل هناك. اسمحوا لي أن أبدأ كتابة الباحث، الرئيسية الرئيسي (الفراغ)، والآن أريد أن أفعل شيئا من هذا القبيل: printf ("أعطني سلسلة:") وبعد ذلك سوف تستخدم سلسلة ليالي يحصل GetString للحصول على سلسلة من المستخدم، ثم سأذهب لتطلب من المستخدم لآخر. ("أعطني سلسلة أخرى:") وانا ذاهب ليطلب منهم عبر GetString للحصول على ذلك. سوف أسميها ر ر لأن يأتي بعد ق وق هو اسم لطيفة عن سلسلة ما اذا كان عام جدا. GetString ذلك، والآن أريد فقط أن تفعل الاختيار التعقل وانا ذاهب الى القول إذا كان (ق == ر) ثم انا فقط ان نقول للمستخدم printf ("قمت بكتابة نفس الشيء \ N!")؛ آخر أنا ذاهب لطباعة شيء من هذا القبيل ("أنت شيء مختلف المكتوبة N \"!) أو أيا كان سوف يكون الحكم. حتى شيء من هذا القبيل. ثم كالعادة، أنا التي تدل بإرجاع 0 فقط أن شيئا لم يحدث سيئة، وانا ذاهب الى المضي قدما وترجمة وتشغيل هذا البرنامج. ولكن يوم الاثنين ركضنا هذا البرنامج، والواقع أن قيل مرحبا مرحبا وليس وداعا ليس وداعا. كان سلوك رأينا أكثر من ذلك بقليل من هذا القبيل. اسمحوا لي ان اذهب الى بلدي الدليل المصدر، والتكبير في هنا، ودعونا لا تجعل المقارنة. جمعت بخير. اسمحوا لي أن تشغيل المقارنة. أعطني سلسلة: HELLO. أعطني سلسلة أخرى: HELLO. كتبته شيئا مختلفا! حسنا، اسمحوا لي أن أحاول شيئا أبسط مثل 50، 50. كتبته شيئا مختلفا! مرحبا، مرحبا. بكل وضوح، شيئا ما يجري هنا. ولكن ما هو تفسير لماذا؟ على ما يبدو، هو السطر 12 مختلة تماما. ما هي المشكلة الأساسية هنا؟ نعم. >> [طالب] انها مقارنة العناوين. نعم، بالضبط. انها في الواقع مقارنة عناوين حيث يتم تخزين أهلا ومرحبا. انها ليست مقارنة الحروف مرحبا مرة أخرى ومرة ​​أخرى، لأن ما حدث حقا، كل هذا الوقت كنا باستخدام GetString - هذا هو مرة أخرى السبورة ذاكرة الكمبيوتر لدينا، ودعونا نقول أدعو GetString بعد اعلان ق متغير. ماذا ذاكرتي تبدو وكأنها؟ دعنا نقول أن ليالي تعسفا يشبه هذا. انها مربع. والى حد كبير أي وقت قد وجهت قطعة من الذاكرة على الشاشة اذا كان 32 بت لقد تم رسم المربعات مثل هذا لأن الواقع في الجهاز، مؤشر، عنوان، هو 32 بت. انها نفس عدد صحيح. يمكن أن تختلف بناء على نظام الكمبيوتر. أولئك منكم الذين هم على دراية غامضة مع حقيقة أن جهاز Mac أو PC هو 64 بت، التي تدل فعلا أن الكمبيوتر يستخدم 64-بت المؤشرات، 64-بت عناوين، وبين الإيجابيات لذلك هو أجهزة الكمبيوتر يمكن أن يكون أكثر بكثير من RAM الأمس. قصة قصيرة طويلة، مرة في اليوم عندما أجهزة الكمبيوتر تستخدم فقط 32 بت لتمثيل عناوين، أكبر عدد من وحدات البايت يمكن أن تمثل في هذه الحالة هو ما إذا كان لديك 32 بت؟ SO 4 مليار الحق، لأن 2 إلى ال 32 هو 4 مليار دولار. وقد تم تكرار هذا الرقم في الدورة. إذا كان الأمر كذلك لديك فقط 32 بت، وهو أكبر عدد يمكنك الاعتماد على ما يقرب من 4 مليارات. لكن ذلك كان وجود قيود الأساسية من أجهزة الكمبيوتر حتى قبل بضع سنوات لأنه إذا كان يمكنك الاعتماد فقط تصل إلى 4 مليارات دولار. لا يهم إذا كنت تشتري 8 غيغابايت من ذاكرة الوصول العشوائي أو حتى 5 غيغابايت من ذاكرة الوصول العشوائي؛ لا يمكنك الاعتماد التي عالية، لذلك كان عديم الفائدة. هل يمكن فقط الوصول إلى أول 3 أو 4 غيغابايت من ذاكرة الكمبيوتر الخاص بك. وهذا أقل من قضية الآن، ويمكنك شراء ماك بوك الايجابيات والوديان مع 8 غيغابايت من ذاكرة الوصول العشوائي أو أكثر في هذه الأيام. ولكن إذا كنت تخصيص بكل بساطة في هذا البرنامج مؤشر، ودعا مؤشر ثانية، قد تبدو هذه على الشاشة لأن الواقع نحن بحاجة إلى العودة قشر هذه الطبقة. وأظل سلسلة قائلا: ولكن اعتبارا من الاثنين، هو في الحقيقة سلسلة * شار، عنوان بعض الحرف. لذلك دعونا نلقي أن عجلة التدريب قبالة على الرغم من أننا سوف تستمر في استخدام GetString في الوقت الراهن. حتى لقد أعلن I ثانية، وهذا هو جزء من الذاكرة و 32 بت. ما في هنا في الذاكرة بشكل افتراضي؟ >> [استجابة الطالب غير مسموع] ما هذا؟ >> [طالب] القمامة. >> القمامة. بالضبط. إذا كنت مبرمج لا تضع قيمة في متغير، من يدري ما هو عليه؟ في بعض الأحيان كنت محظوظا وانها 0، والذي هو نوع من لطيفة، نظيفة القيمة الافتراضية، ولكن كما رأينا الاثنين، في بعض الأحيان انها محض هراء، بعض عدد كبير حقا إيجابية أو سلبية التي جاءت من أين؟ نعم. >> [طالب] وظيفة من قبل. نعم >>. في كثير من الأحيان وظيفة التي حصلت من قبل بسبب دعا تذكر، كما تسمونه وظائف في الذاكرة، وأنها تأخذ مساحة أكثر وأكثر من الأسفل إلى الأعلى، وبمجرد أن ترجع الدالة، ويحصل على إعادة استخدام تلك الذاكرة بواسطة الرجل القادم أن يحصل على استدعاء، الذي يستخدم شريحة ك نفسه من الذاكرة. وإذا كنت قد القمامة اليسار هناك، والقيم السابقة، ونحن قد يخطئ ليالي وجود بعض القيمة عند حقا أننا لم تضع أي شيء هناك. لذلك لدينا RAM عند هذه النقطة يبدو مثل هذا. الآن على الجانب الأيمن من السطر 7 فنحن نطالب GetString، الذي كنا به الآن لأسابيع، ولكن ما GetString به حقا؟ GetString كتبها الموظفين CS50 قليلا ذكي في هذا بمجرد أن يبدأ المستخدم بكتابة مفاتيح ويضرب أدخل، أرقام GetString من عدد ضربات المفاتيح فعلت ضرب المستخدم، عدد الأحرف أحتاج إلى تخصيص RAM ل. وحيث أن يأتي من RAM، من يدري؟ انها في مكان ما في جهاز الكمبيوتر الخاص بك 2 غيغا بايت أو whatnot من الذاكرة. ولكن دعونا نفترض أن الكمبيوتر وجد مساحة لكلمة الترحيب هنا. كانت كلمة كتبت H-E-L-L-O. وإذا وضعنا هذا على أنه سلسلة من الأحرف، قد وضعنا على هذا النحو. ولكن يجب أن أفعل شيء 1 إضافية. ما ينتمي في نهاية السلسلة في أي C؟ الحرف فارغة، التي نكتب ك \ 0. انها من الناحية الفنية 0 عدد، ولكن مائل يجعل جميع ضوحا أن هذا هو حرفيا الرقم 0، عدد صحيح من 0؛ انها ليست، ل 0 اقتباس سبيل المثال، نهاية الاقتباس، التي قد اكتب على لوحة المفاتيح. لذلك هذا هو الترحيب. وماذا نقول يوم الاثنين ان وظيفة مثل GetString تعود في الواقع كل هذه الأسابيع؟ انها ليست عودة سلسلة في حد ذاته لأن ذلك لا حقا لها معنى لأن سلاسل لا وجود لها. انهم نوع من التلفيق في مكتبة CS50. ما هو في الحقيقة سلسلة، وأكثر من الناحية الفنية؟ >> [طالب] انها الحرف الأول. بالضبط. انها بكل بساطة عنوان الحرف الأول أن المستخدم بكتابتها فيها حتى إذا كلامي مرحبا ينتهي الامر في 123 عدد البايت، ثم في عدد البايت 124، 125، 126، وهكذا دواليك، إذا كنت مجرد رقم من 0 بايت بلدي على ما يصل، ما حقا GetString يعود هو حرفيا 123 عدد. وذلك ما يحصل في وضع s هو 123 عدد، وليس H الرسالة، وليس كلمة HELLO، ببساطة والعنوان الذي يمكن أن أجد الحرف الأول من الترحيب. ولكن هذا لا يبدو وكأنه بما فيه الكفاية. طلبت منكم عن سلسلة، وليس حرف. كيف لنا إذن أن نعرف أو الكمبيوتر التي إلو نوع من يأتي جنبا إلى جنب مع H؟ ما هو نوع من الاتفاق لدينا؟ نعم. [طالب] يقول إنها تحافظ نفسها لايجاد حرف بعض أكثر. بالضبط >>. هناك هذه الاتفاقية بين الإنسان والحاسوب حيث عندما كنت تتعامل مع السلاسل، والمعروف الآن باسم نجوم شار، لديك ببساطة لمعرفة حيث نهاية كل سلسلة في الحياة هو حقا من بالتكرار فقط أكثر من ذلك مع لحلقة، حلقة حين، أيا كان، حتى عندما تجد نهاية السلسلة الآن يمكنك نستنتج من ذلك، أوه، كانت كلمة مرحبا كله. قد أولئك منكم مع خبرة في البرمجة بلغة جافا قبل معرفة يمكنك الاتصال فقط. طول وبلغات أخرى يمكنك الاتصال طول أو ما شابه ذلك. وهذا لأنه في الكثير من اللغات، وخاصة الأشياء دعا وجوه المنحى اللغات، طول ما هو نوع من تغليف من داخل قطعة من البيانات نفسها، مثل الكثير ونحن معرفات وأسماء ومغلفة داخل المنازل لطالب يوم الاثنين. ولكن C هو مستوى أقل من ذلك بكثير. هناك أية كائنات أو فئات، إذا كنت قد سمعت هذه المصطلحات من قبل. كل ما عليك هو حقا عناوين الذاكرة. لذلك هذا هو نوع من الطريقة القديمة الطراز من اهتمام تمثل هياكل البيانات. لديك قيمة بدء مثل عنوان الحرف الأول وبعد ذلك فقط بعض الاتفاقية التعسفية التي يتفق الجميع على أن يتبع. لذلك لم كيفية تنفيذها طول السلسلة، نقترح؟ التوابع strlen، التوابع strlen، والتي البعض منكم قد استخدمت عدة مرات الآن. انها بسيطة جدا، أليس كذلك؟ انها مثل خطوط 2 من التعليمات البرمجية. انها الى حد كبير لحلقة من نوع ما، ربما مع متغير محلي إضافية. ولكن التوابع strlen فقط أن تأخذ مؤشر ومن ثم البدء في البحث عن \ 0. وبمجرد أن يرى ذلك، فإنه يمكن إرجاع العدد الإجمالي من الخطوات التي اتخذتها في انه هذه السلسلة. لذلك يمكننا أن نستنتج من هذا ما يدور المقبل. لنفترض ثم أعلن ر كما فعلت في السطر 10. هذا هو بعض القيمة القمامة. الذي يعرف في البداية؟ ولكن على الجانب الأيمن من خط من 10 ادعو GetString مرة أخرى. الذي يعرف أين ينتهي هذا؟ دعنا نقول بشكل تعسفي أن نظام التشغيل وجدت مجالا لذلك الطريق أكثر من هنا. يحدث لي للكتابة من قبيل الصدفة H-E-L-L-O مرة أخرى، وحتى نتمكن من رسم نفس النوع من الصورة. ولكن الحقيقة أن لدي رسم هذه الصورة هو متعمد لأن هذا هو. مرحبا مختلفة من هذا واحد حتى هنا هذا قد يكون موقع 456، وهذا هو 457، وهكذا دواليك. وذلك ما يحصل على وضع علامة استفهام حيث كان مرة واحدة؟ في هذه الحالة 456. نحن التقاط هذه الأرقام بشكل تعسفي بسبب حقا بعد اليوم نحن لن نهتم كثيرا عن ما هو عنوان من أي شيء. كل ما يهمني هو أن نتمكن من معرفة عنوان قطعة من بعض البيانات مثل مرحبا. حقا فما يفعل معظم الناس في علوم الكمبيوتر عندما نتحدث عن عناوين الذاكرة ويتحدث عن مؤشرات على وجه التحديد، بدلا من عناء معرفة 123 - من يهتم فيها هذه الاشياء هو في الواقع، نحن نعرف فقط أنه في بعض عنوان رقمي - نحن تبسيط العالم، وأقول أن هذا يشير إلى أن الطابع ويتم الإشارة إلى T هذا الحرف. وحقيقة أنه هو المقصود سهم جدا لأن حرفيا S هو الآن مشيرا في الوقت ذاته H و T يشير في H أخرى لأنه في نهاية اليوم، لا يهم ما هو عنوان، ولكن لا يهم ان لدينا القدرة على التعبير عن هذا العنوان مع بعض قطعة من التعليمات البرمجية. نحن لم التلاعب حقا هذه العناوين فقط حتى الآن وهكذا لن نرى أين نحن يمكن أن تقحم ونوع من فعل الأشياء مع مؤشرات، لكن في الوقت الراهن في السطر 12 حرفيا ما هي القيم نحن مقارنة وفقا لهذه القصة في السطر 12؟ نقوله هو 123 إلى 456 قدم المساواة على قدم المساواة؟ وهذا بالتأكيد ليس هو الحال. وحتى من الناحية المفاهيمية، وهذا مؤشر هي بالتأكيد ليست نفس هذا لأن دعاكم GetString مرتين، وGetString لا تحاول أن تكون ذكية فائقة، إلا أنها لا تحاول أن ندرك، أوه، مرحبا كتبته قبل 5 دقائق؛ اسمحوا لي أن أقدم لكم المؤشر نفس أعطيتك من قبل، فإنه يخصص قسما جديدا فقط من الذاكرة في كل مرة كنت اسميها. فكيف يمكن لنا إصلاح هذه المشكلة؟ إذا أريد مستوى أعلى لمقارنة السلاسل أهلا ومرحبا - لا يهمني حول المؤشرات - كيف يمكنني التوجه نحو الإجابة على السؤال، لم المستخدم اكتب نفس الشيء؟ ما هو ضروري هنا؟ نعم. [طالب] استخدام وظيفة. >> يمكنني استخدام وظيفة من خارج منطقة الجزاء. يمكنني استخدام دالة يسمى strcmp، S-T-R-C-M-P، مجرد نسخة مختصرة من سلسلة قائلا مقارنة. وإذا دخلنا في، على سبيل المثال، قارن 2، التي هي من بين الصدقات اليوم، أفعل بالضبط. ظللت كل شيء آخر من نفس السطر 1 إلى 26 نزولا أو نحو ذلك، وتلاحظ الآن تغير هذا الجزء قليلا. دعونا نتجاهل خط 28 لحظة والتركيز فقط على هذا واحد. ماذا نقول الاثنين ان المقارنة لا شارع؟ يتعامل بها عملية اتخاذ 2 المؤشرات وقاف وراء في هذه الحالة، نوع من وضع الاصبع تقريبا على تلك الرسائل 2، وما يجب القيام به هو شيء من هذا القبيل في حين حلقة أو حلقة For، وتقول انها نفس هذه؟ إذا كان الأمر كذلك، فإنه يتحرك الأصابع أو مؤشرات إلى الأمام. هل هذه هي نفس، وهذه نفس، وهذه، وهو نفس هذه نفس، نفس هذه؟ وأوه، أنا في نهاية السلسلة في كل من العلم والتكنولوجيا. أنا لم يتم العثور على أي تناقضات. نعم، هذه السلاسل هي نفسها. وماذا المقارنة شارع العودة إذا كان 2 سلاسل هي نفسها، على ما يبدو؟ صفر. 0 حتى هو جيد في هذه الحالة لأنه إذا فإنها ترجع -1 أو +1، وهذا يعني أن ليالي يحدث لمجرد أن تأتي قبل أو بعد أبجديا ر ر. لماذا وأن من المفيد الحصول على وظيفة تخبرك التي تأتي قبل سلسلة أو بعد في القاموس؟ [طالب] البحث. البحث >> والفرز. لذلك يمكنك أن تفعل أشياء مثل البحث الثنائي أو فرز أو دمج النوع فقاعة حيث لديك لمقارنة الأشياء. حتى الآن قمنا نوع من قطع بعض زوايا وتحدث فقط عن الفرز في سياق الأرقام لأنها لطيفة وسهلة للحديث عن، ولكن بالتأكيد يمكنك مقارنة السلاسل والتفاح والموز، لأنه إذا كان من المعروف أن التفاح يأتي قبل الموز، وبالمثل، يمكنك نقل سلاسل في الذاكرة حول مثل روب فعل مع نوع الدمج في الفيديو وفعلنا هنا على خشبة المسرح مع اختيار نوع، نوع الإدراج، وفرز الفقاعة. لذلك يمكن في أي مكان آخر ونحن نغتنم هذه؟ دعونا نحاول ذلك. نوع دعونا ننسى أن من الدرس للحظة وحاول الآن ونسخ 1.C للقيام بما يلي. في البند 21 أنا أقول شيئا الطباعة، ثم انني اتلقى سلسلة من المستخدم، ثم أنا التحقق من هذا. ونحن لم نصل فعلا الى هذه العادة حتى الآن، ولكن دعونا نفعل هذا الآن. دعونا فعلا قشر طبقة هذا مرة أخرى. هذا هو حقا * شار. هذا الرجل هو حقا * شار. فماذا يعني ان تكون التحقق إذا ق == NULL؟ تبين أنه عند استدعاء دالة مثل GetString أو أكثر عموما اسألوا جهاز كمبيوتر أن أقدم لكم بعض الذاكرة، يمكن شيء على غير ما يرام. هل يمكن أن يكون مجنون ونطلب من الكمبيوتر لتيرابايت من الذاكرة بطلب تريليونات بايت من الذاكرة التي لا وجود لها فقط في الكمبيوتر، ولكن وظائف GetString وغيرها بحاجة إلى طريقة من الصراخ عليك إذا كنت قد طلبت لأكثر من اللازم. والطريقة GetString هل هذا هو إذا كان لديك طلب لمزيد من الذاكرة مما هو متوفر في الكمبيوتر، حتى لو كان هذا هو سوبر سوبر احتمال ضعيف لأن لا أحد منا سوف اكتب الأحرف تريليون ثم اضغط Enter، ولكن احتمال ضعيف على الرغم من أنه قد يكون، ما زلت أريد للتحقق من ذلك فقط في حالة، والقيمة الخاصة التي GetString، الجواب، وغيرها من المهام العوائد إذا كان هناك شيء قد حصل من خطأ غير NULL في كل مباراة دولية. وما هو NULL؟ NULL فقط يحدث ذلك لتمثيل مؤشر. انها الذاكرة 0 العنوان. قرر العالم أن تعسفا، إذا كان هذا هو ذاكرة الكمبيوتر الخاص بي - أنت تعرف لماذا؟ - ونحن في طريقنا لسرقة فقط 1 بايت من الذاكرة كل جهاز كمبيوتر، وهذا هو الموقع 0. ونحن في طريقنا لإعطائها لقب NULL، ونحن ذاهبون الى وعد التي من شأنها أن لم نكن فعلا وضع بيانات حقيقية هناك لأننا فقط بحاجة تعسفا قيمة خاصة، 0، الملقب NULL، حتى نتمكن من الصراخ المستخدمين إذا سارت الامور بشكل خاطئ. وإلا قد لا تعرف لا يعني 0 وضع شيء هنا أو أنها لا تعني شيئا الخطأ الذي حدث؟ علينا أن نتفق جميعا على أن أعيد لا يعني شيئا NULL، تم إرجاع أي عنوان الفعلي. الآن، أنا هنا فقط اعتماد اتفاقية بلدي أعود الإنسان لل1 من الرئيسي إذا حدث خطأ ما. ذلك لأن الاتفاقية الرئيسية للعودة هو العودة 0 إذا جيدة، 1 أو بعض قيمة أخرى إذا سيئة. ولكن أي وظيفة GetString والتي تتعامل في الذاكرة تعود NULL اذا سارت الامور بشكل سيء. حسنا. للأسف كان الأمر كذلك، خط 27، سوبر بسيطة على الرغم من أنه هو، فشل تماما لنسخ السلسلة. لماذا؟ يمكننا أن نرى هذا على النحو التالي. أنا مدعيا في خط 27 إلى أن تقديم نسخة من ليالي واصفا اياه ر. لذلك أنا لا يطلب المستخدم لمدة 2 سلاسل هذا الوقت؛ أنا فقط أقول القيمة في ق ينبغي أن توضع في ر أيضا. حتى الآن فقط لشرح كيفية تقسيم هذا هو، في خط 29 فصاعدا ماذا أفعل؟ أولا أنا التحقق إذا كان طول ر أكبر من 0. هناك بعض سلسلة هناك. للمستخدم كتابة شيء فيه. ما هو السطر 32 القيام، على ما يبدو؟ [رد الطالب غير مسموع] الحق >>. يمكنك استنتاج ذلك النوع من من ما قلته تقوم به. لكن من الناحية الفنية، ما هو هذا العمل؟ ر [0] يمثل ما؟ [طالب] الحرف 0. >> [مالان] الحرف 0. أو، أكثر إنسانية، مثل الحرف الأول في ر، أيا كان ذلك، ربما H في هذه الحالة. وtoupper تفعل ما تقول. انها تستفيد من الطابع 0 ر ويتغير ذلك. لذلك هذا يعني أن الطابع 0 ر، تجعل من أحرف كبيرة، ويضعها من جديد في ذلك الموقع نفسه. حتى لو كنت اكتب في صغيرة مرحبا، وهذا ينبغي تغيير ح الصغيرة إلى العاصمة H. ولكن المشكلة هي أنه في خطوط 35 و 36 ما أنا على وشك القيام به هو طباعة بالنسبة لنا العلم والتكنولوجيا. وما هو حدس بك؟ ما أنا ذاهب في الواقع لمعرفة ما إذا كنت كتبته في مرحبا في جميع صغيرة؟ ما يحدث في الحصول على المطبوعة؟ >> [استجابة الطالب غير مسموع] >> ما هذا؟ [طالب] الكبير H والباقي صغيرة. و>> H كبيرة والباقي صغير الذي، ق أو ر؟ [طالب] كلا. كلا >>. بالضبط. لذلك دعونا نرى ما يجري هنا. اسمحوا لي أن تمضي قدما وتجميع هذه. هذا هو copy1، لذلك copy1. حسنا. تكبير. اسمحوا لي المضي قدما وتشغيل copy1، أدخل، قل شيئا: مرحبا في صغيرة. رسملة انها النسخة، لكنها على ما يبدو رسملة الأصلي أيضا، لأن ما يحدث الآن في هذه القصة؟ في خط 27 أنا لا يبدو في الواقع أن نسخ السلسلة، ولكن على الرغم من قد يكون حدسي يرجو منك أن يكون الأمر كذلك، إذا كنت تفكر في هذه الصورة، حقيقة ما الذي قمت به؟ نصف من الصورة هو نفسه. لذلك دعونا لفة العودة في الوقت المناسب بحيث ر غير موجود بعد في القصة. يمكن S موجودة في القصة، ولكن دعونا هذه المرة مرحبا صغيرة. لذلك اسمحوا لي إصلاح ما كتبته أنا في الواقع فيها في هذه الحالة لدينا هنا H-E-L-L-O. سوف نستخلص أنها تتابع من الأحرف، وضعت خطوط فاصل بلدي بلدي هنا و 0 \. لذلك هذا هو ما نحن فيه في أقرب وقت خط من 1 إلى العش-24، يعطي أو يأخذ، نفذت و. هذه هي الصورة من ذاكرتي. عندما أحصل على خط 27، ماذا يحدث؟ تماما مثل من قبل، يمكنني الحصول على المؤشر، الذي سوف يوجه هذا النحو مربع. انه دعا ر. وما هو قيمته بشكل افتراضي؟ من يدري؟ بعض القمامة القيمة. لذلك أنا سوف مجردة بعيدا عن علامة استفهام. وبمجرد أن الجانب الأيمن من خط 27 ينفذ، ما أنا وضع داخل ر؟ نفس الشيء هذا في ليالي. إذا كان الأمر كذلك فإننا لحظة إزالة هذا التجريد من السهم ونقول، أوه، هذا هو عنوان الذاكرة تحميل 123، عندما تقول ر ق يحصل، منقوطة، أنك تضع حرفيا 123 هنا. إذا نحن الآن نوع من تبسيط عالمنا مرة أخرى مع الصور، ما قمت به حقا هو مجرد أضاف السهم إلى عالمك هذا ما يشير إلى سلسلة من ر بالضبط نفس. حتى عندما تكون في خط 31 و 32 أذهب حول تغيير الواقع ر [0]، ما هو ر [0] مرادفة مع ما يبدو الآن؟ ق [0] ذلك أن كل ما يحدث. وعلى الرغم من هذا النوع من يشعر مستوى منخفض قليلا وغامضة وهذا النوع من يشعر مثل هذا حدسي ربما كان يجب أن يعمل فقط - لقد قدمت نسخ من الاشياء من قبل وانها عملت فقط - إذا كنت تعتقد فعلا عن ما هو في الحقيقة سلسلة، انها تشار *. حسنا، ما هي؟ انها عنوان لبعض الحرف. ثم ربما أكثر منطقية أنه عند محاولة القيام بشيء السوبر التي تبدو بسيطة مثل هذا، كل ما نقوم به هو نسخ عنوان الذاكرة. أنت لا تفعل اي شيء في الواقع مع السلسلة نفسها. وحتى اذا كان لديك أي فكرة كيف يمكنك حل هذه المشكلة في التعليمات البرمجية، مستوى عال، من الناحية النظرية، ماذا علينا أن نفعل من أجل جعل تا نسخة طبق الأصل من ليالي، على ما يبدو؟ نعم. >> [طالب] إعطائها الموقع الجديد؟ بالضبط >>. نحن بحاجة إلى إعطاء ر موقع العلامة التجارية الجديدة. نحن بحاجة إلى إنشاء نحو ما العالم الذي نحصل على قطعة جديدة من الذاكرة، الذي فقط من أجل الوضوح سوف أود أن ألفت الحق أدناه هذا واحد، ولكن لا يجب أن تكون هناك. ولكنه يجب أن يكون نفس الحجم، ولذا فإنني سوف يوجه هذه الخطوط العمودية في نفس المكان. أنه بخير إذا كان هذا هو كل القمامة في البداية. من يدري ما كان هناك؟ ولكن الخطوة 1 وستكون لدينا أن تعطيني مساحة كبيرة من الذاكرة وأنا في حاجة لتناسب نسخة من مرحبا، ثم معرفة كيفية نسخ ساعة هنا، وهنا ه، لام هنا وهكذا دواليك. ولكن هذا يجب أن يشعر بالفعل قليلا واضحة حتى وإن كانت بعض المعلومات لا تزال مجردة. لنسخ هذه السلسلة إلى ذلك، انها مجرد لحلقة أو حلقة في حين أو شيء من هذا الذي كنت قد أصبحت أكثر دراية جميع. لذلك دعونا نحاول ذلك. اسمحوا لي ان اذهب الى copy2.c. في copy2.c لدينا تقريبا نفس البرنامج باستثناء خط 27. يبدو معقدة بعض الشيء، ولكن إذا كان لنا أن كسرها نزولا قطعة قطعة، الجانب الأيسر هو نفسه. * شار ر يخلق هذا الشيء في الذاكرة، ولكن مع علامة استفهام لأن لدينا أي فكرة ما هو هناك بشكل افتراضي. على الجانب الأيمن إننا نقدم الآن ظيفة جديدة، malloc، تخصيص للذاكرة، أعطني الذاكرة، وعلى ما يبدو فإنه يأخذ عدد الحجج، كم من الأشياء داخل أقواس؟ سمعت تذمر 1 و 2، وإنما هو فقط 1. ليس هناك فاصلة، وهو ما يعني أن هناك فقط 1 شيء داخل الأقواس. على الرغم من أن هناك أقواس أخرى، اسمحوا لي أن تسليط الضوء على ما هو داخل الأقواس الأبعد، وانها هذا التعبير: (التوابع strlen (ق) + 1) * sizeof (تشار). حتى إذا كنا نعتقد فعلا ذلك من خلال، وهذا هو القول تعطيني طول ق. لماذا أنا، مع ذلك، إضافة 1 على طول؟ >> [استجابة الطالب غير مسموع] بالضبط. نحن بحاجة لهذا الفضاء الرجل في الذيل، والحرف السادس الذي ليس له معنى الإنجليزية ولكن لا يكون لها معنى خاص البرنامجية. لذلك نحن في حاجة الى + 1 لأنه بسبب التوابع strlen عوائد توقع الإنسان للطول، مرحبا أو 5، فإنه لا تعطيك الطابع فارغة إضافية. لذلك أنا مع هذا إضافة يدويا + 1. ثم هذا، وحجم * من (شار)، ونحن لم نر هذا من قبل. هذه ليست وظيفة من الناحية الفنية. انها الكلمة الخاصة التي تحكي لكم ما هو حجم البيانات من نوع ما على جهاز كمبيوتر لأنه في الواقع، بعض منا لديه 32-بت أجهزة الكمبيوتر. لدي جهاز كمبيوتر قديمة جدا في المنزل، ويستخدم فقط 32 بت لتمثيل المؤشرات. وإذا فعلت ذلك حجم نوع البيانات، قد يكون 32 بت. ولكن إذا أنا باستخدام جهاز الكمبيوتر الخاص بي الهوى جديد، قد أعود لقيمة 64 بت عن شيء مثل عنوان. حتى في هذه الحالة، لمجرد أن تكون آمنة فائقة، ونحن لن شيء بجد رمز مثل - حسنا، ما هو حجم شار وفقا لما قلنا حتى الآن؟ لدينا الى حد كبير وقال لفظيا انه من 1 بايت، وهذا صحيح إلى حد كبير في جميع المجالات. ولكن مرة أخرى، تميل إلى أن تكون الافتراضات السيئة. أنها تؤدي إلى البرامج عربات التي تجرها الدواب إذا كان الناس في استخدام البرمجيات الخاصة بك الطرق التي لم يقصد. لذلك دعونا مجردة بعيدا وهذا أكثر عدلا بشكل عام يقول انا بحاجة الى هذا قطع العديد من الذاكرة وينبغي أن كل قطعة من الذاكرة يكون معادلا لحجم حرف، وهو في الواقع يساوي 1 في هذه الحالة، لكنه وسيلة أكثر عمومية من كتابة هذا التقرير. حتى إذا كانت الكلمة مرحبا، عدد البايتات لا malloc تخصيص ما يبدو لتضع تعليقا؟ [طالب] ستة. ستة >>. بالضبط ما يصل لدينا علامات استفهام على الشاشة. ومن ثم اتخاذ تخمين مبني الآن على فهمك GetString ماذا malloc العودة ربما؟ >> [طالب] عنوان. عنوان ما؟ من قطعة الأول من الذاكرة. ليس لدينا أي فكرة ما هو هناك لبعض وظيفة أخرى كان من الممكن استخدام هذه الذاكرة من قبل. لكن malloc، مثل GetString، بإرجاع عنوان البايت الأول من الذاكرة التي وضعها جانبا لك. ومع ذلك، ما لم يفعل هو ملء هذا فارغا في بخط مائل حرف فارغة لأنه تبين أن تتمكن من استخدام malloc تخصيص أي شيء: رجات، سلاسل، المصفوفات، العوامات، والهياكل الطلابية. يمكنك استخدام malloc بشكل عام تماما. أنه لا يهتم أو أن تعرف ما كنت لتخصيص الذاكرة. لذلك سيكون من قبيل الزهو لmalloc لوضع 0 \ في نهاية كل جزء من الذاكرة مما يتيح لك انها لأن هذا \ 0 الشيء هو مجرد اتفاقية لسلاسل. ليس استخدامه لرجات، انها لا تستخدم ليطفو، ليست استخدامه للطلاب. وبالتالي فإن مسكتك مع malloc هو أن العبء يقع كليا على لك مبرمج لنتذكر كم كنت بايت المخصصة وعدم استخدام أي وقت مضى للحلقة أو حلقة في حين وتجاوز الحدود من قطعة من الذاكرة كنت قد أعطيت. وبعبارة أخرى، بمجرد تخصيص الذاكرة، لا يمكنك طرح نظام التشغيل، أوه، بالمناسبة، كيف كبيرة من قطعة من الذاكرة كان ذلك؟ انها تماما متروك لكم لنتذكر اذا كنت بحاجة الى تلك القيمة. لذلك دعونا نرى كيف أبدأ في استخدام هذه الذاكرة. في خط 28 و 29 لماذا أفعل هذا؟ انظروا فقط التعقل الكلي. فقط في حال حدث خطأ ما، أطلب بعض مبلغ مجنون من الذاكرة أو لقد أشياء كثيرة قيد التشغيل على الكمبيوتر أن هناك فقط ذاكرة كافية، شيء من هذا القبيل، وأنا على الأقل تريد أن تحقق لاغية. في الواقع، فإن معظم أجهزة الكمبيوتر تعطيك الوهم بأن كل برنامج يمكن استخدام مجمل RAM الخاص بك، ولكن على الرغم من ذلك، إذا كان المستخدم أنواع في سلسلة طويلة بعض الجنون ربما لانهم رجل سيء وانهم في الواقع محاولة لتحطم البرنامج أو الإختراق في ذلك، تريد على الأقل التحقق من القيمة المرجعة من malloc وما إذا كان يساوي فارغة. وإذا كان كذلك، دعونا فقط إنهاء الآن لأنني لا أعرف ماذا أفعل في هذه الحالة. كيف يمكنني نسخ السلسلة؟ هناك عدد قليل من الطرق للقيام بذلك. هناك نسخ شارع وظائف في C، ولكنه سوبر بسيطة بالنسبة لنا للقيام بذلك على الطراز القديم الطريق. اسمحوا لي أولا معرفة ما هو طول ليالي. كان يمكن أن أضع هذا في حلقة ولكن بدلا من ذلك أنا فقط وضعت بها هنا من أجل الوضوح. حتى الآن لا يوجد يخزن طول السلسلة الأصلية، والتي على ما يبدو 5. ثم في حلقة لبلدي أنا من 0 بالتكرار على ما يصل إلى ن، وعلى كل التكرار أضع ق [I] داخل ر [أنا]. وهذا ما يعني أنا مع بلدي 2 أصابع مشيرا في سلاسل من قبل. لأن هذا لحلقة بالتكرار مثل هذا، انا ذاهب الى أن النسخ في ساعة هنا، ه إلى هنا، l الى هنا لأن هذا هو ثانية، هذا هو ر. وأخيرا ثم في خط 35 لماذا أفعل هذا؟ ولست بحاجة للتأكد من أن أنا ر إنهاء السلسلة. وأنا فعلت هذا ليكون بهذه الطريقة السوبر صريحة. ولكن أقترح، شخص ما، إذا كنت تستطيع، بطريقة مختلفة للقيام بذلك. لا حاجة لي حقا خط 35. هناك طريقة أخرى للقيام بذلك. نعم. >> [استجابة الطالب غير مسموع] >> قلها بصوت أعلى. [طالب] أقل من أو يساوي. بالضبط >>. يمكن أن نقول فقط أقل من أو يساوي N، التي بشكل عام كانت سيئة لأن دائما تقريبا عندما نذهب تصل إلى مساو لشيء نعتمد نذهب بعيدا جدا 1 الخطوة. ولكن تذكر، كم بايت ونحن لم تخصص؟ خصصنا التوابع strlen من ليالي، لذلك 5 + 1 ليصبح المجموع 6. حتى في هذه الحالة يمكن أن نفعل شيئا من هذا القبيل بحيث اننا نسخ وليس فقط ولكن أيضا مرحبا 0 \ في النهاية. بدلا من ذلك، يمكن أن نستخدم دالة يسمى شارع نسخة، strcpy، ولكن لن يكون ذلك متعة ما يقرب من ذلك بكثير. ولكن هذا كل ما يفعله تحت غطاء محرك السيارة. وأخيرا ثم، ونحن نفعل الشيء نفسه كما كان من قبل. I الاستفادة ر وبعد ذلك يدعون أن يبدو مثل هذا الأصلي ونسخة يشبه ذلك. لذلك دعونا نحاول هذا الآن. اسمحوا لي ان اذهب هنا. جعل copy2. سنقوم تكبير وتشغيل copy2. أنا ذاهب لكتابة مرحبا في صغيرة، بل صغيرة أحصل مرحبا مثل الأصلي ولكن رأس المال مرحبا للنسخة. ولكن لست فعلت حتى الآن. يجب أن أفعل شيء 1 مشاركة هنا. 46 و 47 وتحرير بوضوح الذاكرة، ولكن ماذا يعني ذلك في الواقع؟ ماذا أفعل، هل تعتقد، من خلال الدعوة خط 46 و خط 47؟ ما أثر ذلك؟ نعم. [رد الطالب غير مسموع] >> بالضبط. كنت مجرد قول نظام التشغيل، مهلا، شكرا لهذه الذاكرة. يمكنك الآن استخدام ذلك لشخص آخر. وهنا مثال على القيم القمامة. ولقد استخدمت هذه الذاكرة فقط من كتابة كلمة مرحبا في 2 أماكن، هنا، هنا، هنا، وهنا. لذلك هذا هو H-E-L-L-O-\ 0. ولكن بعد ذلك أعطي الكلمة خط 46 و خط 47، وأنت تعرف ما يحدث هناك من حيث الصورة؟ في الواقع، انتظر، هذه الصورة هي واحدة من العمر. يمكننا أن نجعل من مرة واحدة نسخة، هذا الرجل هو في الواقع لافتا هنا، لذلك دعونا إزالة أرقام مجردة فقط وبعيدا عن الأسهم لدينا مرة أخرى. ما يحدث في هذه الصورة عندما أعطي الكلمة الحرة؟ [رد الطالب غير مسموع] >> ولا حتى. إذا أعطي الكلمة الحرة على العلم والتكنولوجيا - نوع من السؤال خدعة - هذا الصورة لا تتغير في جميع لأن الدعوة والدعوة ليالي ر يروي فقط نظام التشغيل، مهلا، يمكنك استخدام هذه الذاكرة مرة أخرى، ولكن هذا لا يغير إلى فارغة أو بعض حرف خاص، فإنه لا يغير هذا، لا تغيير في ساعة أو البريد أو L أو L أو س في أي مكان إلى أي شيء آخر. من حيث الصورة، بمجرد الكلمة الحرة لا شيء يتغير. وهنا تكمن أصل القيم القمامة لأنه إذا كنت ثم لاحقا في هذا البرنامج نطلب من نظام التشغيل لمزيد من الذاكرة مع malloc أو GetString أو شيء من هذا القبيل ونظام التشغيل يقول، بالتأكيد، لدي 12 بايت من الذاكرة تحرير لأول مرة، استخدام هذه، ما أنت ذاهب لتسليم؟ وأنت تسير لتسليم قطعة من الذاكرة التي كنا عادة رسم مع علامات استفهام، ولكن ما هي تلك علامات استفهام؟ انهم يحدث ليكون H-E-L-L-O، H-E-L-L-O. هذه هي قيمنا القمامة الجديد بمجرد تحرير تلك الذاكرة. هناك ضمنا العالم الحقيقي هنا أيضا. هذا يحدث للعلاقة مع ذاكرة الوصول العشوائي، ولكن أجهزة الكمبيوتر فعلا نفس الشيء مع القرص. سوف نتحدث عن هذا بشكل خاص مع مجموعة مشكلة المستقبلية التي تركز على الطب الشرعي. ولكن ما يحدث في الواقع إذا كان لديك بعض الملفات الحساسة المالية على سطح المكتب أو بعض JPEG سطحية وكنت اسحبه إلى سلة المهملات الخاصة بك، ماذا يحدث عندما اسحبه إلى سلة المهملات أو سلة المهملات؟ كنت تعرف ما كنت أتحدث عنه. [ضحك] ماذا يحدث عندما كنت قد جر إلى أن الأدلة سلة المهملات أو سلة المهملات؟ [رد الطالب غير مسموع] حسنا، حذرا جدا. ماذا يحدث عندما كنت تفعل ذلك؟ الجواب القصير هو لا شيء، أليس كذلك؟ ملف سطحية أو حساسة لا يزال مجرد الجلوس هناك في مكان ما في القرص الصلب. معظمنا على الأقل قد تعلمت بالطريقة الصعبة التي تحتاج إلى إفراغ القمامة الخاص بك أو سلة المحذوفات لحذف الملفات في الواقع. وبالفعل، عند النقر بزر الماوس الأيمن فوق أو السيطرة على القمامة الخاص بك يمكن أو اختر ملف، أو أيا كان فارغة المهملات وتقوم بإفراغ سلة المهملات في الواقع أو سلة المهملات، ثم ما يحدث بالفعل لهذه الصورة؟ لا شيء أكثر. حتى لا يحدث أي شيء في الواقع على القرص. وإذا كان لنا أن أتطرق فقط مؤقتا والكتابة - I'll مجرد استخدام الجزء الخلفي من هذا. حتى الآن القصة يتغير من RAM، وهو المكان الذي توجد برامج بينما كنت تشغيلها، إلى القرص، وهو حيث يتم تخزينها على المدى الطويل حتى عندما انقطع التيار الكهربائي، في الوقت الراهن - ونحن سوف نعود إلى هذا في المستقبل - دعونا نتظاهر فقط أن هذا يمثل داخل القرص الصلب لجهاز الكمبيوتر الخاص بك لأن مرة في اليوم تستخدم لتكون الأقراص الدائرية، مثل الكثير من الأقراص المرنة. حتى إذا كان لديك بعض ملف Excel الحساسة، قد يستغرق الأمر ما يصل هذا جزء من الذاكرة على القرص جهاز الكمبيوتر الخاص بك، وأنا مجرد رسم 1S و 0s نفس التعسفي. عند سحب ملف من هذا القبيل إلى القمامة الخاص بك يمكن أو سلة المهملات، لا شيء يحدث لأن حرفيا أبل ومايكروسوفت قد قررت فقط يمكن القمامة وإعادة تدوير بن هو في الحقيقة مجرد عنصر نائب مؤقتة. ربما في نهاية المطاف سوف OS إفراغ ذلك لك، ولكن عادة، فإنه لا يفعل أي شيء، على الأقل حتى كنت منخفضة حقا على الفضاء. ومع ذلك، عندما تذهب إلى سلة المهملات فارغة أو فارغة سلة المهملات، وبالمثل، لا شيء يحدث لهذه الصورة. كل ما يحدث هو في مكان آخر على جهاز الكمبيوتر الخاص بك، وهناك نوع من الجدول. انها نوع من مثل ورقة الغش القليل الذي يقول ذلك، دعنا نقول، resume.doc، حتى سيرتك الذاتية في ملف مايكروسوفت وورد كان يعيش في مكان 123 بشأن القرص الثابت، ليس في الذاكرة وليس في RAM ولكن على القرص الثابت، وبك حياة سطحية JPEG في 456، وملف إكسل يعيش في 789 أو في أي مكان. عند حذف الملفات عن طريق إفراغ سلة المهملات أو في الواقع في سلة المهملات، هذه الصورة لا يتغير. وو 0s 1s على القرص الصلب لا تذهب إلى أي مكان. ولكن هذا الجدول، قاعدة البيانات هذه القليل من نوع ما، لا التغيير. عند حذف سيرتك الذاتية، كما هي على الرغم من حذف الملف في بعض المعنى، ولكن كل جهاز الكمبيوتر لا تنسى حيث يتم هذا الشيء يعيش على محرك القرص الثابت. وو 0s 1s التي تشكل سيرتك الذاتية أو أي من هذه الملفات الأخرى لا تزال على حالها. حتى إذا كنت فعلت ذلك دون قصد، لا يزال هناك احتمال غير الصفر أن يمكنك استرداد البيانات باستخدام نورتون المرافق أو بعض البرمجيات التجارية الغرض الذي في الحياة هو العثور على 0S و1S التي نوع من تيتم، نسيت هنا ولكن تركت هنا، بحيث يمكنك الحصول على البيانات الخاصة بك مرة أخرى. أو أن المحققين الطب الشرعي مع الشرطة أو مكتب التحقيقات الفيدرالي تتخذ في الواقع القرص الصلب وتبدو في الواقع لأنماط و 0s 1s التي تبدو مثل ملفات JPEG، تبدو وكأنها ملفات Excel، واستعادتها على هذا النحو حتى لو كان جهاز الكمبيوتر قد نسي لها هناك. وبالتالي فإن الطريقة الوحيدة حقا لحذف البيانات، كما سنناقش في المستقبل، هو فرك أو مسح ملف أو القرص الثابت عن طريق - لا يمكنك حقا الحصول على التخلص من 0S و1S لأن خلاف ذلك كنت تبدأ مع محرك غيغابايت وكنت في نهاية المطاف مع القرص الصلب ميغا بايت إذا كنت باستمرار وحذف، حرفيا، و 0s 1s. ذلك ما يمكن أن تفعله إذا كنت تريد حقا لتغطية المسارات الخاصة بك والمشكلة الأساسية هي أن هناك ما زال 0S و1S على القرص؟ أرى شخص الإيماء الذي من شأنه كسر جسديا الجهاز. وهذا العمل. [ضحك] ولكن إذا كان هذا هو نوع من الحل باهظة الثمن، ما من شأنه أن يكون أكثر معقولة؟ نعم. >> [طالب] الكتابة لهم. الكتابة فوق >> لهم ماذا؟ >> [طالب] بيانات أخرى. بيانات أخرى. يمكنك الكتابة فوق القرص فقط مع 0S أو 1S أو 0S كل شيء، كل 1S. وهذا في الواقع ما بعض البرامج لا. يمكنك شراء البرامج أو حتى الحصول على البرمجيات الحرة، وبنيت حتى في لماك OS هذه الأيام، أقل من ذلك في ويندوز، هو القدرة على محو آمن. في الواقع، إذا كنت ترغب في تشغيل جميع المنازل اليوم إذا كان لديك جهاز ماكنتوش وقيام بذلك، إذا كنت قد حصلت على بعض الاشياء يمكن في القمامة الخاص بك، يمكنك القيام به فارغة المهملات الآمنة، الذي يفعل ذلك بالضبط. بدلا من محو الملفات فقط هنا، فإنه لا يمحو هنا و 0s 1s، بدلا من ذلك، فإنه يغير فقط كل منهم، على سبيل المثال، إلى نقطة و0S نقطة، نقطة. لذلك سوف واحدة من psets مستقبلك يكون في الواقع لاسترداد البيانات عمدا - الصور التي اتخذناها من الناس، الأماكن، والأشياء في الحرم الجامعي التي سوف نقدم صورة من بطاقة الذاكرة الطب الشرعي كاميرا الرقمية، وهو بالضبط نفس الفكرة - وعليك أن الطعن للعثور على الواقع الأنماط التي تمثل صور JPEG على القرص الثابت، مثل الكثير من ذلك الطالب السابقين الذين قرأت البريد الإلكتروني قبل بضعة أسابيع لم لاسترداد صور شقيقته. لماذا لا نأخذ استراحة 5 دقائق بالسيارة هنا، وسنقوم تجميع صفوفهم مع أكثر على الذاكرة. حتى هنا حيث الامور قليلا الاعتبار للرضوخ، ولكن هذه خطوة قوية جدا نحو فهم كل هذا وأكثر. هنا برنامج يسمى pointers.c. فمن بين عينة متاحة اليوم. لاحظت أن في الأسطر القليلة الأولى، و 19 إلى 22، كل ما تفعله هو شيء من هذا القبيل GetString والعودة عنوان، تخزينه في ليالي. من الآن فصاعدا لpset حتى 3 إذا كنت تريد ولكن pset 4 و على حيث يمكنك أن تبدأ في اتخاذ هذه العجلات التدريب من نفسك، ليس هناك من سبب التظاهر بأن سلاسل يعد له وجود. حسنا انها بالتأكيد لنبدأ قائلا * شار. بوصفها جانبا، في المراجع على الانترنت والكتب في كثير من الأحيان قد ترى النجم القادم لمتغير. قد تشاهد حتى مسافات حول جانبي ذلك. كل هذه صحيحة من الناحية الوظيفية. في الوقت الراهن، على الرغم من توحيد سنقوم على هذا النهج واضحة لجعل سوبر * أن شار هو مثل القول المؤشر حرف. هذا هو نوع البيانات. ثم اسم المتغير s في هذه الحالة. حتى لقد حصلت لدينا سلسلة ولقد دعا ليالي. ثم هنا أسفل تلاحظ أن أفعله في الواقع قليلا من الخداع. وهذا ما يسمى مؤشر الحساب، والذي هو نوع من السوبر بسيطة. بل يعني فقط إضافة إلى وطرح أعداد المؤشرات. ولكن هذا في الواقع يعمل. هذا البرنامج يطبع على ما يبدو سلسلة ق 1 حرف في كل سطر بحيث النتيجة النهائية - فقط حتى نتمكن من يفسد فيها هذا يحدث، وجعل المؤشرات، مؤشرات تشغيل، اسمحوا لي تكبير. والآن اسمحوا لي في شيء من هذا القبيل نوع أهلا وأدخل نوع ويطبع حرف في كل سطر 1. حتى ثانية قبل أن فعلنا هذا مع تدوين قوس مربع. كنت لدينا لحلقة وكنا نفعل printf من ليالي [i] و كنا نفعل ذلك مرارا وتكرارا، ومرة ​​أخرى مع ن مائل في نهاية كل سطر. ولكن هذا البرنامج يختلف. هذا البرنامج يستخدم، حرفيا، والحساب. ذلك ما يحدث هنا؟ بادئ ذي بدء، قبل تنفيذ هذه الحلقة حتى، ما، لمجرد أن يكون واضحا، هو في الواقع ليالي؟ S هو؟ >> [طالب] عنوان. عنوان >>. وانها عنوان، في حالة مرحبا، الحرف الأول في تلك الكلمة، التي هي ح. ذلك هو ق، في هذا المثال خاص، عنوان ح. فما معنى أن تفعل ق ط +؟ حسنا، أنا يبدأ عند 0 في هذه الحلقة ل. لقد فعلنا مرات عديدة أن. I سوف ترتفع إلى طول السلسلة، على ما يبدو. إلى ذلك التكرار الأول من هذه الحلقة، أنا هو 0 واضح. ولذلك فإن هذا التعبير يقول ق ط + - بدلا، ق، +0- أن من الواضح مجرد. فما هو * S هنا؟ الآن نحن نستخدم النجوم بطريقة مختلفة قليلا. اسمحوا لي أن تمضي قدما والتخلص من الانتهاء من ذلك لأن ر نتحدث عنه ونسخ من ر ق. الآن نحن نريد فقط أن أروي قصة تنطوي ق. وهكذا في هذه اللحظة، وبعد سلسلة النوع، عالمنا يشبه تماما فعلت قبل مع ليالي فقط تخزين عنوان ساعة وبشكل عام لافتا في سلسلة مرحبا. إذا كنت تفعل الآن مثل خط * (ق + ط)، دعونا نحاول ذلك. * حتى (ق + ط). اسمحوا لي أن تبسيط هذه لأن هذا هو 0، لذلك هذا هو * (ق +0). حسنا، الانتظار لمدة دقيقة. تبسيط أخرى. * هذا هو (ق). حسنا، الآن الأقواس هي نوع من الغباء، لذلك الآن دعونا فقط القيام * S. حتى في التكرار الأول من هذه الحلقة، أن الخط الذي يتم إلقاء الضوء (26 عاما) هي جميلة يعادل الكثير لطباعة هذا. ما هو نوع البيانات * ق؟ في هذا السياق، لأن النجم يحدث أن تكون بجانب ليالي نفسها، ولكن على نحو أكثر تحديدا، لأننا لم يعد يعلن ثانية، نحن لا خلق متغير بعد الآن، وليس هناك ذكر ل* شار في خط 26، ليس هناك ذكر لسلسلة الكلمة، ونحن فقط باستخدام متغير يسمى ثانية، اتضح الآن نجم لديه مختلفة قليلا و، باعتراف الجميع، وتخلط بين معنى. * S هنا تعني الانتقال إلى العنوان في ليالي والطباعة كل ما هو هناك. حتى هنا ليالي، ليالي * هو - نوع من مثل المزالق وسلالم، اتبع السهم - هنا. لذلك هذا هو S *. فما يحصل المطبوعة على التكرار الأول من الحلقة التي في خط 26؟ I طباعة ج٪، وهو نائب عن حرف، ثم \ n للسطر جديد. * (ق ط +) حيث i هو 0 هو فقط ذلك. فما شار أضع في لج٪؟ H. في التكرار التالي من حلقة - ترون على الارجح حيث يجري هذا - التكرار التالي هو 1 ط الواضح، لذلك هذا يعني ق +1، ثم الآن أنا بحاجة لأن الأقواس الآن النجم يحتاج أن أقول ذهاب إلى عنوان الذاكرة ليالي +1. ما هو ق؟ دعونا لفة العودة في الوقت المناسب ويقول هذا السهم الآن لا تفعل في الواقع لنا أي تفضل. دعونا أكثر تحديدا نقول ان هذا هو تخزين 123 عدد لأن بداية هذه السلسلة مرحبا، وهذا هو العنوان 123، وهذا هو 124، وهكذا دواليك. إلى ذلك التكرار الثاني عندما أقوله ليالي +1، وهذا مثل قوله 123 +1، والمعروف باسم 124، وذلك ما يحصل المطبوعة شار على التكرار الثاني؟ E في عنوان الذاكرة 124. ثم مرة أخرى +، 125، 126، 127، وهذا يتوقف حلقة الحمد لله قبل أن نصل هنا لأن أنا باستخدام التوابع strlen للتأكد من أنني لا تعول عالية جدا. بحيث هو أيضا ذلك. مرة أخرى، وهذا هو فقط كما لو كان علينا القيام به قبل أسبوع. اسمحوا لي أن الكتابة على السطر أدناه على الرغم من أننا لا نريد أن نفعل الاثنين معا. هذا مطابق لهذا الآن. ذلك على الرغم من سلسلة ليالي، وكنا اصفا اياه لأسابيع، ق هو في الحقيقة * شار. إذا كان الأمر كذلك نريد أن نكون الشرج السوبر، انها حقا مناسبة لكتابة حرف معين في الموقع إيث باستخدام هذه العناوين الرقمية والمشغل هذا النجم، ولكن بصراحة، هذا هو أنظف فقط الكثير. وهذا ليس سيئا. لا يوجد سبب ليتوقف عن فعل خط 27 هنا، ولكن 26 هو نفسه وظيفيا، وانها هي نفسها وظيفيا لأسباب بالضبط التي كنا نناقش حتى الآن. وأخيرا، 29 من الممارسات الجيدة فقط. الدعوة مجانية من ليالي يعني أن الآن كنت يعيد الذاكرة التي GetString أعطاك لأن مرة أخرى، كما ذكرت الاثنين، GetString لأسابيع وقد تم إدخال خلل في التعليمات البرمجية. وقد كان رمز لأسابيع التسرب في الذاكرة حيث كنت قد تم طرح GetString للذاكرة ولكن كنت قط اعطاء إعادته. والتي تم اختيارها من قبلنا عمدا تربويا لأنه مجرد الكثير للتفكير في وقت مبكر. ولكن الآن نحن بحاجة الى مزيد من التماثل. إذا كنت تسأل الكمبيوتر للذاكرة، كما هو الحال بالنسبة لGetString، كما هو الحال على ما يبدو لmalloc، يجب عليك الآن فصاعدا ل4 pset أيضا مجانا أي ذاكرة من هذا القبيل. تلاحظ هذا يختلف عن القول ن الباحث. لا تحتاج لتحرير هذا لأنك لم تدع GetString وكنت لا ندعو malloc. وحتى إذا دعاكم GetInt كما سنرى في نهاية المطاف، GetInt لا تخصيص الذاكرة بالنسبة لك لأنك يمكن أن تمر في الواقع حول أعداد صحيحة ويطفو وحرف مجرد وسيلة كنا نقوم به منذ أسابيع. سلاسل، رغم ذلك، هي خاصة لانهم حقا سلسلة من حرف متعددة. حتى انهم مختلفة تماما من حرف ويطفو ورجات وما شابه ذلك. ولكن سوف نعود إلى فترة طويلة قبل ذلك. ثم أي أسئلة حول هذا بداية من المؤشرات؟ نعم. [سؤال الطالب غير مسموع] آه، سؤال جيد جدا. واحدة من الاشياء القليلة C في الواقع لا بالنسبة لك، وهو مناسب، وأنها شخصيات للكم ما هو حجم من نوع البيانات ويقوم هذا النوع من ثم الضرب بالنسبة لك. هذا لا يهم في حالة حرف دائما تقريبا بسبب شار هو 1 بايت، ولذلك فإن هذا يعمل فقط. ولكن من أجل المناقشة، إذا كنت تطبع في الواقع صحيحة وكنت تحاول طباعة بعض الصفحات القيمة التي تم لافتا في عدد صحيح، وبالمثل كنت لا تحتاج إلى القيام به + 4 * ط لأن مجرد الباحث هو 4 بايت. المؤشر الحسابي يعني أن المترجم C والقيام بكل ما الرياضيات بالنسبة لك. كل ما عليك هو أن نهتم عد في نوع من الشعور الإنساني. نعم. [طالب] إذا قمت بتعريف سلسلة داخل حلقة For، هل لديك اطلاق سراحه في وقت لاحق؟ سؤال جيد. إذا كنت داخل أعلنت سلسلة من حلقة ل، لا تحتاج إلى تحرير في وقت لاحق؟ تحتاج فقط لتحرير الذاكرة التي تخصص مع GetString أو مع malloc. إذا كان الأمر كذلك كنت أقول شيئا مثل - اسمحوا لي أن وضع الأقواس المتعرجة حتى الآن يرتبط كافة التعليمات البرمجية. إذا كنت فعلت شيئا، وإن كان buggily، مثل هذا، تشار * ر = ق، أنت لا تحتاج إلى ر ر الحرة لأن لا ينطوي على أي ذكر لmalloc أو GetString. على النقيض من ذلك إذا كنت فعلت ذلك، GetString، ثم نعم، قد تحتاج إلى ر الحرة. في واقع الأمر، فرصتك الوحيدة للقيام بذلك هي الآن داخل هذه الحلقة، لنفس الموضوع من نطاق لقد ناقشنا ذلك في الماضي. وإلا كنت على تخصيص الذاكرة، وتخصيص الذاكرة، وتخصيص الذاكرة، وفي نهاية البرنامج لأنك خارج هذا حلقة، ر غير موجود، ولكنك أبدا قال نظام التشغيل أن كنت لا تحتاج بعد الآن أن الذاكرة. وقبل مرور وقت طويل، لpset 4 أو 5 سنقوم تجهيز لكم مع برنامج يسمى Valgrind، وهو ما يماثل في الروح لGDB في هذا انها حصلت على بعض الشيء من واجهة غامضة، ولكن الغرض منه في الحياة هو لمساعدتك. وValgrind هو البرنامج الذي سوف البحث في المستقبل البرامج أبحث عن تسرب الذاكرة، أو ما إذا كان من GetString malloc، التي سوف نبدأ باستخدام جميع ونحن أكثر التوقف عن استخدام مكتبة CS50 قدر. ونحن الآن في نهاية المطاف نوع من المفردات وهذا النوع من نموذج العقلية من الناحية النظرية التي لحل هذا البرنامج كسر. حتى في هذا البرنامج كسر، وتبادل يعمل داخل المبادلة ولكنه لم يعمل فعليا في تمرير الرئيسية الرئيسية لفي X و Y، استدعاء، وصدرت تلك القيم في طريق، إذا جاز التعبير. وقدمت نسخ منها لمبادلة. بحلول نهاية المبادلة، وألف وباء وبالفعل تم تبادل، ولكن بطبيعة الحال كان x و y، كما ناقشنا يوم الاثنين، لم يكن. لذلك أقترح هنا أن باللون الأخضر هذا هو في الواقع الحل هنا. وفعلا، اسمحوا لي أن التحرك نجوم بلادي فقط أن تكون متسقة على الرغم من ذلك، مرة أخرى، وظيفيا هذا لا يهم. في الأسابيع المقبلة سوف نشرح عندما والسبب في ذلك لا يهم. حتى الآن باللون الأخضر هو الحل. بصراحة، يبدو مجموعة كبيرة ميسييه لأن لدي كل هذه النجوم. اسمحوا لي أن أشير إلى شيء واحد. السطر العلوي هنا حيث تقول الباحثة ل* والباحث * ب تقوم أساسا نفس الشيء كما فعلت دائما. فإنه يعلن الوسائط أو معلمات 2 لمبادلة، يسمى الأول منها هو مؤشر على كثافة العمليات، والثاني منها هو مؤشر كثافة العمليات يسمى ب. الشيء الوحيد الجديد في هذه المرحلة هو أن هناك نجما هناك. ماذا يعني ذلك؟ A ليست الباحث، ليست ب الباحث. A هو عنوان لكثافة العمليات وب هو عنوان لكثافة العمليات المختلفة. هنا أسفل، وهذا هو المكان الذي يحصل لي من الاعتراف C مربكة. الآن نستخدمه نجم، لكنه لا يملك معنى مختلف في هذا السياق. لأننا لا يعلن المؤشرات ونحن هنا، نحن هنا يعتبر إلغاء مرجعية الأشياء. من الناحية الفنية كان الأمر كذلك، نجم في هذا السياق من السطر الأول والثاني، والثالث داخل المبادلة هي المشغل إلغاء مرجعية، وهو ما يعني فقط الذهاب إلى هناك. وذلك فقط بعد إصبعي السهم لح، * وسيلة الذهاب الى هذا العنوان وتجد لي الباحث أن هناك. * تعني ب الانتقال إلى العنوان وتمرير لي ما هو هناك. لذلك دعونا إعادة رسم الصورة من يوم الاثنين تستخدم الآن كومة من الإطارات، واحد أسفل التي ستكون الرئيسي، واحد من أعلى التي ستكون المبادلة بحيث يبدو عالمنا، تماما مثل الاثنين من هذا القبيل. هنا قطعة من الذاكرة التي الرئيسي هو الذهاب الى استخدامها. أذكر من يوم الاثنين إلى أن البرنامج كان فقط 2 المتغيرات، واحد يسمى X واحدة تسمى Y، وكنت قد وضعت الأرقام 1 و 2 هناك. الآن أنا عندما أدعو مبادلة مثل فعل يوم الاثنين، عندما كنت في السابق النسخة الحمراء من هذا البرنامج، والتي تبدو مثل هذا، حصلت معلمات 2، ألف وباء، وماذا نكتب هنا وهنا؟ فقط 1 و 2، ينسخ حرفيا من x و y. اليوم نغير ذلك. اليوم بدلا من تمرير رجات في البندين أ و ب ونحن في طريقنا لتمرير عناوين في 2. يحدث هذه العناوين للإشارة إلى رجات، ولكن هذه العناوين لا رجات أنفسهم. هم عناوين. انها مثل العنوان البريدي بدلا من ذلك. حتى الآن نحن بحاجة إلى إعطاء نفسي فقط بشيء من التفصيل على الشاشة. هذا هو جهاز الكمبيوتر الخاص بي الذاكرة كما انها كانت طوال اليوم. ونحن الآن بحاجة إلى بعض نظام ترقيم التعسفي. لذلك دعونا نقول فقط، فقط عن طريق الصدفة، أن هذا هو عنوان الذاكرة 123 و 124. دعنا نقول فقط هذا هو 125، وهذا هو 126، وهكذا دواليك، ولكن هذا التعسفي تماما. نحن بحاجة فقط بعض نظام الترقيم في ذاكرتي. حتى الآن عندما تخرجت بالفعل في x و y، وأنا لن تمر في x و y؛ أنا ذاهب لتمرير في العنوان البريدي، إذا جاز التعبير، من x و Y من بحيث ما يحصل المخزنة هنا وهنا ليس 1 و 2، ولكن إذا كنت يمكن أن نرى النص الذي قدمته الصغيرة، ويحصل على ما مر من هنا وهنا؟ [رد الطالب غير مسموع] >> بالضبط. يحصل هنا وضعت 123 124 يحصل على وضع هنا. الآن، لكنت النجم بهذه الطريقة السطر الأول جدا هنا حتى في القمة، برنامجي يعرف ذلك تماما 123 و 124، على الرغم من انهم من الواضح الأعداد الصحيحة أي أن الإنسان يمكن أن تلاحظ، ينبغي تفسيرها على أنها عناوين وعناوين رقمية. فهي ليست في حد ذاتها رجات، وانهم عناوين، وهذا لأنني قد وضعت صراحة النجوم هناك. حتى الآن في خط بلدي الأول والثاني، والثالث من التعليمات البرمجية الفعلية ما يحدث هنا؟ دعونا رسم بقية الصورة. هو تماما مثل TMP كان يوم الاثنين. خاص حول TMP شيئا. انها مجرد 32 بت متغير المحلية، وداخل أنني على ما يبدو تخزين قيمة * أ. الآن، إذا قلت للتو TMP = A، ما يمكن أن أضع هنا؟ >> [طالب] 123. 123. ولكن هذا ليس ما أفعله. أنا أقول TMP = * أ. الوسائل نجوم الذهاب إلى هناك. حتى هنا هو، 123. كيف أذهب إلى هناك؟ مثل التظاهر هناك سهم. حسنا، هناك هو عليه، 1. وذلك ما يحصل المخزنة في TMP، على ما يبدو؟ فقط 1. لذلك وبعبارة أخرى، هو TMP * A، * وسيلة الانتقال إلى العنوان الموجود حاليا في، وهو على ما يبدو 123. حسنا، نحن هنا في موقع 123، أرى الرقم 1، لذلك أنا ذاهب الى وضع الرقم 1 هناك. الآن ماذا أفعل في السطر 2، * أ = ب *؟ هذا هو واحد أكثر من ذلك بقليل لأنه الآن يشارك ما هو؟ انها 123. * لذلك هو أين؟ الحق حيث كنت من قبل. لذلك يذهب هناك. حسنا. الآن، وأخيرا، وبعد ذلك سيبدأ هذا في النهاية إلى معنى، كما نأمل، * يعني ب ب ما في؟ 124. لذلك أنا بحاجة للذهاب إلى هناك، وهو 2. فماذا أضع أين؟ 2 يذهب الى هنا ل* ب * يذهب الى أ. ولذا فإنني سوف نفعل ذلك. ويمكنك ان ترى بالفعل، ربما، أننا حتى أقرب بكثير لحل هذا الغباء، المشكلة بسيطة بشكل صحيح لأول مرة لأنه الآن لا يزال لدينا يتذكر ما كان X، لدينا 2 نسخ، باعتراف الجميع، من Y، ولكن الآن يقول السطر 3 * ب. حتى هنا ب. * تعني ب الذهاب إلى هناك. فأين هو موقع 124؟ انها على ما يبدو هنا. فماذا أضع هنا؟ من الواضح، TMP. حتى الآن أن أفعل هذا. لذلك أنا هنا لديك 1 و 2 هنا. والآن ماذا عن كل هذا، و123، 124، و 1 في؟ في أقرب وقت مع عودة المبادلة، هذه الذاكرة هو جيدة مثل فقدان لأن بمجرد عودة مبادلة، ونظام التشغيل حر في استخدام هذه الذاكرة مرة أخرى في المستقبل. المعلومات الرئيسية في الذاكرة في الجزء السفلي من هذا المكدس يسمى العصي حولها. وهكذا أصبح لدينا أخيرا الآن نسخة العمل. اسمحوا لي ان اذهب الى swap.c، وتلاحظ ما يلي. في الجزء العلوي من البرنامج لقد قمت بتغيير النموذج الباحث ان اكون * لوالباحث * ب. وبالتالي فإن الشيء الوحيد الذي تغير للذهاب من اللون الأحمر، الذي كان سيئا، إلى اللون الأخضر، وهو أمر جيد، وأضفت هذه النجوم اليوم. ولكن بعد ذلك إلى هنا في مبادلة نفسها كان لي لنسخ ولصق فقط ما كان على الشريحة. لدي هنا نجم، نجمة هنا - الذي يتطابق مع النموذج - ثم كل هذه الأشياء الآن نجوم باستثناء TMP لأن استخدام متغير مؤقت، لا يوجد شيء جديد هناك. أنا فقط بحاجة التخزين المؤقت لكثافة العمليات. لذلك نحن لسنا بحاجة إلى نجم هناك. نحن بحاجة فقط للنجم حتى نتمكن من عبور هذا النوع من الحدود التعسفي بين هذه الأطر 2 في ذاكرة الكمبيوتر الخاص بي. لكن شيئا واحدا يجب أن يتغير مشاركة، وكنت قد لمحت بالفعل و. ما الخط الآخر يختلف من الواضح الآن؟ >> [طالب] & X. نعم، 25 ذلك هو السطر الأخير من التعليمات البرمجية ولست بحاجة لتغيير لهذا العمل. وقبل أسبوع وحتى يوم الاثنين السطر 25 يشبه هذا، مبادلة X و Y، وكانت مكسورة فقط هذا لأنه إذا كنت أقول المبادلة (X، Y) انك تعطي نسخا من x و y لمبادلة، فإنه يفعل الشيء لها، ولكن كنت في الواقع أبدا تغيير x و y نفسها. لذلك حتى لو كنت لم أر قط قبل هذه الشخصية مع العطف في التعليمات البرمجية، اتخاذ مجرد تخمين. ماذا تفعل العطف، على ما يبدو؟ [طالب] تحيط العنوان. تحيط >> العنوان. لذلك يقول العلامة تعطيني عنوان X. الذي يعرف أين هو؟ فإنه يحدث أن تكون 123. لا يهمني. فقط أعطني عنوان X. وY يعني أن تعطيني عنوان ذ. وعند هذه النقطة قصة يتسق تماما مع الصورة ضعنا قبل لحظة. ولذا فإنني سوف أعترف المؤشرات، وبالتأكيد بالنسبة لي عندما بدأت لأول مرة تعلم هذه، كانت بالتأكيد واحدة من أصعب الأمور أن التفاف حول ذهني. ولكن ندرك، لا سيما ونحن الاستمرار في اللعب مع هذه الأنواع من الأشياء، إذا كنت كسر عليه لفرز هذه بسيطة السوبر رتيبا فكريا المشاكل من مجرد الانتقال الأرقام حول، الإجابة على الكثير من الارتباك مع مؤشرات يمكن حقا أن تستمد من هذه الآليات الأساسية للغاية. وهنا عنوان. الذهاب إلى هناك مع النجم. أو العكس، وهنا العطف. معرفة ما هو في الواقع عنوان. حسنا. فأين هو كل من هذه الذاكرة يأتي من؟ لقد رسم لنا هذه الصورة عدة مرات، وأظل واعد سنعود إليها، ولكن هنا هو تمثيل ذاكرة الكمبيوتر وهذا أكثر من ذلك بقليل وصفت من السبورة لدينا هنا هو. الجزء في أعلى النص يمثل ما فيما يتعلق برنامجك؟ [رد الطالب غير مسموع] >> عذرا؟ أقول مرة أخرى. [طالب] البرنامج الفعلي. البرنامج الفعلي >>. وبالتالي فإن ضجيج و 0s 1s التي قد جمعت بعد كتابة رمز C ثم تشغيل وينتهي توليد و 0s 1s المطاف الحصول على مدسوس هناك في الذاكرة لأن عند النقر المزدوج على أيقونة على جهاز ماكنتوش أو كمبيوتر شخصي أو تشغيل أمر مثل ماريو في موجه الخاص بك، الخاصة بك و0S 1S من القرص الحصول على تحميل في الذاكرة بحيث يمكن للكمبيوتر التلاعب بها وتنفيذها بسرعة أكبر. البيانات والبيانات تهيئة ذلك غير مهيأ، فإننا لن نتحدث كثيرا عن تلك، ولكن هذه هي مجرد المتغيرات العالمية. يعني تهيئة المتغيرات العالمية الذي أعطيته لقيم؛ غير مهيأ يعني المتغيرات العالمية التي لم تعط حتى الآن إلى القيم. ثم هناك هذه متغيرات البيئة التي سوف موجة تماما في يدي، لكنهم هناك ويقوم بتخزين أشياء مثل اسم المستخدم الخاص بك ونوع آخر من تفاصيل انخفاض مستوى. لكن عصيرا قطعة من تخطيط الذاكرة الخاصة بك هو هذا الشيء يسمى كومة كومة ولل. المكدس مرة أخرى، أن تكون واضحة، هي ذاكرة الذي يتم استخدامه كلما دعت الوظائف، كلما كانت هناك متغيرات المحلية وكلما كان هناك يجري تمرير معلمات حولها. كل ذلك يحدث في المكدس. كومة نحن لم نتحدث عنها، ولكن اتخاذ تخمين الذي يستخدم الكومة. مجرد قطعة مختلفة من الذاكرة. يحدث التي يمكن استخلاصها هنا في الأعلى، ولكن هذا التصويرية اتفاقية التعسفي. من الذي على ما يبدو تم استخدام الذاكرة من كومة لأسابيع؟ انه من الناحية الفنية ولكن كنت غير مباشرة. >> [طالب] GetString. GetString وmalloc. حتى هنا الفرق الأساسي. تعرف على مدى الاسابيع القليلة الماضية انه اذا كنت في حاجة الذاكرة، يعلن مجرد متغير. إذا كنت في حاجة الكثير من الذاكرة، تعلن مجموعة داخل حق وظيفة الخاص بك. ولكن المشكلة التي تواجه كنا حافظ هو إذا قمت بتعريف المتغيرات محليا داخل من الوظائف، بمجرد أن ترجع الدالة، فإن ما يحدث لذكرى تلك المتغيرات و؟ مجرد نوع من انها لم تعد لك، أليس كذلك؟ يختفي فقط نوع من الناحية النظرية. ما زال هناك جسديا، ولكن من الواضح أنه لم يعد حقك في استخدام. وهذه مشكلة من الواضح إذا كنت تريد أن تكتب وظائف في الحياة في الواقع أن تخصيص الذاكرة ولا يعيدها على الفور. مثال على ذلك: الغرض GetString في الحياة هو أن ليس لديهم فكرة مسبقا كيف كبيرة من سلسلة انا ذاهب الى اكتب على لوحة المفاتيح، ولكن انها حصلت على أن تكون قادرة على تخصيص ذاكرة لعقد ديفيد أو مرحبا أو مقال كله أن المستخدم قد كتبته فيه. لذلك تم استخدام GetString malloc. Malloc ذلك يجب استخدام المكدس لا؛ بدلا من ذلك انها تستخدم هذا الشيء يسمى الكومة. لا يوجد شيء مختلف عن الذاكرة. انها ليست أسرع أو أبطأ أو أي شيء من هذا القبيل. انها فقط جسديا في موقع مختلف. لكن القاعدة هي أن الذاكرة هذا ما تخصيصها على كومة لن تؤخذ بعيدا عنك حتى استدعاء - اتخاذ تخمين - مجانا. على النقيض من ذلك، أي أن تسأل عن الذاكرة على كومة من خلال الإعلان مجرد مجموعة أو الإعلان عن متغير مثل الذي نقوم به لمدة أسابيع، أن افتراضيا ينتهي على المكدس. وأن يعمل كبيرة 90٪ من الوقت، ولكن في تلك المناسبات النادرة حيث تريد تخصيص الذاكرة والاحتفاظ بها حولها، فأنت بحاجة إلى استخدام دالة مثل malloc. وقد استخدمنا أو وظيفة مثل GetString، والذي بدوره يستخدم malloc. دعونا نرى أين هذا قد كسر ثم أخذ نظرة خاطفة على Binky. سوف نعود إلى ذلك في المستقبل. هنا برنامج سوبر البسيطة التي في خطوط 2 الأولى يفعل ما؟ في اللغة الإنجليزية، ماذا هذه أول 2 الأسطر من التعليمات البرمجية داخل تفعل الرئيسية؟ [رد الطالب غير مسموع] الحذر. لا تعطيني عنوان X أو Y. [طالب] يعطي مؤشرات إلى رجات. جيد >>. تعطي مؤشرات لي 2 إلى أعداد صحيحة. وبعبارة أخرى، وإعطاء لي 2 قطع من الذاكرة التي أظل الرسم اليوم، على الرغم من مسح I عليه الآن، والساحات. دعا أحد أن يعطي لي 2 قطع من الذاكرة، واحدة تسمى X، Y - دعا في وقت سابق قلت لهم العلمية والتكنولوجية - وما هو نوع من الذاكرة التي قطعة؟ انه سيكون لتخزين عنوان. انها من نوع int *. وبالتالي فإن وجود عنوان الباحث في نهاية المطاف يعيش في x، وعنوان الباحث من العيش في نهاية المطاف في Y، ولكن في البداية، ما هو داخل x و y؟ من يدري؟ القمامة القيم. أنه ليس لديها ما تفعله مع المؤشرات. إذا كنا لم تضع شيئا هناك، من يدري ما هو في الواقع هناك؟ الآن، س. ماذا يحدث هنا؟ هذا هو شرعي الآن لأن x هو مؤشر. انها * INT. بحيث يعني أنني يمكن أن تضع في العاشر من عنوان بعض قطعة من الذاكرة. ماذا malloc العودة؟ الكمال، فإنها ترجع عناوين، عنوان البايت الأول في قطعة كاملة من الذاكرة. كم بايت وهذا تخصيص ما يبدو، على سبيل المثال، في الأجهزة؟ ما هو حجم وكثافة العمليات؟ 4. إذا كنت تعتقد مرة أخرى إلى الأسبوع 1، انها ليست سوبر المهم أن نتذكر دائما أن، لكن في هذه الحالة فإنه من المفيد معرفة، 4 بايت. لذلك هذا هو تخصيص 4 بايت على كومة وانها تعود عنوان أول واحد للي تعسفية. الآن، ما هو X تفعل؟ A * X = 42 ويفعل ماذا؟ إذا في هذه المرحلة من القصة لدينا X، والتي تبدو مثل هذا مع بعض القيمة القمامة، هذا هو الآن مع بعض ذ قيمة القمامة، والآن في السطر 3 لقد خصصت 4 بايت. هذه الصورة تبدو أساسا مثل هذا. أو بشكل أكثر تحديدا، إذا كان هذا هو عنوان التعسفي 123، هذا ما يبدو الآن قصتنا مثل. * X = 42 يعني ماذا نفعل الآن؟ وهذا يعني الذهاب الى ال 123 عنوان ووضع رقم 42 هناك. ولست بحاجة لرسم هذه الخطوط لأننا لا نفعل السلاسل. يجب أن كنت قد كتبت للتو من هذا القبيل، وفقط لأجل المظاهرة، 42 كما نوعا من كثافة العمليات يستغرق الكثير من الفضاء، 4 بايت. بحيث ما حدث هناك، ولكن هناك مشكلة الآن. * ص = 13. ما الذي سيحدث هنا؟ المشكلة هي * Y في عالمنا مبسطة يعني فقط الانتقال إلى العنوان في ذ. ما في ذ؟ انها بعض القيمة القمامة. لذلك دعونا نفترض أن تلك القيمة هي 5551212 القمامة، شيء مجنون مثل هذا. * وسائل ذ تذهب لتناول 5551212. هذا مثل أكثر من هنا. كان غير موجود، على سبيل المثال. * حتى يحصل ذ 13 وسيلة أحاول أن ألفت هنا 13. لم يكن موجودا. لقد تجاوزت I الجزء من السبورة. ما يمكنني الحصول عليه؟ أن تجزئة رسالة خطأ خفي لأنني أسعى إلى وضعها في الذاكرة قيمة مثل 13 في المكان الذي لا وجود له. قد تبقى من برنامج العمل بخير، ولكن حتى هذه النقطة لم يكن. لذلك دعونا تحاول أن تقول هذه القصة. سوف نعود إلى ذلك مرة واحدة تحدثنا عن عرافة. دعونا نعود إلى هذا وتختتم مع هذا الشيء يسمى Binky، أذكر الذي هو أستاذ ستانفورد الجلوس في المنزل اللعب مع claymation، و ليحكي قصة البرنامج الذي بالضبط نفس. انها مجرد حوالي 3 دقائق طويلة. هنا لدينا Binky. [المتكلم الذكور على الفيديو] يا Binky، يستيقظون. حان الوقت للمتعة المؤشر. [Binky] ما هذا؟ التعلم عن مؤشرات؟ أوه، جودي! [المتكلم ذكر] حسنا، للبدء، أعتقد أننا ذاهبون في حاجة إلى مؤشرات زوجين. [Binky] حسنا. هذا الرمز الذي يخصص 2 مؤشرات يمكن أن نشير إلى أعداد صحيحة. [المتكلم ذكر] حسنا. حسنا، أرى مؤشرات 2، لكنهم لا يبدو أن تشير إلى أي شيء. [Binky] وهذا الحق. في البداية، مؤشرات لا تشير إلى أي شيء. وتسمى الأشياء التي تشير إلى pointees، ووضع لهم هي خطوة منفصلة. [المتكلم ذكر] أوه، الحق، الحق. كنت أعرف ذلك. وpointees منفصلة. إيه، لذلك كيف يمكنك تخصيص pointee؟ [Binky] حسنا. هذا الرمز يخصص pointee جديدة عدد صحيح، ويحدد هذا الجزء العاشر للإشارة إلى ذلك. [المتكلم ذكر] مرحبا، التي تبدو أفضل. لذلك عليها أن تفعل شيئا. >> [Binky] حسنا. وسوف أكون إلغاء مرجعية العاشر المؤشر لتخزين رقم 42 في pointee لها. لهذه الخدعة سوف أحتاج عصا سحرية من بلدي يعتبر إلغاء مرجعية. [المتكلم ذكر] عصا سحرية الخاص بك من يعتبر إلغاء مرجعية؟ هذا أمر عظيم. [Binky] وهذا هو ما يبدو وكأنه رمز. أنا تأسيسها لأول مرة وعدد ... [ظهرت الصوت] [المتكلم ذكر] يا نظرة، هناك تذهب. القيام بذلك على إلغاء مرجعية على X يتبع سهم للوصول pointee والخمسين، في هذه الحالة لتخزين 42 في هناك. مهلا، حاول استخدامه لتخزين الرقم 13 من خلال مؤشر آخر، ذ. [Binky] حسنا. سأذهب فقط أكثر من هنا إلى ص والحصول على الرقم 13 إقامة ثم أخذ عصا ويعتبر إلغاء مرجعية من مجرد ... [صوت أزيز] قف! [المتكلم ذكر] أوه يا، التي لا تعمل. أقول، Binky، لا أعتقد يعتبر إلغاء مرجعية Y هو فكرة جيدة لأن إنشاء pointee خطوة منفصلة وأنا لا أعتقد أننا فعلنا من أي وقت مضى. [Binky] هم، نقطة جيدة. [المتكلم ذكر] نعم. خصصنا ذ مؤشر لكننا أبدا تعيينها للإشارة إلى pointee. [Binky] هم، ملاحظ جدا. [المتكلم ذكر] مرحبا، كنت تبحث جيدة هناك، Binky. يمكنك إصلاحه بحيث نقطة Y إلى pointee نفس X؟ >> [Binky] بالتأكيد. سوف تستخدم عصا سحرية بلدي الإحالة المؤشر. [المتكلم ذكر] هل هذا سيكون مشكلة مثل من قبل؟ [Binky] لا، هذا لا تلمس pointees. يتغير مؤشر واحد فقط للإشارة إلى شيء آخر نفس. [ظهرت الصوت] [المتكلم ذكر] أوه، أرى. الآن نقطة Y لنفس المكان س. انتظر ذلك. الآن يتم إصلاح ذ. أنه يحتوي على pointee. لذلك يمكنك محاولة عصا من يعتبر إلغاء مرجعية مرة أخرى لإرسال أكثر من 13. [Binky] اه، حسنا. يذهب هنا. [ظهرت الصوت] [المتكلم ذكر] يا، أن ننظر في ذلك. يعتبر إلغاء مرجعية الآن يعمل على ذ. ولأن المؤشرات وتقاسم أن أحد pointee، وكلاهما راجع 13. [Binky] نعم، مشاركة. أيا كان. لذلك نحن ذاهبون لتبديل أماكن الآن؟ [المتكلم ذكر] يا نظرة، نحن في الخارج من الزمن. >> [Binky] ولكن - [المتكلم ذكر] فقط تذكر القواعد المؤشر 3. عدد 1، والهيكل الأساسي هو أن لديك مؤشر ويشير إلى أكثر من pointee. لكن المؤشر وpointee منفصلة، ​​والخطأ المشترك هو إقامة المؤشر ولكن أن ننسى أن يعطي هو pointee. عدد 2، يعتبر إلغاء مرجعية مؤشر يبدأ من المؤشر ويلي سهم على مدى للوصول pointee لها. كما نعلم جميعا، فإن هذا يعمل فقط إذا كان هناك pointee، أي نوع من يعود للحكم رقم 1. الرقم 3، وتعيين مؤشر مؤشر يأخذ واحدة وتغييره للإشارة إلى نفس pointee آخر المؤشر. حتى بعد الإحالة، فإن المؤشرات 2 نقطة إلى pointee نفسه. أحيانا يسمى هذا المشاركة. وهذا كل ما في الامر حقا. وداعا وداعا الآن. هذا هو Binky. هذا هو CS50. سنرى في الأسبوع القادم. [تصفيق] [CS50.TV]