[عزف الموسيقى] J. DAVID مالان: حسنا. هذا هو CS50، وهذا هو نهاية الأسبوع الرابع. وأحد المواضيع اليوم غير أن الطب الشرعي الرقمي، فن يتعافى من المعلومات. وبالفعل، على الرغم من كنت في خضم الحق الآن للسلام في ثلاثة والاختراق، الأسبوع المقبل، سيكون التركيز على بالضبط هذا المجال. حتى واحد من أروع وظائف في حياتي كان كان يعود في كلية الدراسات العليا، عندما كنت أعمل للالمحلية ميدلسكس المدعي العام لمقاطعة مكتب، تعمل الطب الشرعي به. ذلك أساسا، وماساتشوستس شرطة الدولة، في بعض الأحيان، عند العمل على حالات شأنه جلب أشياء مثل محركات الأقراص الصلبة والأقراص المرنة و بطاقات الذاكرة وما شابه ذلك. وأنها تسليمها لي ومرشدي، وكان هدفنا هو العثور على أدلة، إذا كان هناك أي، في هذه الوسائط. لمحات الآن، قد رأيتم هذا العالم من الطب الشرعي في وسائل الإعلام والتلفزيون والأفلام. ولكن كان لي وظيفة، و نحسب أن العالم، ليس تماما كأنك تراه. دعونا نلقي نظرة على ما ربما كنت قد رأيت. [VIDEO قراءة] -OK. الآن، دعونا الحصول على نظرة فاحصة على لك. [عزف الموسيقى] -Hold ذلك. تشغيل أن يعود. الإنتظار في الدقيقة. يسير في الاتجاه الصحيح. -هناك. تجميد ذلك. ، كامل الشاشة. -OK. تجميد ذلك. -Tighten حتى على ذلك، سوف؟ في -Vector على ذلك الرجل من العجلة الخلفية. -Zoom في الحق هنا على هذه البقعة. ، مع المعدات المناسبة، و يمكن تكبير الصورة وشحذ. وماذا هذا؟ ، انها برنامج تعزيز. هل بالإمكان كنت واضحا أن ما يصل أي؟ من أنا لا أعرف. دعونا تعزيزه. -Enhance القسم A6. أنا عزز من التفاصيل، و- من أنا أعتقد أن هناك ما يكفي لتعزيز. الافراج عنها لشاشتي. -I تعزيز انعكاس في عينها. يتم تشغيله من خلال هذا -Let تعزيز الفيديو. -Edgar، يمكنك تعزيز هذا؟ -شنق جرا. -I've تم العمل على هذا التفكير. انعكاس شخص -هناك في ل. -Reflection. -هناك هو انعكاس لوجه الرجل. انعكاس -THE! -هناك انعكاس. في -Zoom على المرآة. يمكنك ان ترى انعكاس. هل يمكن أن تعزز صورة من هنا؟ هل يمكن أن تعزز ذلك؟ هل يمكن أن تعزز ذلك؟ هل يمكن أن نعزز هذا؟ هل يمكن أن تعزز ذلك؟ -Hold على الثانية. سوف تعزز. في -Zoom على الباب. -Times 10. -Zoom. -Move في. -أكثر. الإنتظار، ووقف. -stop. -Pause ذلك. -Rotate لنا 75 درجة حول رأسي، من فضلك. -stop. نعود إلى الجزء حول الباب مرة أخرى. -Got محسن الصورة التي يمكن النقطية؟ لربما يمكننا استخدام براديب سينغ طريقة لمعرفة إلى النوافذ. -THE البرنامج هو حالة من الفن. -THE القيمة الذاتية هو خارج. ، مع الحق مزيج من algorithms-- اتخذت الإضاءة، تتفق و خوارزميات إلى المستوى التالي، ويمكنني استخدامها ل تعزيز هذه الصورة. القفل على وتوسيع محور ض. -Enhance. تعزيز. -Enhance. -Freeze وتعزيز. [END تشغيل الفيديو] J. DAVID مالان: حتى تلك هي كل الكلمات، لكنها لم تكن تستخدم في الجمل بشكل صحيح. والواقع في المستقبل، في أي وقت، من فضلك، تسمع أحدهم يقول كلمة، "تعزيز" ضحكة مكتومة قليلا. لأنه عندما كنت في محاولة لتعزيز، على سبيل المثال، وهذا هو ما يحدث. حتى هنا صورة رائع. هذا هو الخاص Daven CS50 ل. ونفترض اننا نريد ل تركيز على وميض في عينه، أو انعكاس لل الرجل السيئ الذي كان واضحا التقاطها بواسطة كاميرا أمنية. هذا هو ما يحدث عندما لك التكبير في الصورة التي ليس لديها سوى عدد محدود البتات المرتبطة به. هذا هو ما ستحصل عليه. وبالفعل، في العين Daven ل ما هو إلا أربعة، ربما ستة بكسل أن يؤلف بالضبط ما كان هناك بريق. حتى مشكلة تعيين أربعة سيكون لها في نهاية المطاف يمكنك استكشاف هذا العالم، لا سيما حسب طبيعة شيء نسميه ملف I / O، حيث I / O هو مجرد وسيلة لنزوة قائلا المدخلات والمخرجات. حتى الآن لذلك، كل من التفاعلات لقد كان لدينا مع جهاز كمبيوتر كانت إلى حد كبير مع ك لوحة المفاتيح والشاشة، ولكن ليس كثيرا مع القرص الثابت، أو حفظ الملفات خارج تلك التي نفسك الكتابة. برامج لديكم حتى الآن لم يتم خلق، والادخار، وتحديث الملفات الخاصة بهم. حسنا، ما هو ملف؟ حسنا، ما يشبه JPEG. هذه هي الصورة التي قد ديك أو تحميلها على الفيسبوك، أو رؤية أي مكان على شبكة الإنترنت. في الواقع، تلك الصورة نحن فقط كان رأى من Daven لJPEG. وما هو مثير للاهتمام حول الملفات مثل ملفات JPEG غير أنه يمكن تحديدها، عادة، من خلال أنماط معينة من البتات. وبعبارة أخرى، ما الذي يميز JPEG من GIF من ping من كلمة مستند من ملف Excel؟ حسنا، انها مختلفة تماما أنماط من البتات. وهذه الأنماط المختلفة عادة في بداية هذه الملفات. بحيث عندما يفتح جهاز الكمبيوتر الخاص بك وكلمة وثيقة، أو عندما يفتح الكمبيوتر JPEG، يبدو عادة في الأولى عدة بت في الملف. وإذا لم تعترف نمط، تقول، يا، وهذا هو صورة. اسمحوا لي عرضه ل المستخدم كما رسم. أو، أوه، هذا يبدو وكأنه وثيقة وورد. اسمحوا لي أن تظهر إلى المستخدم كما مقال. هكذا على سبيل المثال، ملفات JPEG، كما تبين، هي متطورة إلى حد ما تحت غطاء محرك السيارة. لكن البايتات الثلاثة الأولى في معظم كل JPEG تبدأ مع هذه الأرقام الثلاثة. لذا بايت صفر، واحد، وهما، في معظم كل JPEG، 255، ثم رقم 216، ثم رقم 255. وما عليك أن تكون قادرا لبدء القيام الاسبوع المقبل هو في الواقع بدس تحت غطاء محرك السيارة من الملفات مثل ملفات JPEG ومثل ملفات الصور النقطية، ورؤية ما كان دائما هناك لفترة طويلة و كما كنت قد تم استخدام جهاز كمبيوتر. ولكن ما هو ليس هناك عادة مكتوبة مثل الأرقام العشرية مثل هذا. علماء الكمبيوتر لا تميل إلى التحدث في العشرية. أنهم لا يتكلمون حقا في ثنائي. عادة، عندما نريد للتعبير عن الأرقام، نحن فعلا استخدام عشري، التي علكم تذكرون من، مثلا، مشكلة مجموعة واحد، والذي تحدى لك التفكير في نظام مختلف. ونحن، بالطبع، معتادا مع عشري، الصفر خلال تسعة. تحدثنا عن ثنائي. وليس لدينا حقا لاستخدام هذا كثيرا هنا على الخروج، لأن أجهزة الكمبيوتر التي سوف تستخدم. ولكن سوف المبرمجين جدا غالبا، لكن ليس دائما، استخدام عشري، مما يعني فقط لديك 16 رسائل في الأبجدية الخاص بك، بدلا من اثنين أو 10. إذا كيف يمكنك العد إلى أعلى من تسعة في عشري؟ تذهب 0، 1، 2، 3، 4، 5، 6، 7، 8، 9، أ، ب، ج، د، ه، و، فقط عن طريق الاتفاقية. ولكن ما هو المفتاح هو أن كل هذه هو رمز واحد. لا يوجد 10. لا يوجد أي 11، في حد ذاته، لأن كل الأرقام الخاصة بك، تماما مثل في العشرية ومثلما هو الحال في ثنائي، ينبغي فقط يكون حرف واحد، من خلال الاتفاقية. بحيث ثم هي الأبجدية لدينا في حوزتنا للعشري. فماذا يفعل JPEG تبدو وكأنها إذا كنت كانت لكتابة تلك الثلاثة الأولى بايت ولكن ليس كما عشري، على سبيل المثال، كما عشري؟ والسبب هو عرافة حتى كل ما مفيدة؟ حسنا، نظرة سريعة على سبيل المثال. حتى إذا أنا أكتب من البتات التي تمثل هذه numbers-- عشري هذا قد يكون قليلا صدئ الآن من بضعة أسابيع إلى الوراء، لكن اليسار واحد و حق واحد من السهل جدا. 255 وكان أكبر عدد نحن يمكن أن تمثل مع ثمانية بت. كان كل منها. لذلك الوحيد الذي هو أقل ما يقال المثير للاهتمام هو واحد الأوسط. وإذا قمت بذلك نوع من الخروج على الرياضيات، سوف يستنتج أن، في الواقع، هذا النمط من واحد و الأصفار يمثل 216. لذلك دعونا تنص فقط ل الآن أن هذه صحيحة. ولكن لماذا هذا الاهتمام؟ حسنا، بايت، بالطبع، هو ثمانية بت. واتضح أنه إذا كنت تعتقد من بايت واثنين من أجزاء من أربعة بت، مثل هذا. اسمحوا لي أن أضيف بعض المساحة. قبل ذلك، بعد. واضاف لقد فقط بعض المساحة البيضاء لمجرد التصور هنا. كيف يمكن أن نمثلها الآن في، مثلا، عشري كل رباعية البتات، كل مجموعة من أربعة بت؟ هكذا على سبيل المثال، على اليسار الآن، لدينا 1111 في ثنائي. ما هو هذا العدد في العشرية، إذا قمت بذلك من الرياضيات؟ لديك مكان منها، مكان ثنائي، المكان أربع، والمكان أثمان. الجمهور: 15. J. DAVID مالان: انها 15. لذلك اذا لم نفعل ثمانية بالإضافة إلى أربعة زائد اثنين زائد واحد، نحصل على 15. حتى أتمكن من كتابة 15 أدناه 1111 و لكن بيت القصيد هنا غير عشري، وليس عشري. وذلك بدلا من تدوين 15، 1-5، أنا أريد أن أكتب ذلك في عرافة، وإذا كنت تعتقد مرة أخرى، إذا كان لديك الصفر خلال f، ما هو 15 سيكون؟ الجمهور: و. J. DAVID مالان: هكذا اتضح انها و. ويمكنك أن تعمل بها قائلا: حسنا، إذا كان هو 10، ثم موافق، و هي 15. ذلك في الواقع، يمكننا أن إعادة كتابة هذا نفسه مجموعة من الأرقام وو و. ثم اذا لم نفعل شيئا من الرياضيات، سنقوم نستنتج أن هذا هو د. ثمانية من السهل جدا، لأننا ديك واحد في مكان أثمان. ومن ثم، لدينا أكثر زوجين و و ل. فما البشر يميلون إلى القيام به من خلال اتفاقية عند استخدامهم عشري هو انهم فقط أكتب هذا قليلا أكثر وضوحا، التخلص من معظم تلك المساحة البيضاء. ومجرد أن تكون واضحة فائقة ل القراء أن هذا هو عشري، اتفاقية بين بسيطة البشر وتكتب الصفر س، الذي ليس له معنى آخر من المعرف البصري، هنا يأتي عدد عرافة. وبعد ذلك، قمت بوضع رقمين، و و في هذه الحالة، ثم د لذلك، ثم و و. حتى قصة قصيرة طويلة، عشري يميل فقط أن تكون مفيدة لأن كل من فيها أرقام، الصفر خلال f، خطوط تماما حتى مع وجود نمط من أربعة بت. حتى إذا كان لديك اثنين من أرقام ست عشرية، الصفر من خلال F، مرارا وتكرارا، التي تمنحك تماما ثمانية بت أو بايت واحد. ولهذا السبب فإنه يميل إلى تكون مفيدة تقليديا. ليس هناك مثقف المحتوى حقا أبعد من ذلك، بخلاف فائدتها الفعلية. ملفات JPEG الآن ليست فقط ملف صيغ للرسومات. تذكرون أن هناك مثل هذه الملفات في العالم، على الأقل من قبل بضع سنوات. لذلك كان هذا الواقع المثبتة في Windows XP على الملايين من أجهزة الكمبيوتر في جميع أنحاء العالم. وكان هذا ملف صورة نقطية، BMP. وملف صورة نقطية، كما سترى المقبل الاسبوع، يعني مجرد وجود نمط من النقاط، بكسل كما انهم دعا، خريطة على بت، حقا. فما المثير للاهتمام، على الرغم من حول هذه تنسيق الملف، BMP، هو أن تحت غطاء محرك السيارة، و لديها أكثر من ثلاثة بايت فقط التي تشكل رأس، لذلك جاز التعبير، لدغات القليلة الأولى. يبدو في الواقع قليلا معقدة للوهلة الأولى. وسترى هذا في مجموعة P. والحصول على شيء من معين هذا الآن ليس مهم جدا، ومجرد حقيقة أنه في بداية كل نقطية ملف، شكل رسوم بيانية، هناك في مجمله مجموعة من الأرقام. الآن مايكروسوفت، و صاحب هذا الشكل، يميل إلى استدعاء هؤلاء أشياء لا [إينتس] وحرف ويطفو لكن الكلمات ود كلمات وصفقات الشراء وبايت. حتى انهم أنواع مختلفة من البيانات فقط. انهم أسماء مختلفة لنفس الشيء. ولكن سترى أنه في P تعيين أربعة. ولكن هذا هو فقط أن أقول أنه إذا كان الإنسان بالنقر نقرا مزدوجا فوق بعض الملفات. BMP على موقعه أو القرص الصلب لها، ويفتح نافذة حتى تبين له أو لها تلك الصورة، حدث ذلك لأن التشغيل نظام احظ يفترض ليس فقط امتداد الملف BMP. في اسم الملف، ولكن أيضا حقيقة أن هناك بعض اتفاقية للنمط البتات في البداية من أن ملف الصورة النقطية. ولكن دعونا نركز الآن على هذا ملف معقد، ولكن بدلا من ذلك على شيء مثل هذا. نفترض هنا في GEdit، وأنا يكون مجرد بدايات برنامج هذا بسيط جدا. لقد حصلت على بعض يشمل حتى أعلى. الآن أنا عندي # تشمل "structs.h" لكن سأعود إلى ذلك في لحظة. ولكن هذا أمر مفيد في الوقت الراهن. لذلك هذا هو برنامج ما يجري لتنفيذ مثل قاعدة بيانات المسجل. لذلك قاعدة بيانات للطلاب، وكل طالب في العالم له اسم ومنزل وربما بعض الأشياء الأخرى، ولكننا سوف يبقيه بسيط. كل طالب له اسم ومنزل. لذلك إذا أردت أن إرسال بريد برنامج هدفها في الحياة كان مجرد تكرار من الصفر على ما يصل إلى ثلاثة، إذا كان هناك ثلاثة طلاب في جامعة هارفارد. وأريد فقط أن تحصل، وذلك باستخدام GetString، اسم كل طالب والمنزل، وبعد ذلك فقط من طباعة تلك. هذا هو نوع من مثل أسبوع واحد الاشياء أسبوعين الآن، حيث أريد فقط ل حلقة أو شيء من هذا القبيل. وأريد أن أدعو GetString عدد قليل مرات، ومن ثم طباعة و عدة مرات. فكيف يمكن أن أفعل هذا، رغم ذلك، عند كل اسم ومنزل وتشارك لكل طالب؟ لذلك ربما أول غريزة بلدي يكون أن تفعل شيئا من هذا القبيل. وأود أن أقول أولا، حسنا، أعطني، أقول، صفيف سلاسل دعا الأسماء. وأنا لا أريد hardcode ثلاثة هنا. ماذا أريد أن أضع هناك؟ حتى الطلاب، لأن هذا مجرد ثابت أعلن في القمة، فقط حتى لا تضطر إلى hardcode ثلاثة في أماكن متعددة. بهذه الطريقة، لا أستطيع تغييره مكان واحد، ويؤثر تغير في كل مكان. ثم، وأنا قد تفعل سلسلة يضم طلاب. والآن، وأنا قد تفعل شيئا مثل ل (كثافة العمليات ط = 0، وأنا <الطلاب، وأنا + +. لذلك أنا كتابة بسرعة، ولكن هذا هو ربما دراية تركيب الآن. والآن، وكان هذا أكثر حداثة. إذا كنت تريد أن تضع في ال I- اسم الطالب، وأعتقد أن أفعل هذا. ومن ثم، لا أسماء لكن المنازل قوس ط. أفعل هذا، GetString، والسماح لي أن أعود وإصلاح هذا الخط. توافقون على ذلك؟ نتعارض؟ انها ليست جدا سهل الاستعمال. أنا لم أخبر المستخدم ما يجب القيام به. ولكن الآن، إذا أنا أيضا يريد في وقت لاحق، دعونا مثلا، طباعة هذه الأشياء out-- ذلك في وقت لاحق TODO. انا ذاهب الى بذل المزيد من الجهد مع this-- هذا القول غير التنفيذ الصحيح لل الحصول على أسماء والمنازل، ثلاثة منهم كل مجموعه، من مستخدم. ولكن هذا ليس التصميم الجيد جدا، أليس كذلك؟ ما إذا كان الطالب لديه ليس مجرد اسم والمنزل، ولكن أيضا رقم الهوية، و ورقم الهاتف، وعنوان البريد الإلكتروني، وربما الصفحة الرئيسية، و ربما مقبض تويتر، وأي عدد من التفاصيل الأخرى المرتبطة طالب أو شخص، أكثر عموما. كيف يمكننا أن نبدأ في إضافة وظيفة هذا البرنامج؟ حسنا، أنا أشعر بأن أبسط طريقة قد يكون أن تفعل شيئا مثل، دعنا نقول، الباحث هويات الطلاب. حتى أتمكن من وضع كل هوياتهم في هناك. وبعد ذلك، عن شيء مثل أرقام الهاتف، لست متأكدا من كيفية تمثل ذلك فقط حتى الآن. لذلك دعونا نمضي قدما والدعوة فقط هذه التغاريد الطلاب، والتي قليلا غريب، but-- وحفنة أكثر المجالات. لقد بدأت على نحو فعال نسخ ولصق هنا. وهذا سوف تنمو جميلة غير عملي بسرعة كبيرة، أليس كذلك؟ لن يكون ذلك جميلا لو كان هناك في العالم بنية بيانات معروف ليس عدد صحيح أو سلسلة، ولكن شيئا أعلى المستويات، فكرة مجردة، لذلك في الكلام، والمعروف باسم طالب؟ لم C لا يأتي مع المدمج في وظائف للطلاب و ولكن ماذا لو أردت أن تعطيه هذا؟ حسنا، كما تبين، أنا ذاهب ل فتح ملف يسمى structs.h هنا، ويمكنك أن تفعل ذلك بالضبط. ونحن في طريقنا لتبدأ في فعل هذا الآن. وتحت غطاء محرك السيارة من P تعيين ثلاثة، كنت قد تم بالفعل القيام بذلك الآن. ليس هناك شيء مثل المستطيل أو ز وز البيضاوي في لغة البرمجة C. الناس في ستانفورد تنفيذ تلك أنواع البيانات باستخدام هذا النهج هنا، إعلان بيانات جديدة خاصة بهم أنواع باستخدام كلمة رئيسية جديدة تسمى البنية وآخر دعا أحد الرموز المميزة ل typedef. وبالفعل، على الرغم من بناء الجملة تبدو مختلفة قليلا عن الاشياء رأيناه من قبل، في المبدأ، انها فائقة بسيط. هذا يعني فقط "تعريف نوع". وهذا ما سيكون هيكل، وهيكل هو تماما مثل وعاء لأشياء متعددة. وهذا الهيكل هو ذاهب لدينا سلسلة تسمى اسم، وسلسلة تسمى المنزل. ودعونا ندعو، فقط للراحة، هذا كله طالب هيكل البيانات. حتى لحظة تحصل على الفاصلة المنقوطة، لديك الآن خلق البيانات الخاصة بك نوع يسمى طالب الذي يقف الآن إلى جانب كثافة العمليات، وتعويم، وشار، وسلسلة، وز المستطيل، وز البيضاوي، وأي عدد من الأشياء الأخرى الناس قد اخترعت. فما هو مفيد حول هذا الآن هو أنه إذا أعود إلى البنية 0 وإنهاء هذا التنفيذ، التي كتبت مقدما هنا، لاحظ أن جميع من المحتم أن الفوضى كان على وشك أن تبدأ يحدث كما أضفت أرقام الهاتف والتغاريد وجميع هذه أمور أخرى ل تعريف الطالب، الآن هو ملفوفة بإيجاز عنه ومجموعة واحدة فقط من الطلاب. ولكل من هؤلاء الطلاب الآن لديه أشياء متعددة داخل منه. بحيث يترك سؤالا واحدا فقط. كيف يمكن الحصول على اسم، والمنزل، والهوية، وأي شيء آخر هو داخل الطالب؟ سوبر بسيطة، كذلك. تركيب جديد، ولكن فكرة بسيطة. يمكنك ببساطة مؤشر إلى الصفيف، كما فعلنا الأسبوع الماضي وهذا. وما هو بوضوح قطعة جديدة من جملة؟ فقط، وهو ما يعني "اذهب داخل هيكل والحصول على حقل يسمى اسم، والحصول على حقل يسمى بيت، الحصول على حقل يسمى طالب ". حتى في تعيين ثلاثة P، إذا كنت لا تزال تعمل على ذلك، ومعظم الناس لا يزال و، ندرك أن التقدم البدء في استخدام أشياء مثل ز ز rects والأشكال البيضاوية وغيرها من الأمور التي لا يبدو أن تأتي من أسبوع صفر، واحد، أو اثنان، ندرك أن ذلك لأن ستانفورد أعلن بعض أنواع البيانات الجديدة. وبالفعل، هذا هو بالضبط ما سنقوم القيام به، أيضا، في تعيين أربعة P عندما، نبدأ في التعامل مع الأشياء مثل الصور، الصور النقطية، وأكثر من ذلك. ذلك أن مجرد دعابة و نموذج العقلي لما هو آت. الآن، وأنا ماطلت قليلا هذا الصباح. كنت نوع من الغريب أن نرى ما خلفية مايكروسوفت فعلا يبدو اليوم. واتضح شخص في عام 2006 فعلا ذهبت إلى بالضبط تقريبا نفس المكان لتصوير في الواقع ما يبدو أن هذه الأيام. الميدان هو الآن متضخمة قليلا. حتى الآن يتحدث من الصور، دعونا نعيد Daven هنا على الشاشة ونيكولاس، وأذكركم فقط أنه إذا كنت ترغب في الانضمام إلينا لتناول طعام الغداء يوم الجمعة، توجه إلى URL المعتاد لدينا هنا. ذلك حيث لم نغادر من يوم الاثنين؟ قدمنا ​​هذه المشكلة، أليس كذلك؟ كان هذا على ما يبدو صحيحة تنفيذ المبادلة حيث يمكنك أخذ اثنان [إينتس]، واحد يسمى، واحدة تسمى ب، مقايضتهم، مثلما فعلت لورا هنا على خشبة المسرح مع الحليب والماء، باستخدام مؤقت متغير، أو كوب فارغ، حتى نتمكن من وضع ب في وفي ب دون فوضى من الأشياء. استخدمنا متغير. انه دعا مؤقت. ولكن ما هو أساسي المشكلة مع هذا الرمز يوم الاثنين؟ ما هي المشكلة هنا؟ نعم. الجمهور: يستغرق مساحة أكبر. J. DAVID مالان: يستغرق فترة تصل أكثر الفضاء، لأنني باستخدام متغير، وهذا موافق. هذا صحيح، ولكن أنا سأقول هذا موافق. انها فقط 32 بت في الكبرى نظام الأشياء، حتى لا صفقة كبيرة. أفكار أخرى؟ الجمهور: وهو مبادلة فقط المتغيرات محليا. J. DAVID مالان: بالضبط. انها مقايضة فقط المتغيرات محليا. لأن أي وقت استدعاء function-- عندما أتيحت لي الصواني من أننبرغ آخر مرة، لديك الرئيسي في القاع. بمجرد استدعاء دالة يسمى المبادلة المبادلة لا تحصل x و y، القيم الأصلية. ما لا تحصل المبادلة لم ندعي؟ الجمهور: نسخ. J. DAVID مالان: حتى نسخ منها. لذلك يحصل واحد واثنين، إذا كنت أذكر المثال من آخر مرة، لكن نسخة من واحد واثنين التي تبادلت بنجاح. ولكن للأسف في النهاية، هذه القيم لا تزال هي نفسها. حتى يمكننا أن نرى هذا من خلال صديق جديد، ونأمل GDB، ان كنت أو TFS وعلى الكالسيوم ديك تم توجيه لكم نحو كالتالي. لذلك لا يبدو استدعاء مبادلة like-- دعونا فتح this-- يبدو مثل هذا. نحن تهيئة X واحد، ذ إلى اثنين. وكان مجموعة من طباعة و ل. ولكن بعد ذلك، والدعوة الرئيسية كان هنا لمبادلة، والتي هو بالضبط نحن مدونة فقط رأيت قبل لحظة. أيهما الصحيح في البداية وهلة، لكن وظيفيا، لا يعمل هذا البرنامج، ل أنه لا مبادلة بشكل دائم x و y. لذلك دعونا نرى هذا، دافئ سريع هنا مع GDB، و./noswap. حفنة من المعلومات الساحقة التي سوف نتخلص من L مع التحكم في الوقت الراهن. والآن، أنا ذاهب ل المضي قدما وتشغيله. ومما يؤسف له، أن لم يكن ذلك مفيدا. ذلك بتشغيل برنامج داخل هذا دعا برنامج GDB، مصحح، ولكنه لم يسمحوا لي كزة حولها. فكيف يمكنني قفة الواقع التنفيذ داخل هذا البرنامج؟ حتى كسر. وأنا لا يمكن كسر على أي عدد، واحد، 10، 15 خط. ولكن يمكنني أيضا كسر رمزيا بالقول كسر الرئيسي. وأن يجري وضع فاصل نقطة، على ما يبدو في خط 16 في الرئيسية. وأين هو خط 16؟ دعنا نذهب إلى رمز وتصل إلى noswap. وبالفعل، خط 16 هو أولا جدا في البرنامج. وحتى الآن، إذا كنت المضي قدما ونوع تشغيل هذا الوقت، أدخل، فإنه توقف. لذلك دعونا كزة حولها. طباعة x-- لماذا هو العاشر الصفر؟ وتجاهل علامة الدولار. هذا فقط لمربي الحيوانات استخدام البرنامج. لماذا هو العاشر الصفر في الوقت الحالي؟ نعم. الجمهور: انها توقفت الحق قبل السطر 16، وليس في الواقع على خط 16. J. DAVID مالان: بالضبط. GDB، افتراضيا، وقد توقفت التنفيذ قبل خط 16. لذلك لم تنفذ، والتي يعني x غير ذات قيمة ما غير معروفة. وصلنا محظوظ أنه شيء نظيف مثل الصفر. حتى الآن إذا كنت اكتب المقبل، الآن أنه أعدم 16. انها تنتظرني لتنفيذ 17. اسمحوا لي المضي قدما والطباعة خ. انها واحدة. اسمحوا لي المضي قدما والطباعة ذ. ماذا يجب أن نرى الآن؟ الجمهور: [غير مسموع] J. DAVID مالان: وبصوت أعلى قليلا. الجمهور: [غير مسموع] J. DAVID مالان: ليس تماما توافق في الآراء. لذلك نعم، ونحن نرى بعض القيمة القمامة. الآن، هو 134514064 ص هناك. حسنا، انها مجرد بعض القيمة القمامة. يستخدم برنامجي RAM لأغراض مختلفة. هناك وظائف أخرى. كتب الآخرين داخل جهاز الكمبيوتر الخاص بي. لذلك استخدمت هذه البتات ل قيم أخرى، وما اراه هو بقايا بعض استخدام مسبق من تلك الذاكرة. لذلك لا صفقة كبيرة، لأن في أقرب وقت وأنا اكتب التالي ومن ثم طباعة ذ، انها تهيئة ل القيمة التي أريد. وحتى الآن، دعونا نمضي قدما أسرع قليلا. N لالمقبل. دعونا نفعل ذلك مرة أخرى. دعونا نفعل ذلك مرة أخرى. لكنني لا أريد أن ضرب هنا، لأنه إذا أنا نريد أن نرى ما يحدث داخل المبادلة، ما الأمر؟ الجمهور: الخطوات. J. DAVID مالان: الخطوات. حتى هذه الخطوات لي في وظيفة، وليس أكثر من ذلك. والآن، انها خفي قليلا بصراحة، ولكن هذا هو فقط تقول لي أنا في خط 33 الآن. ودعونا نفعل ذلك مرة أخرى. درجة الحرارة الطباعة. قيمة القمامة، والسلبي هذه المرة، ولكن هذا مجرد تزال قيمة القمامة. لذلك دعونا نفعل المقبلة، درجة الحرارة الطباعة. هو تهيئة إلى 1، والتي كانت قيمة x، الملقب. الآن، أين هي لدينا والأشعة القادمة من؟ كذلك، لاحظ في الرئيسية، ونحن تسمى هذه القيم x و y. نحن ثم مرت عليها لمبادلة النحو التالي. جاء أول X، Y فاصلة. ومن ثم، يمكن أن تسميها مقايضة x و y. ولكن من أجل الوضوح، هو دعوتهم أ و ب. ولكن أ و ب والآن ستكون نسخ من x و y، على التوالي. حتى إذا أعود إلى GDB، درجة الحرارة هو الآن واحد والآن واحدة. ولكن إذا كنت تفعل المقبل، والآن تفعل الطباعة لذلك، بالفعل تم نقل أكثر من. تم سكب الحليب في السابق كوب عصير البرتقال، وأو العكس بالعكس. وإذا كنت تفعل مرة أخرى بعد ذلك، والآن إذا كنت طباعة وشيك التعقل، ومازال اثنين، ولكن ب هي الآن واحدة. بصراحة، انها لا تزال هناك. لا يهمني ما هو مؤقت. ولكن بمجرد أنا اكتب الآن، دعنا نقول، مواصلة نعود، الآن أنا في نهاية البرنامج. ولسوء الحظ، x هو لا تزال واحدة و y لا يزال اثنين. وذلك ما كان هناك فائدة GDB؟ ولم مساعدتي إصلاح مشكلة في حد ذاتها، ولكنه أمل مساعدتي نفهم ذلك من خلال تحقيق أن نعم، والمنطق بلدي هو الصحيح، ولكن قانون بلدي هو عدم وجود نهاية المطاف تأثير دائم. بحيث مشكلة نحن الذهاب الى حل الآن اليوم. ولكن دعونا نصل الى هناك عن طريق هذا. سلسلة هي كذبة. هو، أيضا، ليس نوع البيانات موجود في C. انها كان مرادفا لبعض الوقت لشيء آخر، ويمكننا أن تكشف على النحو التالي. اسمحوا لي المضي قدما وفتح برنامج يسمى مقارنة-0. وبدلا من أن اكتب هذا واحد، سنبدأ على المشي من خلال رمز سبق لي أن كتبت، ولكن انها فقط بضعة أسطر. بحيث يتم مقارنة-0 هذا. وأول شيء أنا به هو الحصول على سطر من النص. لكن لاحظ ما أنا به للمرة الأولى. ما يختلف بوضوح عن خط 21؟ في الواقع، انتظر لحظة. هذا هو نسخة اثنين. هذا هو ولا حتى الحق في البرنامج. كل الحق، في حالة تأهب المفسد. كل الحق، لذلك لم تمانع ذلك. هذا هو الجواب على سؤال المستقبل. هنا مقارنة-0، وأنا على وشك الحصول على سطر من النص. في برنامج أبسط من ذلك بكثير. لذلك هذا واضح ومباشر. هذا هو مثل أسبوع واحد، الاشياء أسبوعين في هذه اللحظة. سلسلة ق = GetString. الآن، وأنا أقول ذلك مرة أخرى هنا. سلسلة T = GetString. ومن ثم، فإن آخر شيء في هذا البرنامج، كما يوحي اسمها، وانا ذاهب الى محاولة مقارنتها. حتى إذا ق، السلسلة الأولى، يساوي = ر، ثم أنا سأقول لك اكتب نفس الشيء. آخر، انا ذاهب الى القول قمت بكتابة أشياء مختلفة. لذلك دعونا ترجمة وتشغيل هذا البرنامج. لذا تأكد مقارنة الصفر. تبدو جيدة. عدم وجود أخطاء الترجمة. اسمحوا لي المضي قدما الآن واكتب ./compare-0. اسمحوا لي المضي قدما وأقول شيئا : Daven وشيء: روب. وأنا اكتب أشياء مختلفة. حتى الان جيدة جدا. يبدو البرنامج ليكون صحيحا. ولكن دعونا تشغيله مرة أخرى. أقول شيئا: غابي. أقول شيئا: غابي. كل الحق. ربما أنا ضرب شريط الفضاء أو شيء غير تقليدي. دعونا نفعل ذلك مرة أخرى. حتى Zamyla. Zamyla. أشياء مختلفة. فما الذي يجري؟ لذلك لدينا هذين الخطين من رمز، GetString استدعائه مرتين. ومن ثم، أنا ببساطة في محاولة لمقارنة ق و ر. ولكن ما حقا ثم يجري؟ حسنا، عن بلدي الكتابة اليدوية ل جزار هذا المثال إلى حد ما. ودعونا رمي الواقع هذا الأمر أكثر من هنا، أيضا. لذلك لدينا خط مثل سلسلة ق = GetString. ولهذا ببساطة أول خط للاهتمام من هذا البرنامج. ولكن ماذا كان كل هذا الوقت يجري تحت غطاء محرك السيارة؟ حسنا، من ناحية الجانب الأيسر هو سلسلة، وهو نوع من متغير، وهذا يدعى ق. إذا كنت لا تعرف أن هذا الأمر باستخدام الذاكرة، أو RAM، في جهاز الكمبيوتر الخاص بي بطريقة أو بأخرى. لذلك أنا ذاهب الى تجريدي كما أن رسم مربع. 32 بت، كما تبين، ولكن أكثر على ذلك في المستقبل. ثم، ما الذي يحدث هنا؟ حسنا، من الواضح GetString يحصل على سلسلة من المستخدم. وحصلت GetString Zamyla أو غابي أو Daven. لذلك دعونا اختيار أولا تلك التي كانت Daven. بذلك على نحو فعال، حصل ما GetString لي في أن الحالة الأولى كانت D-A-V-E-N. ثم، ماذا فعل انها تعطيني سرا؟ الجمهور: [غير مسموع] J. DAVID مالان: نعم، و/ 0 أو باطل الحرف. لذلك أعطى فعال لي سلسلة. ولكننا نعرف بالفعل سابقة يبدو أن سلسلة هو مجرد مجموعة من الشخصيات، وانها انتهت من قبل هذه الشخصية الحارس خاص، / 0. ولكن إذا كان هذا صحيحا وهذا هو مربع، هذا هو واضح مستطيل أكبر من ذلك بكثير. وبالفعل، وهذا هو، أزعم، 32 بت فقط. وهذا هو بوضوح أكثر من 32 بت، لأن هذا هو الأرجح ثمانية بالإضافة إلى ثمانية بالإضافة إلى ثمانية بالإضافة إلى ثمانية بالإضافة إلى ثمانية، لمجرد وحدات البايت في ASCII. كيف هيك نحن ذاهبون لتناسب Daven في هذا الصندوق الصغير هنا؟ حسنا، ما هو في الواقع GetString تفعل؟ حسنا، هذه الشبكة هنا يمثل ذاكرة الكمبيوتر أو ذاكرة الوصول العشوائي. لذلك دعونا نقول انه اذا تعسفا كل من هذه يمثل بايت، ثم يمكن أن نفكر في كل البايت وجود عنوان، 33 مثل شارع أكسفورد، أو 34 شارع أكسفورد، أو 35 شارع أكسفورد. لذلك تماما مثل المنازل وعناوين والمباني لها عناوين، لذا قم بايت الفردية الذاكرة لها عناوين أو أرقام أن التعرف عليهم بشكل فريد. الآن، وهذا هو التعسفي. ولكن أن يبقيه بسيط، انا ذاهب الى استخدام عشري فقط من خلال اتفاقية، لكن 0X يعني شيئا آخر من "هذا هو عشري". وانا ذاهب الى الادعاء بأن "D" ينتهي في بايت واحد في الذاكرة. حصلت على شيء آخر يحدث في الذاكرة، لذلك Daven حصلت على المركز الأول في بايت واحد. هذه، إذن، ستكون 0x2. هذا هو الذهاب الى 0x3. هذا سيكون 0x4. هذا هو الذهاب الى 0x5. هذا سيكون 0x6. ولكن بمجرد البدء في التفكير حول ما يفعله الكمبيوتر تحت غطاء محرك السيارة، يمكنك البدء في استنتاج كيف، قبل بضع سنوات، من شأنه نفذت C نفسها. ما هو GetString ربما لأنه returning-- كأنه ليس العودة Daven، في حد ذاته، لانه بالتأكيد لن لتناسب في هذا box-- قليلا ذلك ما GetString ربما يعود؟ الجمهور: [غير مسموع] J. DAVID مالان: موقع Daven. وانه تم القيام بذلك منذ أسبوع واحد. ما هو حقا GetString العودة ليست سلسلة، في حد ذاتها. أن واحدة من أكاذيب بيضاء صغيرة. انها عودة عنوان سلسلة في الذاكرة، وعنوان فريد. Daven يعيش في 33 شارع أكسفورد. ولكن أكثر وضوحا، يعيش جافين في 0x1، على العنوان ورقم واحد. فما يحصل في وضع هذه الصندوق الصغير ثم، أن تكون واضحة، هو مجرد عنوان هذه السلسلة. لذلك كل هذا الوقت، وهذا وقد استمر الحال على. ولكن ما يلمح في هذا الآن هو أنه إذا كان كل S قد هو رقم داخل منه، الذي هو لوقف لكم، مبرمج، من وضع أي رقم في أي متغير ومجرد القفز إلى أن جزءا من الذاكرة؟ وبالفعل، سنرى هذا هو التهديد في المرة القادمة. ولكن الآن، وهذا يشعر غير كافية. إذا قلت، يحصل لي سلسلة، وكنت تعطيني Daven. لكنك لا تعطي حقا لي Daven. كل ما تعطيني هو عنوان Daven ل. كيف يمكنني ثم نعرف على وجه اليقين حيث يبدأ Daven وends-- القصة الحصول weird-- حيث يبدأ وينتهي Daven، ومن ثم، فإن القادم سلسلة تبدأ في الذاكرة؟ حسنا، إذا كنت تسليم لي بداية Daven، أساسا، كيف أعرف حيث نهاية اسمه؟ أن حرف خالية خاص، والتي هو كل شيء أكثر أهمية الآن إذا سلاسل تحت وحددت غطاء محرك السيارة ببساطة فريد من موقعها في الذاكرة. لذلك كل هذا الوقت، وهذا ما كان يحدث. لذلك عندما ننظر الآن في رمز هنا، شرح لو تفضلتم علة في خط 26. لماذا هو Zamyla وZamyla مختلفة؟ لماذا هو وغابي غابي مختلفة؟ نعم، في الظهر. الجمهور: لديهم عناوين مختلفة. J. DAVID مالان: ببساطة لأن لديهم عناوين مختلفة. لأنه عند استدعاء GetString مرة أخرى، والذي سأفعل بسرعة هنا، إذا كان هذا هو السطر الثاني، سلسلة ر، كما فعلت في هذا البرنامج، يساوي مكالمة أخرى إلى GetString. في المرة القادمة أسميه GetString، انا ذاهب للحصول على قطعة مختلفة من الذاكرة. يسمح GetString أن تطلب من التشغيل نظام للمزيد والمزيد من الذاكرة. انها لن إعادة استخدام نفس ستة بايت في كل مرة. انه ذاهب للحصول على جديد جزء من الذاكرة، التي ر يعني هو الذهاب الى الحصول بعض قيمة أخرى أكثر من هنا. لذلك عندما أفعل ق يساوي = ر، وكنت لا يقارن D و A ضد هذا ضد هذا وV ضد هذا. كنت مقارنة هذه ضد هذا الذي هي بصراحة useless-- useful-- جدا جميلة لا طائل منه، لأن الذين حقا حيث يهتم سلاسل هي في الذاكرة؟ وبالفعل، ليس لدينا. ونحن لن بدء رعاية خاصة. فقط لدرجة أن الحشرات يمكن أن تنشأ والتهديدات الأمنية يمكن أن تنشأ الإرادة نبدأ فعلا أن نهتم بذلك. لذلك دعونا إصلاح هذه المشكلة. تبين، يمكنك إصلاحه السوبر ببساطة. ودعونا في الواقع، قبل أن كشف ذلك مرة أخرى، ما من شأنه اذا في في فئة CS50، وكان لديك لتنفيذ مقارنة ضد سلسلتين. لك بوضوح لا يمكن فقط استخدام ق يساوي = ر. ولكن فقط منطقيا، كيف يمكن مقارنة هذه السلسلة ضد هذه السلسلة باستخدام رمز C؟ نعم. الجمهور: فقط تفعل لحلقة [غير مسموع] J. DAVID مالان: الكمال. الجمهور: [غير مسموع] J. DAVID مالان: نعم. مجرد استخدام للحلقة أو في حين حلقة أو أيا كان. ولكن مجرد تطبيق الفكرة الأساسية أنه إذا هذا هو جزء من الذاكرة أو صفيف وهذا هو، تكرار عبر سواء في نفس الوقت. ومجرد المقارنة بين الحروف. وكنت قد حصلت على أن يكون الحذر قليلا، لأنك لا أريد إصبع واحد للذهاب الماضي الآخر لأن سلسلة واحدة هي أطول من الآخر. لذلك كنت تريد الذهاب الى التحقق من و هذه القيمة خاصة في النهاية، لاغية. ولكنه في الواقع، في نهاية، بهذه البساطة. وبصراحة، نحن لسنا بحاجة لإعادة اختراع العجلة أن. هنا هو النسخة الثانية. وما انا ذاهب الى القول هنا هو أن بدلا من مقارنة يساوي = ق ر، أنا بدلا سأقول، إذا سلسلة مقارنة فاصلة ر ق يساوي = 0. الآن، ما هو سلسلة مقارنة؟ اتضح، انها الوظيفة التي يأتي مع C، هدفها في الحياة هو مقارنة سلسلتين. ويحرك مقارنة، اذا قرأنا لها الصفحة رجل أو وثائق أو CS50 المرجعية، وسوف ببساطة اقول لكم ان ضجة مقارنة عوائد إما السلبية عدد أو رقم موجب أو صفر، حيث يعني الصفر انهم المساواة. حتى مجرد التخمين. ما قد يعني أنه إذا إثارة العوائد مقارنة قيمة سالبة أو قيمة إيجابية؟ الجمهور: أكبر من أو أقل من. J. DAVID مالان: نعم، أكبر من أو أقل من. حتى إذا كنت تريد فرز ككل مجموعة من السلاسل في dictionary-- ونحن في نهاية المطاف إلى أسفل road-- وظيفة مثالية للاستخدام المحتمل، لأنه ذاهب للقيام بذلك المقارنة بين السلاسل بالنسبة لك، ونقول هل يقوم يأتي قبل ب، أو لا ب تأتي قبل أبجديا. يمكننا أن نفعل ذلك بالضبط. ولاحظ فعلت الآخر شيء في هذا المثال. ماذا تغيرت أعلى حتى في هذه الوظيفة الرئيسية؟ شار *. وهذا هو كذبة بيضاء أخرى. كل هذا الوقت، وعندما قمت تم كتابة سلسلة، لقد تم إعادة كتابة سرا كما تشار * سلسلة بحيث رنة الواقع يفهم لك. وبعبارة أخرى، في CS50.h وكما سنرى في نهاية المطاف، قدمنا ​​سلسلة مرادف يسمى هذا هو نفس الشيء كما شار *. والآن، لا يعرفون سوى أن * في هذا السياق، على الأقل، يعني العنوان. عنوان ماذا؟ كذلك، فإن حقيقة أن قلت شار * وليس كثافة العمليات * أو تطفو *، يعني أن تشار * هو عنوان شار. لذلك هذا الصندوق الصغير هنا، الملقب سلسلة، هو في الحقيقة من نوع شار *، الذي هو مجرد طريقة أخرى للقول، في هذا المربع سوف تذهب عنوان. وماذا يعني هذا العنوان إشارة إلى؟ على ما يبدو، على شار. لكننا يمكن على الاطلاق * لدينا كثافة العمليات وغيرها من الامور. لكنه الآن، تشار * هو في الواقع أكثر واضحة واحدة من الفائدة. حتى هذه المشكلة سوف في الارتفاع، رغم ذلك، مرة أخرى. افترض فتح هذا البرنامج. دعونا نرى ما اذا كان يمكننا التنبؤ الآن ما هو الخطأ في هذا الرمز. حتى في هذا البرنامج، نسخ-0، وأنا الذهاب الى المضي قدما وندعو مرة أخرى GetString وتخزين القيمة في ق. ثم، لماذا أفعل هذا، فقط للتذكير أسابيع من الماضي؟ فعلنا القول بأن GetString يعود أحيانا لاغية. ماذا يعني إذا GetString يعود لاغية؟ ذهب شيئا خاطئا. يعني على الارجح السلسلة جدا كبيرة، خارج الكمبيوتر من الذاكرة. يحدث السوبر، والسوبر، والسوبر نادرا، لكنه يمكن أن يحدث. نحن نريد للتحقق من ذلك، وهذا كل ما نقوم به. لأننا سوف نرى الآن، إذا كنت لا بدء التحقق عادة للأشياء مثل لاغية، وكنت قد بدء فعلا للذهاب إلى عناوين في الذاكرة التي هي غير صالحة. وأنت تسير لبدء حمل المزيد والمزيد من تجزئة أخطاء. أو في ماك أو جهاز كمبيوتر، فقط مما تسبب في الكمبيوتر معطلا أو برنامج لتجميد، يحتمل. حتى الآن، أنا أطالب في النسخ 0.c، وأنني ذاهب لنسخ هذه السلاسل عن طريق خط 28. وبعد ذلك، انا ذاهب المطالبة في أسفل هنا أنني ذاهب لتغيير واحد منهم. لذلك تلاحظ هذا. ادعو لدينا القديم صديق strlen. وشرح فقط باللغة الإنجليزية ما هذا السطر 34 يقوم به؟ ماذا ر 0 قوس تمثل على اليسار. نعم. الجمهور: أول حرف من ر؟ J. DAVID مالان: الحرف الأول من ر. هذا كل شيء. الحرف الأول من ر، أريد لتعيين النسخة الكبيرة من الحرف الأول في ر. لذلك هذا هو الاستفادة الحرف الأول. ومن ثم، فإن آخر شيء أفعله جدا في هذا البرنامج هو أزعم هنا الأصلي، S، وهنا هو نسخة، ر. ولكن على أساس القصة ونحن فقط وقال حول ما هي سلاسل حقا، ما هو خط 28 حقا به، وما هو علة الناتجة الذهاب أن تكون على الشاشة؟ ذلك أولا، السؤال الأول، 28. ما هو سلسلة ر = ق تفعل حقا؟ اذا كان لدينا من جهة اليسار الجانب هنا سلسلة T = ثانية؛ أن يعطيني مربع واحد هنا ومربع واحد هنا. ويفترض هذا العنوان هو 0X، دعنا نقول، 50 هذه المرة، بشكل تعسفي. ماذا سلسلة T = ق القيام تحت غطاء محرك السيارة؟ الجمهور: [غير مسموع] J. DAVID مالان: لأنه يخزن الذاكرة معالجة هناك، لذلك 0x50 يذهب هناك. حتى إذا الآن، وأنا أذهب إلى الأول حرف في ر وأحرف كبيرة عليه، ماذا أفعل فعال لق؟ أفعله حقا نفس الشيء، أليس كذلك؟ لأنه إذا كان عنوان 0x50-- وفقط، وأنا لم يكن لديك متسع على اللوحة هنا، ولكن نفترض أن هذا هو 0x50 إلى هنا، في مكان ما في ذاكرة جهاز الكمبيوتر الخاص بي. ولقد، على سبيل المثال، غابي في أحرف صغيرة هنا، من هذا القبيل. ولقد قال ر قوس 0 يحصل رسملتها. حسنا، ر 0 قوس هو الحرف الأول في ر. حتى القليل ز سوف تصبح كبيرة G. ولكن المشكلة هو، ماذا ق يشيرون أيضا إلى؟ الجمهور: نفس. J. DAVID مالان: نفس الشيء بالضبط. حتى تفسير بسيط ربما، حتى لو كانت الجملة هو غريب قليلا. لذلك دعونا نفعل ذلك. جعل نسخة-0 ثم ./copy-0. أقول شيئا: غابي. وللأسف، كل من منهم الآن تم رسملتها، ولكن لأنه الكامنة السبب أننا ببساطة الآن نتعامل مع العناوين. كيف لنا إذن أن نبدأ في address-- لا تورية intended-- كيف نبدأ في معالجة هذه المشكلة بالذات؟ حسنا، في copy1.c، تسير الامور للحصول قليلا أكثر تعقيدا. ولكن أود أن المطالبة حل بسيط من الناحية النظرية. من الصعب جدا الحصول على أول وهلة. لن يكون من السهل للمرة الأولى مرة كنت اكتب بها، ربما، ولكن إذا كانت المشكلة هي أن ببساطة القيام ر = ق فقط نسخ عنوان، ما، مرة أخرى ما اذا كان يمكنني اختيار عليك، سيكون الحل لنسخ الواقع سلسلة؟ الجمهور: سنقوم على الأرجح استخدام حلقة مرة أخرى. J. DAVID مالان: نعم. لذلك نحن سنحتاج الى حلقة مرة أخرى. وأنه إذا كنا نريد نسخ وق سلسلة إلى سلسلة أخرى، ربما نحن نريد أن نفعل ذلك حرف بحرف. ولكن المشكلة هي، إذا هذا هو في الأصل ق، الآن نحن بحاجة للبدء بشكل واضح تخصيص الذاكرة لر. وبعبارة أخرى، دعونا رسم هذا للمرة الأخيرة. إذا كانت هذه هي سلسلة ق = GetString. ودعونا نضع هذا الأمر هنا، أيضا. هذا هو GetString. ومن ثم، فإن الصورة عن شيء من هذا القبيل سيكون كما كان من قبل، ز-A-B-الإلكترونية / 0. يبدو أن شيئا قليلا من هذا القبيل. ق وبالتالي، فإننا ندعو هذه 0x50، والتي ستكون 51 و 52. لذلك هذا هو 0x50. وبعد ذلك، أفعل سلسلة ر. في الذاكرة، وهذا مجرد الذهاب ل أعطني مربع صغير مثل هذا. فما هي الخطوة الرئيسية الآن؟ إذا كنت تريد نسخ ق في ر، ما فارغة نحتاج لملء هنا؟ أو ماذا نحتاج ل القيام على مستوى عال؟ نعم؟ شخص ما؟ نعم. الجمهور: نحن بحاجة إلى [غير مسموع]. J. DAVID مالان: نعم، نحن تحتاج إلى ملء هذا الفراغ. لا أستطيع نسخ ثم استغلال اسم غابي حتى أطلب من نظام التشغيل لجزء آخر من الذاكرة هذا هو على الأقل كبير مثل الأصلي. بحيث يترك لنا السؤال. كيف أطلب من نظام التشغيل لا فقط لpointer-- قليلا بسيطة وهذا ما يسمى، و العنوان، لا pointer-- لمربع صغير بسيط مثل هذا يسمى سلسلة؟ كيف أطلب من التشغيل نظام لجزء كبير من الذاكرة؟ حتى الآن، لقد حصلت فقط أن يعود بشكل غير مباشر عن طريق الاتصال GetString. فكيف يتم GetString حتى الحصول على ذاكرته؟ حسنا، اتضح أن هناك هذه وظيفة أخرى هنا أننا سوف الآن البدء في استخدام. الآن، وهذا يبدو than-- بطريقة أكثر خفي وأنا الوحيد الذي يمكن أن نرى it-- هذا الخط يبدو الطريق أكثر خفي ثم ينبغي له للوهلة الأولى. ولكن دعونا ندف إربا. على الجانب الأيسر، ولدي شار * ر. حتى في اللغة الإنجليزية، لنبدأ في صياغة الجمل المناسبة في المصطلحات التقنية. لذلك هذا هو تخصيص متغير نوع شار * دعا ر. الآن، ماذا يعني ذلك حقا؟ حسنا، وهذا يعني، ما أنا ذاهب لوضع هذا المتغير يسمى ر؟ عنوان إحدى شار. ذلك أن مجرد بساطة، أكثر طريقة معقولة لوصف الجانب الأيسر. بحيث يخلق هذا الإطار هنا فقط. وبالتالي فإن الجانب الأيمن، يفترض، يجري تخصيص أن أكبر جزء من الذاكرة كيف؟ لذلك دعونا ندف هذا عدا. انها الساحقة للوهلة الأولى، ولكن ما يحدث داخل هنا؟ أولا، هناك malloc، التي على ما يبدو صديقنا الجديد، "الذاكرة تخصص". لذلك هذا هو حجة يتم تمريرها في ذلك، لذلك هو حجة كبيرة جدا. لذلك دعونا ندف هذا عدا. strlen من ليالي بالطبع، يمثل، the-- الجمهور: عدد الأحرف. J. DAVID مالان: مجرد عدد الأحرف في ق. حتى طول ق، السلسلة الأصلية. حتى G-A-B-E. لذلك فمن المحتمل أربعة في هذه الحالة. ماذا أفعل بعد +1 داعيا strlen من ليالي؟ الجمهور: [غير مسموع] J. DAVID مالان: ولهذا الطابع الخاص لاغية. اذا سألتني ما هو طول اسم غابي، وانا ذاهب الى القول الأربعة. تحت غطاء محرك السيارة، رغم ذلك، أحتاج أن البايت الخامس للحرف فارغة. ولهذا السبب أنا القيام +1. الآن فقط في حال كنت تقوم بتشغيل هذا برنامج على جهاز كمبيوتر آخر غير ويقول، الأجهزة CS50، حيث حجم شار قد يكون مختلفا من وجهة نظري الخاصة computer-- تبين أن أستطيع أن أسمي هذا مشغل sizeof، فقط أسأل الكمبيوتر، ما هو حجم شار على هذا الكمبيوتر؟ وبضرب خمسة في هذا مثلا عن طريق حجم شار، التي على معظم أجهزة الكمبيوتر سوف يكون واحد فقط، malloc يجري تخصيص بالنسبة لي هذا كبير جزء من الذاكرة أكثر من هنا على اليمين. وانها سوف return-- وهو function-- لذلك فمن سوف تعود لي ماذا؟ الجمهور: عنوان؟ J. DAVID مالان: عنوان ماذا؟ الجمهور: من الذاكرة فإنه المخصصة؟ J. DAVID مالان: من الذاكرة التي خصصت. لذلك ليس لدي أي فكرة، وبصراحة، أين يحدث هذا في نهاية المطاف. انا ذاهب الى أقترح أن انها سوف ينتهي في 0x88. تعسفية تماما، ولكن في مكان آخر غير 0x50، لأن نظام التشغيل، ما ويندوز وماك OS تفعل بالنسبة لي، هو تأكد من أنه هو إعطاء لي أجزاء مختلفة من ذاكرة الوصول العشوائي. لذلك هذا هو القيمة التي يكون فيها ذلك جزء من الذاكرة قد ينتهي. لذلك هذا هو ما ينتهي هنا، 0x88. حتى الآن بوضوح، أستطيع أن أفهم أن هذا ليس نفس هذا، لأنهم لافتا في أجزاء مختلفة من الذاكرة. لذلك إن أنا الآن فعلا تريد نسخ هذا في، دعونا نفعل الحل المقترح. دعنا نذهب فقط، إنشاء لحلقة، والقيام قوس ط ر ق يحصل قوس ط. لأنني الآن يمكن استخدام هذا مثل صفيف التدوين، لأنه حتى وإن malloc جدا تخصص بشكل عام لي الذاكرة، الذاكرة بايت فقط متجاورة. بايت، بايت، البايت، والعودة إلى العودة إلى الوراء. يمكنني بالتأكيد كمبرمج التعامل معها على أنها صفيف، التي يعني أنا يمكن استخدام هذه مألوفة أخيرا التدوين من مجرد بعض أقواس معقوفة. لذلك اسمحوا لي وقفة هناك، ل هذا هو الكثير في كل مرة، حتى على الرغم من أن الفكرة الأساسية لخلاصة هي أن سلسلة، كل هذا الوقت، ليس من نوع بيانات جديدة في حد ذاتها. انها مجرد مؤشر يسمى، عنوان إحدى الطابع، وهو ما يعني مجرد انها عددا أنه من خلال اتفاقية الإنسان نحن نميل الى الكتابة كما 0X شيء. ولكن هذا مجرد رقم، 33 مثل شارع أكسفورد، الذي صادف أن يكون عنوان بناء CS ل. أي أسئلة حول هذه التفاصيل؟ نعم؟ الجمهور: لماذا نحن تحقق لر يساوي فارغة؟ J. DAVID مالان: لماذا نحن تحقق لر يساوي فارغة؟ إذا قرأنا documentation-- question-- كبيرة لmalloc، انها ستقول في غرامة المطبوعة، أحيانا malloc قد تعود فارغة تماما مثل GetString. وبالفعل، GetString يعود لاغية إذا، في المقابل، malloc ترجع خالي، لأن يستخدم GetString malloc. وهذا يمكن أن يحدث إذا كان نظام التشغيل، نظام التشغيل ماك، ويندوز، أيا كان، هو ببساطة من ذاكرة لك. وهذا ما حدث هناك. واسمحوا لي أن تكشف عن شيء واحد الآخر قد مجرد ضربة عقلك أو أن يكون تماما بعيدا جدا تجاوزت خط المرمى. ولكن اسمحوا لي سحب ما يصل نفسه بالنسبة لحلقة النسخ، وقبل لحظة، واستدعاء هذا. قوس ط ر ق يحصل قوس ط. لطيفة وسهلة الاستخدام. كأنه أسبوعين مرة أخرى. ولكن هذا الإصدار في الواقع يمكن أن يكون إعادة كتابة عن هذا، الذي يبدو خفي. انها مؤشر تقنية تسمى الحساب وعنوان الحساب. ولكن لماذا هذا العمل؟ الآن بشكل مزعج، و مؤلفو C قرر استخدام و* رمز لأغراض مختلفة. لقد رأينا ذلك تستخدم مرة واحدة بالفعل، * شار، التي تعني "أعطني متغير ما يجري لاحتواء عنوان شار ". * شار جدا في هذا السياق يعني "أعطني متغير". لسوء الحظ، إذا كنت تستخدم دون * كلمة أمامه، مثل شار، انه دعا الآن مشغل إلغاء مرجعية. وسنرى المزيد من هذا قبل وقت طويل. ولكنه يعني فقط "الذهاب إلى هناك". انها مثل القول، إذا كان شخص سلمني على قطعة من الورق "33 شارع أكسفورد" إذا كنت تفعل "* 33 شارع أكسفورد،" وهذا يعني "السير في الطريق إلى بناء CS". * يعني ذلك فقط الذهاب إلى هناك إذا ليس هناك كلمة أمامه. فما هو ر، أن تكون واضحة؟ ر هو عنوان قطعة من الذاكرة التي أعطيت back to ي. ق هو عنوان ما، أن تكون واضحة، في المثال كنا نناقش، من غابي صغيرة؟ ق هو عنوان of-- الحضور: السلسلة. J. DAVID مالان: من اسم غابي الأصلي. لذلك فمن عنوان هذا جزء من الذاكرة. لذلك إذا قلت ر + i-- ط، اشعار، هو مجرد صديقنا القديم. انها مجرد متغير مؤشر هذا ما بالتكرار من الصفر على ما يصل على طول سلسلة ق. لذلك سيكون من الصفر، ثم واحدة، ثم اثنين، ثم ثلاثة، ثم أربعة. لذلك دعونا تجميع هذه جديدة مثل الصفر قطع اللغز، اذا صح التعبير، على الرغم من ذلك، مرة أخرى، بناء الجملة هو أكثر بكثير غامضة من خدش. حتى ر هو عنوان + ط سوف تعطيني عدد، لأن هذه كلها الأرقام التي كنا الرسم على النحو عرافة. ولكنهم مجرد أرقام. حتى إذا كان عنوان ر قلنا كان 0x88، 0x88 بالإضافة إلى ما هو الصفر. حتى لو كنت غير مريح مع عرافة بعد، واتخاذ تخمين. الحضور: الأصلي. J. DAVID مالان: لا يزال 0x88. فماذا * 0x88 تعني؟ وهو ما يعني، "الذهاب إلى هناك" وهو ما يعني على نحو فعال، "وضعت إصبعك هنا." والآن على الجانب الأيمن من هذا التعبير، * ثم في parens، ق + ط يعني، والذي هو معالجة هنا للز قليلا. ق + 0 هي، بطبيعة الحال، S، كل ما هو ق. وحتى الآن، فإنه من S *، الذي مثل * 33 شارع أكسفورد يعني الانتقال إلى العنوان ق. حتى هنا هذا الاصبع، اليد اليمنى. فما أنا ذاهب إلى نسخ إلى ماذا؟ الشيء على الحق، الذي هو غابي، والقليل ز هنا، إلى هنا. وبالتالي فإن تأثير ذلك التكرار الأول من الحلقة، كما يمكنك المقترحة، على الرغم من أنها تبدو مجنون أكثر تعقيدا من أي شيء رأيناه من قبل، هو ببساطة قائلا تذهب هنا ونسخ تلك الشخصية هنا. انها تعطيك الخريطة لكلا الموقعين. وسنرى أكثر بكثير من هذا. لكنه الآن، والأمل هو فقط ل إدخال بعض من هذه الأفكار الأساسية. وبالفعل، دعونا ننظر في واحد البرنامج النهائي هنا، ثم claymation وعدت، الأمر الذي سيجعل كل شيء بخير. كل الحق. لذلك اسمحوا لي فتح up-- هناك نذهب. لذلك دعونا me-- سنعود لهذه الصورة قبل فترة طويلة. اسمحوا لي أن فتح هذا المثال النهائي هنا. حتى هنا هو السوبر، والسوبر البرنامج الذي يحقق لا شيء في الحياة أن يفعل ما يلي. لأول مرة يعلن متغيرين، س و y، التي لا الأعداد هذه المرة، في حد ذاتها. انهم ليسوا الأعداد الصحيحة، في حد ذاتها. هم على ما يبدو كثافة العمليات *. حتى مجرد أي شخص، ماذا يعني إذا كان نوع البيانات الخاصة بك، متغير الخاص بك، هو من نوع int * نجمة؟ هذا هو عنوان لكثافة العمليات. لذلك ليس لدي فكرة أين هو حتى الان. هو فقط يعني "وضع، في نهاية المطاف، عنوان لكثافة العمليات هنا ". 0x50، 0x88، أينما كان في الذاكرة، عنوان يجري هناك. وهذا ما هو ذ ستكون كذلك. إذا أنا الآن أقول س = malloc (sizeof (دولي))، هذا هو وسيلة للقول، يا نظام التشغيل، عبر malloc، أعطني ذاكرة كافية لحجم لكثافة العمليات، والتي ربما سيكون 32 بت أو أربعة بايت. فماذا malloc العودة؟ Malloc بإرجاع العنوان. ذلك ما سوف تحصل المخزنة في العاشر؟ عنوان قطعة من الذاكرة، وحدات البايت الأربع، التي malloc وجدت فقط بالنسبة لي بسؤال نظام التشغيل. الآن وفي الوقت نفسه، خط أربعة هنا، و* س = 42. مجرد أن تكون واضحة، ماذا يجري هناك؟ على الجانب الأيسر، * س. هذا مثل * 33 شارع أكسفورد. * حتى العاشر يعني ماذا؟ الجمهور: الذهاب إلى. J. DAVID مالان: اذهب إلى هذا العنوان. أينما ان قسما من الذاكرة، انتقل إلى ذلك. ووضع ما هناك، من الواضح؟ الجمهور: 42. J. DAVID مالان: 42. كل الحق، * ذ، نفس الفكرة. الانتقال إلى العنوان في ص. وضع عدد 13 هناك، ولكن ما هو y في هذه اللحظة؟ الجمهور: لا يوجد الذاكرة لذ. J. DAVID مالان: لا لا يوجد الذاكرة لذ. فماذا يفعل ذ ربما تحتوي، كما كنا نقوله؟ الجمهور: القمامة. J. DAVID مالان: بعض القيمة القمامة. الآن، قيمة القمامة لا تزال عددا. يمكن أن يكون لا يزال مخطئا لعنوان. فهو كما لو أن شخص ما خربش شيء إلى أسفل، وأنا يساء فهمها على أنها معنى بعض المباني في الشارع. وإذا كنت مجرد محاولة للذهاب الى بناء بعض كنت لا تملك، أو بعض جزء من الذاكرة لديك لا كانت معينة، أشياء سيئة قد يحدث. الكمبيوتر قد تحطم، أو بعض الدول الاخرى قد يحدث السلوك غير محدد. ذلك مقدمة، ثم، لبينكي هو هذا. ما زلت أتذكر، 20 بعد بضع سنوات ونيف، أين كنت عندما كنت أخيرا فهم المؤشرات. وهو ما يعني، إذا كنت ترك هنا في ثلاث دقائق وأعتقد أنني لا فهم المؤشرات، وتحقيق لقد تذكرت ل20 سنوات لسبب مجنون عندما ولماذا غرقت أخيرا في، ويجلس مع تدريسي زميل، نيشات ميهتا في ظهر إليوت قاعة الطعام. الآن، لقد تذكرت هذا لأن هذا كان أحد المواضيع الأول، في على وجه الخصوص، كافح مع. وبعد ذلك، لمعت أخيرا، مثل أجرؤ على القول الكثير من المواضيع في نهاية المطاف. والآن، لجعل هذا يشعر كل سعادة وجميع أكثر إقناعا، دعونا نلقي نظرة النهائي في منطقتنا مشاركة ثلاث دقائق هنا في بينكي، من صديقنا، نيك Parlante من جامعة ستانفورد. [VIDEO قراءة] يا، بينكي. استيقظ! حان الوقت لمؤشر المرح. وماذا هذا؟ تعرف على المؤشرات؟ أوه، جودي! حسنا، للبدء، أعتقد أننا تسير في حاجة إلى مؤشرات الزوجين. -OK. هذا الرمز يخصص اثنين من المؤشرات، والتي يمكن أن نشير إلى أعداد صحيحة. -OK. حسنا، أرى مؤشرات اثنين، لكنها لا يبدو أن تشير إلى أي شيء. المفتى صحيح. في البداية، مؤشرات لا تشير إلى أي شيء. الأشياء التي نشير مدعوون ل pointees، وإقامتها ل خطوة منفصلة. أوه، الحق، الحق. كنت أعرف ذلك. وpointees منفصلة. إيه، لذلك كيف يمكنك تخصيص pointee؟ -OK. حسنا، يخصص هذا الرمز وpointee عدد صحيح جديدة، وهذا الجزء العاشر مجموعات للإشارة إلى ذلك. يا، التي تبدو أفضل. حتى جعله يفعل شيئا. -OK. وسوف أكون dereference المؤشر X ل تخزين رقم 42 في pointee لها. لهذه الخدعة، أنا بحاجة بلدي العصا السحرية من يعتبر إلغاء مرجعية. -Your العصا السحرية من يعتبر إلغاء مرجعية؟ That-- هذا أمر عظيم. ، هذا هو ما يبدو رمز مثل. أنا تأسيسها لأول مرة في العدد، و[POP] يا، نظرة. هناك تذهب. -حتى القيام على إلغاء مرجعية س يتبع السهم للوصول pointee لها. في هذه الحالة، مخزن 42 في هناك. مهلا محاولة استخدامه لتخزين عدد 13 عن طريق مؤشر آخر، ذ. -OK. سأذهب فقط أكثر من هنا إلى ص، والحصول على رقم 13 الإعداد. ثم، واتخاذ العصا من ويعتبر إلغاء مرجعية فقط [BUZZ] أوه! أوه، مهلا! ان لم ينجح. أقول، بينكي، وأنا لا أعتقد يعتبر إلغاء مرجعية ذ هو فكرة جيدة، لأنك تعرف، إنشاء pointee خطوة منفصلة. وأنا لا أعتقد أننا فعلنا ذلك من أي وقت مضى. نقطة الخير. -Yeah. نحن تخصيص ذ المؤشر، ولكننا أبدا تعيينها للإشارة إلى pointee. ملاحظ -جدا. يا، كنت تبحث جيدة هناك، بينكي. يمكنك إصلاحه بحيث نقاط ذ لنفس pointee والعاشر؟ -Sure. سوف تستخدم بلدي العصا السحرية من مؤشر الواجب. * هل هذا سيكون مشكلة مثل قبل؟ -No. هذا لا تلمس pointees. يتغير مؤشر واحد فقط ل تشير إلى الشيء نفسه آخر. أوه، أرى. الآن نقطة Y لنفس المكان س. حتى الانتظار. الآن، هو ثابت ذ. أنه يحتوي على pointee. لذلك يمكنك محاولة العصا من يعتبر إلغاء مرجعية مرة أخرى لإرسال أكثر من 13. -Uh، موافق. هنا يذهب. [POP] يا، أن ننظر في ذلك. يعتبر إلغاء مرجعية الآن يعمل على ذ. ولأن مؤشرات وتقاسم أن pointee واحد، وكلاهما يرى 13. -Yeah. تقاسم، أيا كان. لذلك نحن ذاهبون للتبديل الأماكن الآن؟ أوه، تنظر. نحن من الوقت. -But-- ، فقط تذكر القواعد رمية ثلاثية. رقم واحد، والهيكل الأساسي هو أن لديك مؤشر، ويشير على إلى pointee. لكن المؤشر و pointee منفصلة، والخطأ الشائع هو وضع مؤشر، ولكن أن ننسى أن تعطيه pointee. عدد اثنين، مؤشر يعتبر إلغاء مرجعية يبدأ في المؤشر ويتبع السهم على مدى للوصول pointee لها. كما نعلم جميعا، وهذا يعمل فقط إذا كان هناك وpointee، أي نوع من يعود للمادة رقم واحد. رقم ثلاثة، مؤشر احالة يأخذ مؤشر واحد وتغيير ذلك للإشارة إلى نفس pointee كما مؤشر آخر. حتى بعد الاحالة، المؤشرات اثنين سوف نشير إلى نفس pointee. في بعض الأحيان، وهذا ما يسمى تقاسم. وهذا كل ما في الامر، حقا. وداعا الآن. [END تشغيل الفيديو] J. DAVID مالان: هذا كل شيء لCS50. سنرى في الأسبوع القادم.