[عزف الموسيقى] DOUG لويد: مؤشرات، نحن هنا. وربما هذا هو الذهاب الى يكون الموضوع الأكثر صعوبة أن نتحدث عن في CS50. وإذا كنت قد قرأت أي شيء حول مؤشرات قبل قد يكون قليلا تخويف الذهاب إلى هذا الفيديو. هذا صحيح ومؤشرات لا يسمح لك القدرة لربما المسمار سيئة جدا عندما كنت العمل مع المتغيرات، والبيانات، وتسبب البرنامج لتحطم الطائرة. ولكنها في الواقع مفيدة حقا وأنها تسمح لنا طريقة رائعة حقا لتمرير البيانات مرة أخرى و وما بين وظائف، أننا غير قادر على القيام به. وذلك ما كنا حقا نريد أن نفعل هنا هو القطار أن يكون لديك الانضباط مؤشر جيد، لذلك التي يمكنك استخدامها مؤشرات فعال لجعل البرامج التي أفضل بكثير. كما قلت مؤشرات تعطينا مختلفة طريقة لتمرير البيانات بين وظائف. الآن إذا كنت تذكر من فيديو في وقت سابق، عندما كنا نتحدث عن نطاق متغير، التي ذكرتها أن جميع البيانات التي نمر بين يتم تمرير وظائف في C من حيث القيمة. وأنا ربما لم يستخدم هذا المدى، ما قصدته هناك وكان أن نمر بها نسخ من البيانات. عندما كنا تمرير متغير إلى وظيفة، نحن لا يمر في الواقع المتغير إلى وظيفة، أليس كذلك؟ نحن تمرير نسخة من تلك البيانات إلى وظيفة. وظيفة يفعل ما سيكون عليه ويحسب بعض القيمة، وربما يمكننا استخدام هذه القيمة عندما يعطي إعادته. كان هناك استثناء واحد ل هذه القاعدة تمرير من حيث القيمة، وسوف نعود إلى ما ذلك قليلا في وقت لاحق في هذا الفيديو. إذا كان لنا أن استخدام مؤشرات بدلا من ذلك استخدام المتغيرات، أو بدلا من استخدام المتغيرات أنفسهم أو نسخ من المتغيرات، يمكننا الآن تمرير المتغيرات حول بين الوظائف بطريقة مختلفة. وهذا يعني أنه إذا جعلنا تغيير في وظيفة واحدة، وهذا التغيير يأخذ الواقع تأثير في وظيفة مختلفة. مرة أخرى، هذا هو الشيء الذي نحن لا يمكن أن تفعل في السابق، وإذا كنت قد حاولت من أي وقت مضى لمبادلة قيمة اثنين من المتغيرات في وظيفة، كنت قد لاحظت هذه المشكلة نوع من تزحف، أليس كذلك؟ إذا كنا نريد لمبادلة X و Y، ونحن تمريرها إلى وظيفة تسمى المبادلة داخل وظيفة مبادلة المتغيرات تفعل القيم التبادلية. واحد يصبح اثنين، يصبح اثنين واحد، لكننا لا فعلا تغيير أي شيء في النص الأصلي وظيفة، في المتصل. لأنه لا نستطيع، نحن فقط العمل مع نسخ منها. مع مؤشرات على الرغم من أننا يمكن تخرجت بالفعل X و Y إلى وظيفة. أن وظيفة يمكن أن تفعل شيء معهم. وتلك القيم المتغيرات يمكن تغيير الواقع. ولهذا لا بأس به التغيير في قدرتنا على العمل مع البيانات. قبل أن يغوص مؤشرات، وأعتقد أنه يستحق أخذ بضع دقائق ل العودة إلى الأساسيات هنا. وإلقاء نظرة على كيف أعمال ذاكرة الكمبيوتر لأن هذين الموضوعين تسير ليكون في الواقع مترابطة جدا. كما تعلمون، على نظام الكمبيوتر الخاص بك لديك القرص الصلب أو ربما محرك أقراص الحالة الصلبة، نوعا من موقع تخزين الملفات. انها عادة ما تكون في مكان ما في حي 250 غيغا بايت لربما بضعة تيرابايت الآن. وحيث كل الخاص بك ملفات نعيش في نهاية المطاف، حتى عندما يتم إيقاف جهاز الكمبيوتر الخاص بك الخروج، يمكنك تشغيله مرة أخرى وسوف تجد الملفات الخاصة بك هناك مرة أخرى عند إعادة تشغيل النظام الخاص بك. ولكن محركات الأقراص، مثل محرك القرص الثابت، الأقراص الصلبة، أو محرك أقراص الحالة الصلبة، وهو SSD، هي مساحة التخزين عادل. لا نستطيع أن نفعل أي شيء في الواقع مع البيانات التي في القرص الصلب، أو في محرك أقراص الحالة الصلبة. من أجل تغيير الواقع البيانات أو تحريكه، علينا أن نتحرك ل RAM، ذاكرة الوصول العشوائي. الآن RAM، لديك الكثير أقل من في جهاز الكمبيوتر الخاص بك. قد يكون لديك مكان ما في حي 512 ميغا بايت إذا كان لديك جهاز كمبيوتر قديم، لربما اثنين، أربعة، ثمانية، 16، ربما قليلا أكثر من ذلك، غيغابايت من ذاكرة الوصول العشوائي. حتى أن أصغر بكثير، ولكن هذا حيث كافة البيانات متقلبة موجودا. هذا هو المكان الذي يمكننا تغيير الأمور. ولكن عندما ننتقل من جهاز الكمبيوتر الخاص بنا، كافة البيانات في ذاكرة الوصول العشوائي وتدمير. ولهذا السبب نحن بحاجة إلى القرص الثابت للموقع أكثر دواما من ذلك، بحيث أنه سيكون exists- يكون سيئا حقا اذا في كل مره نحن تحول جهاز الكمبيوتر الخاص بنا من كل تم طمس ملف في نظامنا. لذلك نحن نعمل داخل RAM. وفي كل مرة كنا نتحدث عن الذاكرة، الى حد كبير، في CS50، نحن نتحدث عن ذاكرة الوصول العشوائي، وليس القرص الثابت. حتى عندما وتحريك الأمور في الذاكرة، يستغرق ما يصل كمية معينة من الفضاء. كل أنواع البيانات التي كنا نعمل مع تناول مختلف كميات من المساحة في ذاكرة الوصول العشوائي. هكذا في كل مرة تقوم بإنشاء عدد صحيح متغيرة، أربعة بايت من الذاكرة وتوضع جانبا في RAM حتى تتمكن يمكن أن تعمل مع هذا صحيح. يمكنك أن يعلن صحيح، تغييره، تخصيص إلى قيمة 10 يتزايد من جانب واحد، لذلك على وهلم جرا. كل ما يجب أن يحدث في ذاكرة الوصول العشوائي، وتحصل على أربعة بايت للعمل مع لكل صحيح أن خلق لكم. كل حرف لك إنشاء يحصل بايت واحد. هذا مجرد كم المساحة هناك حاجة لتخزين حرف. كل عائم، وهو حقيقي عدد، ويحصل على أربعة بايت إلا إذا كان ضعف دقة نقطة عائمة عدد، والذي يسمح لك ل لدينا أرقام أكثر دقة أو أكثر بعد العلامة العشرية دون أن تفقد الدقة، الذي يستغرق ثمانية بايت من الذاكرة. يتوق طويلة أعداد صحيحة كبيرة حقا، كما تناول ثمانية بايت من الذاكرة. كم بايت من الذاكرة لا سلاسل يستغرق؟ حسنا دعونا نضع دبوس في هذا السؤال في الوقت الحالي، ولكننا سوف نعود إليها. ويعود ذلك إلى هذه الفكرة من الذاكرة كما مجموعة كبيرة من الخلايا بايت الحجم. هذا هو حقا كل ما هو، انها مجرد مجموعة ضخمة من الخلايا، تماما مثل أي مجموعة أخرى كنت على دراية ومعرفة، إلا كل عنصر هو بايت واحد واسعة. وتماما مثل صفيف، كل عنصر له عنوان. كل عنصر من عناصر مجموعة يحتوي فهرس، ونحن يمكن استخدام هذا مؤشر لقيام ما يسمى وصول عشوائي على مجموعة. ليس لدينا للبدء في بداية المصفوفة، تكرار خلال كل عنصر واحد منها، للعثور على ما نبحث عنه. يمكننا القول فقط، وأريد للوصول الى عنصر ال15 أو العنصر 100th. ويمكنك تمرير فقط في هذا العدد والحصول على القيمة التي تبحث عنها. وبالمثل كل مكان في الذاكرة ديه عنوان. لذلك قد ذاكرتك ننظر بشيء من هذا القبيل. وهنا قطعة صغيرة جدا من الذاكرة، وهذا هو 20 بايت من الذاكرة. وحدات البايت 20 الأولى لأن بلدي يعالج هناك في الأسفل هي 0، 1، 2، 3، وهكذا على كل وسيلة تصل إلى 19. وعندما أعلن المتغيرات و عندما أبدأ العمل معهم، النظام هو الذهاب الى مجموعة جانبا بعض المساحة بالنسبة لي في هذه الذاكرة للعمل مع المتغيرات بلدي. لذلك أنا قد يقول، شار ج يساوي رأس المال H. وماذا سيحدث؟ حسنا النظام هو الذهاب الى جانبا بالنسبة لي بايت واحد. في هذه الحالة اختار عدد بايت أربعة، البايت في عنوان الأربعة، وانها تسير لتخزين رسالة H رأس المال في هناك بالنسبة لي. إذا كنت ثم يقول الباحث سرعة الحد يساوي 65، انها الذهاب إلى جانبا أربعة بايت من الذاكرة بالنسبة لي. وانها تسير لعلاج تلك أربعة بايت كوحدة واحدة لأن ما نعمل مع عدد صحيح هنا. وانها تسير لتخزين 65 في هناك. الآن بالفعل انا من النوع أقول لك شيئا من الكذب، الحق، لأننا نعلم أن أجهزة كمبيوتر تعمل في ثنائي. أنهم لا يفهمون بالضرورة ما هو رأس المال H أو ما هو 65، إلا أنها فهم الثنائية، الأصفار ومنها. وذلك في الواقع ما نحن تخزينها في هناك ليس هو الحرف H وعدد 65، ولكن بدلا من تمثيلات الثنائية منها، والتي تبدو شيئا قليلا من هذا القبيل. وعلى وجه الخصوص في سياق متغير عدد صحيح، انها لن فقط يبصقون عليه في، انها ليست الذهاب الى التعامل معها على أنها واحدة أربعة بايت قطعة بالضرورة، انها تسير فعلا إلى التعامل معها على أنها واحدة أربعة أجزاء بايت، والتي قد تبدو شيئا من هذا القبيل. وحتى هذه ليست صحيح تماما سواء، بسبب ما يسمى وendianness، والتي نحن لسنا الذهاب للوصول الى الآن، ولكن إذا كنت غريبة عن، يمكنك أن تقرأ حتى على القليل وendianness كبير. ولكن من أجل هذه الحجة، من أجل هذا الفيديو، دعونا مجرد افتراض وهذا هو، في حقيقة، كيف يمكن للعدد 65 من شأنه أن تكون ممثلة في الذاكرة على كل نظام، على الرغم من أنه ليس صحيحا تماما. ولكن دعونا في الواقع مجرد الحصول على التخلص من كل ثنائي تماما، ومجرد التفكير كما H و65، فإنه من الأسهل كثيرا لنفكر في ذلك مثل أن كإنسان. كل الحق، لذلك يبدو أيضا ربما يذكر أن I've- نظام عشوائي بلدي لم يعطوني بايت 5، 6، 7، و8 لتخزين عدد صحيح. هناك سبب لذلك، أيضا، التي نحن لن ندخل في الوقت الراهن، ولكن يكفي أن نقول أن ما تقوم الكمبيوتر هنا من المحتمل ان يكون خطوة جيدة من جانبها. أن لا تعطيني ذاكرة هذا بالضرورة العودة إلى الوراء. على الرغم من أنه سيفعل ذلك الآن إذا كنت ترغب في الحصول على سلسلة أخرى، دعا اللقب، وأنا أريد لوضع لويد في هناك. انا بحاجة الى الذهاب الى تناسب واحد حرف، كل حرف من هذا هو سيتطلب واحد حرف، بايت واحد من الذاكرة. حتى لو كنت قد وضعت لويد إلى مجموعة بلدي مثل هذا انا جيد جدا للذهاب، أليس كذلك؟ ما هو مفقود؟ تذكر أن كل سلسلة نعمل مع في C ينتهي مائل الصفر، ونحن لا نستطيع تجاهل ذلك هنا أيضا. نحن بحاجة إلى تخصيص بايت واحد من الذاكرة لنرى أن لذلك نحن تعرف متى سلسلة لدينا قد انتهت. ذلك مرة أخرى هذا الترتيب الطريق الأشياء تظهر في قوة الذاكرة تكون عشوائية قليلا، ولكنه في الواقع كيف تم تصميم معظم الأنظمة. لخط لهم في مضاعفات لأربعة أطفال، لأسباب أخرى أننا لسنا في حاجة ل ندخل الآن. لكن هذا، لذلك يكفي أن نقول أن بعد هذه الخطوط الثلاثة للقانون، هذا هو ما الذاكرة قد تبدو. إذا كنت بحاجة إلى مواقع الذاكرة 4، 8، و 12 لعقد البيانات الخاصة بي، هذا هو ما ذاكرتي قد تبدو. ويكون مجرد وخاصة متحذلق هنا، عندما نحن نتحدث عن الذاكرة عناوين ونحن عادة تفعل ذلك باستخدام الرموز الست عشرية. فلماذا لا يتم تحويل كل هذه من عشري إلى تدوين ست عشري فقط لأن هذا هو عموما كيف يمكننا الرجوع إلى الذاكرة. وذلك بدلا من كونها من 0 إلى 19، ما لدينا هو الصفر س الصفر من خلال الصفر X1 الثلاثة. تلك هي 20 بايت من الذاكرة التي نحن وأو نحن نبحث في في هذه الصورة هنا. لذلك كل من أن يقال، دعونا الابتعاد عن ذاكرة لثانية واحدة والعودة إلى المؤشرات. هنا هو الأهم الشيء المهم أن نتذكر ونحن نبدأ العمل مع المؤشرات. مؤشر شيء أكثر من عنوان. سأقولها مرة أخرى ل انها بتلك الأهمية، مؤشر شيء أكثر من عنوان. مؤشرات هي عناوين لمواقع في الذاكرة حيث تعيش المتغيرات. مع العلم أن يصبح نأمل أن قليلا أسهل للعمل معهم. شيء آخر أود القيام به هو أن يكون الفرز من المخططات التي تمثل بصريا ما هو يحدث مع خطوط مختلفة من التعليمات البرمجية. وسنفعل ذلك بضع مرات في المؤشرات، وعندما نتحدث عن ديناميكية تخصيص الذاكرة أيضا. لأنني أعتقد أن هذه المخططات يمكن أن تكون مفيدة بشكل خاص. لذلك إذا قلت على سبيل المثال، الباحث ك في قانون بلدي، ما الذي يحدث؟ حسنا ما يحدث في الأساس هو انني اتلقى الذاكرة جانبا بالنسبة لي، ولكن أنا لا أحب حتى التفكير في الامر من هذا القبيل، وأنا أحب أن أفكر في ذلك مثل مربع. لدي مربع وانها اللون الأخضر لأنني يمكن وضع الأعداد الصحيحة في صناديق خضراء. إذا كان حرف I قد يكون لديك المربع الأزرق. ولكن أقول دائما، إذا أنا خلق مربع التي يمكن أن تعقد صحيحة هو اللون الذي المربع الأخضر. وأغتنم علامة دائمة وأنا أكتب ك على الجانب منه. لذلك ليس لدي صندوق يسمى ك، إلى التي يمكن أن أضع صحيحة. لذلك عندما أقول الباحث ك، وهذا ما يحدث في رأسي. إذا قلت ك يساوي خمسة، ماذا أفعل؟ حسنا، أنا أضع خمسة في المربع، والحق. هذا واضح وصريح جدا، إذا أقول الباحث ك، إنشاء صندوق يسمى ك. إذا قلت ك يساوي 5، وضع خمسة داخل منطقة الجزاء. نأمل أن هذا ليس كثيرا من قفزة. هنا حيث تسير الأمور على مثيرة للاهتمام قليلا بالرغم من ذلك. إذا قلت كثافة * PK، وأيضا حتى لو كنت لا تعرف ماذا يعني هذا بالضرورة، انها حصلت بوضوح شيئا للقيام مع عدد صحيح. لذلك أنا ذاهب لتلوين هذا المربع الأخضر العش، وأنا أعلم أنه حصل شيء للقيام مع عدد صحيح، ولكنها ليست عددا صحيحا في حد ذاته، لأنه نجم كثافة العمليات. هناك شيء قليلا تختلف عن ذلك. لذلك تضمن العدد الصحيح، و لكن على خلاف ذلك انها لا تختلف كثيرا عن ما كنا نتحدث عنه. انها مربع، وحصلت لها تسمية، انها ترتدي PK التسمية، وانها قادرة على عقد النجوم المترجم، ومهما كانت تلك هي. لديهم أن تفعل شيئا مع الأعداد الصحيحة، بشكل واضح. وهنا السطر الأخير على الرغم من. إذا قلت PK = & K، قف، ما حدث للتو، أليس كذلك؟ لذلك هذا رقم عشوائي، على ما يبدو عشوائي عدد، ويحصل على القيت في مربع هناك. كل هذا هو، PK يحصل على عنوان ك. لذلك أنا التمسك حيث يعيش ك في الذاكرة، عنوانه، وعنوان بايت لها. كل ما أفعله هو أنني أقوله أن القيمة هي ما أنا ذاهب لوضع داخل بلدي مربع يسمى كيه. ولأن هذه الأمور مؤشرات، ولأن النظر في سلسلة مثل الصفر س ثمانية صفر ج سبعة أربعة ثمانية اثنين من الصفر هو على الارجح لا معنى للغاية. عندما كنا تصور عموما المؤشرات، ونحن في الواقع تفعل ذلك في المؤشرات. PK يعطينا المعلومات نحن بحاجة للعثور ك في الذاكرة. وذلك أساسا PK له السهم في ذلك. وإذا كنا السير على طول لذلك السهم، تخيل انه شيء يمكنك المشي على، واذا كنا المشي على طول السهم، عند منتهى طرفه ذلك السهم، ونحن سوف تجد الموقع في الذاكرة حيث يعيش ك. وهذا أمر مهم حقا لأنه بمجرد نعرف أين يعيش ك، يمكننا أن نبدأ في العمل مع البيانات داخل هذا الموقع الذاكرة. على الرغم من أننا نحصل على صغير بت قبل أنفسنا الآن. فما هو مؤشر؟ مؤشر هو بند البيانات التي القيمة هي عنوان الذاكرة. كان ذلك أن الصفر العاشر ثمانية الاشياء الصفر يدور، وكان ذلك عنوان الذاكرة. كان ذلك المكان في الذاكرة. ونوع مؤشر يصف هذا النوع البيانات ستجد في ذلك عنوان الذاكرة. لذلك هناك جانب الحق نجمة الباحث. إذا كنت اتبع ذلك السهم، انها الذهاب إلى يقودني إلى الموقع. وهذا الموقع، ما سوف تجد هناك في بلدي على سبيل المثال، هو مربع ملون أخضر. انها صحيح، وهذا ما سوف تجد إذا ذهبت إلى هذا العنوان. نوع البيانات ل مؤشر يصف ما سوف تجد في هذا العنوان الذاكرة. حتى هنا هو شيء رائع حقا على الرغم من. مؤشرات تسمح لنا بالمرور المتغيرات بين الوظائف. وفعلا تمرير المتغيرات وليس تمرير نسخ منها. لأننا لو نعرف بالضبط أين في الذاكرة لإيجاد متغير، نحن لسنا بحاجة لعمل نسخة من ذلك، يمكننا أن نذهب فقط لهذا الموقع والعمل مع هذا المتغير. حتى في مؤشرات جوهر النوع من جعل بيئة الكمبيوتر الكثير من مثل العالم الحقيقي، والحق. وحتى هنا القياس. دعنا نقول أن لدي جهاز كمبيوتر محمول، الحق، وانها كاملة من الملاحظات. وأود منك لتحديثه. كنت الوظيفة التي ملاحظات التحديثات، والحق. في الطريق كنا العمل حتى الآن، ما يحدث وسوف تتخذ دفتر ملاحظاتي، عليك أن تذهب إلى المتجر نسخة، عليك تقديم نسخة من زيروكس كل صفحة من دفتر الملاحظات. عليك ترك دفتر ظهري على مكتبي عند الانتهاء من ذلك، عليك الذهاب وشطب الأشياء في بلدي دفتر التي هي خارج التاريخ أو خطأ، ثم عليك أن تمر إلى لي كومة من صفحات زيروكس هذا هو نسخة طبق الأصل من دفتر ملاحظاتي مع التغييرات التي قمت بها لذلك. وعند هذه النقطة، والامر متروك لي وظيفة الدعوة، كما المتصل، لكي نقرر اتخاذ الملاحظات و دمجهم مرة أخرى في دفتر ملاحظاتي. لذلك هناك الكثير من الخطوات تشارك هنا، أليس كذلك. كما لن يكون أفضل إذا أنا فقط أقول، مهلا، يمكنك تحديث دفتر ملاحظاتي ل لي، اليد التي دفتر ملاحظاتي، وتأخذ الأشياء و حرفيا عبور بها وتحديث ملاحظاتي في دفتر ملاحظاتي. ثم تعطيني دفتر ظهري. هذا النوع من ما مؤشرات تسمح لنا أن نفعل، أنها تجعل هذه البيئة الكثير أشبه كيف نعمل في الواقع. كل الحق في ذلك وهذا ما مؤشر هو، فلنتحدث حول كيفية عمل المؤشرات في C، و كيف يمكننا أن نبدأ في العمل معهم. ولذلك لا يوجد مؤشر بسيط جدا في C يسمى مؤشر فارغة. ويشير مؤشر فارغة إلى لا شيء. وهذا ربما يبدو انها في الواقع ليس شيئا مفيدا للغاية، ولكن كما سنرى القليل في وقت لاحق، والحقيقة أن هذا مؤشر فارغة موجود في الواقع حقا يمكن أن تأتي في متناول اليدين. وكلما قمت بإنشاء مؤشر، و لم تقم بتعيين immediately- قيمته مثال على وضع قيمته فورا سيكون الشرائح زوجين العودة حيث قلت PK يساوي & K، PK يحصل على عنوان ك، كما سنرى ماذا يعني ذلك، سنرى كيفية رمز أن shortly- إذا كنا لا تعيين قيمته إلى شيء معنى فورا، يجب عليك دائما وضع مؤشر للإشارة إلى قيمة خالية. يجب تعيين ذلك للإشارة إلى شيء. وهذا مختلف جدا من مجرد ترك قيمة كما هو ومن ثم إعلان المؤشر ومجرد افتراض انها باطلة لأن هذا نادرا ما صحيح. لذلك يجب تعيين دائما قيمة مؤشر فارغة إذا لم تقم بتعيين قيمته إلى شيء مفيد على الفور. يمكنك التحقق ما إذا كانت قيمة مؤشر ل لاغيا باستخدام مشغل المساواة (==)، مثلك مقارنة أي عدد صحيح القيم أو القيم حرف باستخدام (==) كذلك. انها نوع خاص من ثابت القيمة التي يمكنك استخدامها لاختبار. بحيث كان بسيط جدا مؤشر، ومؤشر فارغة. وهناك طريقة أخرى لخلق مؤشر هو استخراج عنوان متغير قمت بإنشائها بالفعل، ويمكنك القيام بذلك باستخدام & مشغل عنوان الاستخراج. ونحن قد رأينا بالفعل سابقا في المثال الرسم البياني الأول أظهر لي. لذلك إذا كان x هو المتغير الذي قمنا تم إنشاؤها مسبقا من نوع عدد صحيح، ثم وx هو مؤشر إلى عدد صحيح. & X is- تذكر، ويجري لاستخراج عنوان الشيء على اليمين. ومنذ مؤشر هو مجرد عنوان، من وx هو مؤشر إلى عدد صحيح القيمة التي هي المكان في الذاكرة س الأرواح. انها عنوان إكس. لذلك وx هو عنوان السينية. دعونا ننتهز هذه خطوة واحدة أبعد من ذلك وتتصل شيء أشرت إلى ذلك في شريط فيديو مسبق. إذا آر هو مجموعة من الزوجي، ثم وقوس مربع آر الأول هو مؤشر إلى الضعف. حسنا. آر قوس مربع الأول، إذا آر هو مجموعة من الزوجي، ثم ARR قوس مربع i غير العنصر الأول عشر من هذا الصفيف، و & آر قوس مربع ط هو المكان في ذاكرة عنصر ط عشر من آر موجودا. فما هي الآثار المترتبة هنا؟ اسم المصفوفات، وضمنا هذا كل شيء، غير أن اسم مجموعة غير في الواقع في حد ذاته مؤشر. لقد تم العمل مع مؤشرات على طول في كل مرة أن كنت قد استخدمت صفيف. تذكر من المثال على نطاق متغير، قرب نهاية الفيديو أقدم على سبيل المثال حيث لدينا وظيفة ودعا الباحث مجموعة و وظيفة تسمى مجموعة تعيين. والتحدي الخاص بك لتحديد أم لا، أو ما القيم التي طبعنا في نهاية الدالة، في نهاية البرنامج الرئيسي. اذا كنت أذكر من هذا المثال أو إذا كنت قد شاهدت شريط الفيديو، تعلمون أنه عندما لك- الدعوة إلى مجموعة كثافة العمليات لا تفعل شيئا على نحو فعال. لكن الدعوة لضبط مجموعة لا. وأنا نوع من التغاضي عن السبب هذا هو الحال في ذلك الوقت. قلت للتو، حسنا انها مجموعة، انها خاص، كما تعلمون، هناك سبب. والسبب هو أن مجموعة من الاسم هو في الحقيقة مجرد مؤشر، وهناك هذا خاص تركيب قوس مربع التي جعل الامور ألطف كثيرا للعمل مع. وأنها تجعل فكرة مؤشر الكثير أقل تهديدا، وهذا هو السبب في أنهم النوع من قدم بهذه الطريقة. ولكن في الحقيقة المصفوفات هي مؤشرات فقط. وهذا هو السبب في أننا عندما إجراء تغيير في المصفوفة، عندما مررنا مجموعة كمعلمة إلى وظيفة أو كحجة إلى وظيفة، ومحتويات المصفوفة تغير الواقع في كل من المستدعي وفي المتصل. والتي لكل نوع آخر من كان متغير رأينا ليس هو الحال. لذلك هذا شيء لمجرد أن نضع في الذهن عندما كنت تعمل مع مؤشرات، غير أن اسم ل مجموعة في الواقع مؤشر إلى العنصر الأول من تلك المصفوفة. طيب حتى الآن لدينا كل هذه الحقائق، دعونا نستمر، والحق. لماذا نحن نهتم حيث يعيش شيئا. حسنا كما قلت، انها جميلة من المفيد أن تعرف أين يعيش شيئا حتى تتمكن من الذهاب إلى هناك وتغييره. العمل معها وفعلا يكون الشيء الذي كنت تريد أن تفعل في هذا الشأن تأخذ متغير، وعدم اتخاذ تأثير على بعض نسخة منه. وهذا ما يسمى dereferencing. نذهب إلى المرجعية و نغير قيمة هناك. حتى إذا كان لدينا مؤشر ويطلق عليها جهاز كمبيوتر، ويشير إلى حرف، ثم يمكننا القول * الكمبيوتر و* الكمبيوتر هو اسم ما سنجد إذا ذهبنا إلى الكمبيوتر العنوان. ما سوف نجد هناك هو شخصية و * جهاز كمبيوتر هو كيف يمكننا الرجوع إلى البيانات في ذلك الموقع. ولذا فإننا يمكن أن تقول شيئا مثل * الكمبيوتر = D أو شيء من هذا القبيل، وهذا يعني أن كل ما كان في جهاز كمبيوتر عنوان الذاكرة، وأيا كان الطابع سابقا هناك، هو الآن D، إذا قلنا * جهاز كمبيوتر = D. حتى هنا نذهب مرة أخرى مع بعض الاشياء C غريب، أليس كذلك. لذلك رأيناه * سابقا بأنها بطريقة أو بأخرى جزءا من نوع البيانات، والآن يجري استخدامه في سياق مختلف قليلا للوصول إلى البيانات في الموقع. وأنا أعلم أنه مربكة قليلا و هذا هو في الواقع جزء من هذا كله مثل، لماذا مؤشرات لها هذه الأساطير من حولهم بأنها معقدة جدا، هو نوع من مشكلة لغوي، وبصراحة. ولكن * يستخدم في كلا السياقين، سواء كجزء من اسم نوع، وسنرى قليلا في وقت لاحق شيء آخر أيضا. والآن هو مشغل dereference. لذلك يذهب إلى الإشارة، فإنه يصل إلى البيانات في موقع المؤشر، و تتيح لك التلاعب في الإرادة. الآن هذه هي مشابهة جدا ل زيارة جارك، والحق. إذا كنت تعرف ما بك يعيش الجيران، كنت لا شنقا مع جارك. كنت أعلم أنك يحدث ل تعرف المكان الذي يعيشون فيه، ولكن هذا لا يعني أنه بحلول بحكم وجود تلك المعرفة كنت التفاعل معهم. إذا كنت تريد أن تتفاعل معها، عليك أن تذهب إلى منزلهم، عليك أن تذهب إلى المكان الذي يعيشون فيه. ومرة كنت تفعل ذلك، ثم يمكنك التفاعل معهم مثلما كنت ترغب في ذلك. وبالمثل مع المتغيرات، كنت بحاجة للذهاب إلى عنوانهم إذا كنت تريد أن تتفاعل لهم، لا يمكنك معرفة فقط العنوان. والطريقة التي تذهب إلى العنوان هو الاستخدام *، المشغل dereference. ما رأيك يحدث إذا حاولنا وdereference مؤشر قيمتها باطل؟ أذكر أن لاغية مؤشر يشير إلى أي شيء. حتى إذا حاولت وdereference لا شيء أو الذهاب إلى أي شيء عنوان، ما رأيك يحدث؟ تجزئة بشكل جيد إذا كنت تفكر خطأ، كنت على حق. إذا حاولت وdereference مؤشر فارغة، كنت تعاني من تجزئة خطأ. لكن انتظر، لم أكن أستطيع أن أقول لكم، أن إذا كنت لن لتعيين القيمة الخاصة بك الخاصة بك المؤشر إلى شيء مفيد، يجب تعيين فارغة؟ فعلت وفعلا تجزئة خطأ هو نوع من السلوك الجيد. هل من أي وقت مضى أعلن متغير و لم يتم تعيين القيمة على الفور؟ لذلك كنت أقول الباحث س؛ لم تكن في الواقع إسناد ذلك إلى أي شيء ثم في وقت لاحق في التعليمات البرمجية الخاصة بك، يمكنك طباعة قيمة x، وجود لا يزال غير تعيين إلى أي شيء. في كثير من الأحيان ستحصل الصفر، ولكن في بعض الأحيان كنت قد تحصل على بعض الأرقام العشوائية، و لديك أي فكرة من أين جاء. وبالمثل يمكن الأشياء يحدث مع مؤشرات. عندما تقوم بتعريف مؤشر الباحث * PK على سبيل المثال، وكنت لا يسند إلى قيمة، يمكنك الحصول على أربعة بايت للذاكرة. أيا كان أربعة بايت ذاكرة النظام يمكن تجد أن لديهم بعض القيمة ذات مغزى. وربما كانت هناك شيء هناك بالفعل لم يعد هناك حاجة من جانب آخر وظيفة، لذلك عليك فقط مهما البيانات هناك. ماذا لو حاولت أن تفعل dereference بعض العناوين التي don't- هناك بايت والمعلومات في بالفعل هناك، وهذا هو الآن في المؤشر. إذا حاولت وdereference هذا المؤشر، هل يمكن أن العبث مع بعض الذاكرة أنك لم تقصد لفوضى مع كل شيء. في واقع الأمر يمكن أن تفعله شيء مدمر حقا، مثل كسر برنامج آخر، أو كسر وظيفة أخرى، أو تفعل شيئا الخبيثة التي كنت لا تنوي القيام به على الإطلاق. وولهذا السبب فإنه من فعلا فكرة جيدة لوضع مؤشرات لاغيه إذا كنت لا مجموعة منهم لشيء مفيد. هو على الأرجح أفضل في نهاية اليوم لبرنامجك إلى تعطل ثم لأن تفعل شيء مسامير برنامج آخر أو وظيفة أخرى. أن السلوك هو على الارجح حتى أقل مثالية من مجرد تحطمها. وولهذا السبب فإنه من في الواقع عادة جيدة للوصول الى تحديد مؤشرات بك فارغة إذا لم يكن لمجموعة منهم إلى قيمة ذات معنى على الفور، قيمة أن تعرف والتي يمكنك بأمان dereference. لذلك دعونا نعود الآن ونلقي نظرة في بناء الجملة الشامل للوضع. إذا قلت كثافة * ص ؛، ماذا فعلت للتو؟ ما قمت به هو هذا. وأنا أعلم أن قيمة ص هو عنوان لأن كل المؤشرات هي فقط عناوين. يمكنني dereference ص باستخدام * المشغل. في هذا السياق هنا، في غاية أذكر يتصدر * هو جزء من النوع. الباحث * هو نوع البيانات. ولكن يمكنني dereference ص باستخدام * المشغل، وإذا كنت تفعل ذلك، إذا ذهبت إلى هذا العنوان، ما سوف تجد في هذا العنوان؟ وسوف تجد عددا صحيحا. لذلك الباحث * ص هو في الأساس قائلا: p غير عنوان. يمكنني dereference p و إذا أفعل، وسوف تجد عددا صحيحا في ذلك الموقع الذاكرة. موافق فقلت كان هناك آخر شيء مزعج مع النجوم وهنا حيث أن شيء مزعج مع النجوم هو. هل حاولت من أي وقت مضى لاعلان متغيرات متعددة من نفس النوع على نفس سطر من التعليمات البرمجية؟ حتى لثانية واحدة، التظاهر بأن الخط، رمز أنا فعلا هناك في الأخضر ليس هناك ويقول عادل كثافة العمليات خ، ذ، ض ؛. ما الذي سيفعله هو في الواقع خلق ثلاثة متغيرات صحيحا بالنسبة لك، واحد يسمى X، واحدة تسمى ص، واحدة تسمى ض. انها وسيلة للقيام بذلك دون الحاجة إلى تقسيم على ثلاثة خطوط. هنا حيث النجوم الحصول على مزعج مرة أخرى على الرغم من لأن * هو في الواقع جزء كل من اسم نوع وجزء من اسم المتغير. وهكذا إذا قلت كثافة * بكسل، الحمر، PZ، ما في الواقع الحصول على مؤشر إلى عدد صحيح دعا بكسل واثنين من الأعداد الصحيحة، السنة التحضيرية وPZ. وهذا ربما ليس ما نريد، هذا ليس جيدا. حتى لو كنت تريد إنشاء مؤشرات متعددة وعلى نفس الخط، من نفس النوع، والنجوم، ما أنا بحاجة فعلا القيام به هو القول الباحث * سنويا * للبرميل، * الكمبيوتر. الآن بعد أن قلت للتو أن ونقول الآن لكم هذا، وربما كنت سوف نفعل ذلك أبدا. وانها ربما شيء جيد بصراحة، لأنك ربما عن غير قصد حذف نجم، شيء من هذا القبيل. هو على الأرجح أفضل لاعلان ربما مؤشرات على خطوط الفردية، ولكن هذا مجرد واحد آخر تلك جملة مزعج الأشياء مع النجوم التي تجعل مؤشرات صعبة للغاية للعمل مع. لأنه مجرد هذا نحوي فوضى لديك للعمل من خلال. بالممارسة يصبح تصبح حقا طبيعة ثانية. ما زلت يخطئ مع أنه لا يزال بعد البرمجة لمدة 10 عاما، لذلك لا تنزعجي إذا حدث شيء ما لكم، فإنه من الشائع جدا بصراحة. انها حقا نوع من عيب من بناء الجملة. OK لذلك النوع من وعد أننا سوف إعادة النظر مفهوم كيفية كبيرة هي السلسلة. حسنا لو قلت لكم ان سلسلة، لدينا حقا نوع من تم يكذب عليك طوال الوقت. ليس هناك نوع بيانات تسمى سلسلة، وفي الحقيقة أنا ذكرت هذا في واحدة من لدينا أقرب أشرطة الفيديو على أنواع البيانات، وكانت هذه السلسلة نوع البيانات التي وقد خلق لكم في CS50.h. عليك أن # تضمين CS50.h من أجل استخدامها. كذلك سلسلة هو في الحقيقة مجرد اسم مستعار لشيء دعا شار *، ل مؤشر إلى حرف. كذلك مؤشرات، أذكر، هي عناوين فقط. فما هو حجم في بايت من سلسلة؟ حسنا انها أربعة أو ثمانية. والسبب أقول أربع أو ثمانية لأنه في الواقع يعتمد على النظام، وإذا كنت تستخدم CS50 بيئة تطوير متكاملة، شار * هو حجم شار * ثمانية، انها نظام 64 بت. كل عنوان في الذاكرة هو 64 بت طويلة. إذا كنت تستخدم جهاز CS50 أو باستخدام أي جهاز 32 بت، وكنت قد سمعت هذا المصطلح 32 بت آلة، ما هو جهاز 32 بت؟ حسنا هذا يعني فقط أن كل عنوان في الذاكرة 32 بت طويلة. وحتى 32 بت هي أربعة بايت. لذلك شار * أربعة أو ثمانية بايت اعتمادا على النظام الخاص بك. والواقع أي نوع من أنواع البيانات، ومؤشر إلى أية بيانات اكتب، حيث أن جميع المؤشرات ليست سوى عناوين، أربعة أو ثمانية بايت. لذلك دعونا إعادة النظر في هذا رسم بياني ودعونا نخلص هذا الفيديو مع القليل من الممارسة هنا. حتى هنا في الرسم البياني توقفنا مع في بداية الفيديو. فما يحدث الآن إذا قلت * PK = 35؟ فماذا يعني عندما أقول، * PK = 35؟ تأخذ ثانية. * PK. في السياق هنا، * غير مشغل dereference. وذلك عندما dereference يستخدم المشغل، نذهب إلى عنوان أشار إلى قبل PK، ونغير ما نجده. لذلك * PK = 35 فعالية هل هذا إلى الصورة. حتى انها في الاساس نحويا مطابقة لمن بعد أن قلت ك = 35. مرة اخرى. إذا قلت كثافة م، وإنشاء متغير جديد يسمى م. مربع جديد، انها المربع الأخضر ل انها تسير لعقد صحيح، وأنها وصفت م. إذا قلت م = 4، ووضع صحيح في هذا المربع. إذا القول PK = & M، كيف هذا التغيير المخطط؟ PK = & M، هل تذكرون ما والمشغل يفعل أو ما يسمى؟ تذكر أن بعض واسم متغير هو عنوان اسم متغير. فما نقوله هو PK يحصل على عنوان م. وذلك على نحو فعال ما سيحدث في الرسم البياني هو أن PK نقطة لم يعد إلى k، ولكن نقطة لم. مرة أخرى مؤشرات هي جدا صعبة للعمل مع وأنها تأخذ الكثير من الممارسة، ولكن ل من قدرتها للسماح لك لتمرير البيانات بين وظائف وفعلا تلك التغييرات نافذة المفعول، الحصول على رأسك حول من المهم حقا. وربما هو الأكثر تعقيدا موضوع نناقش في CS50، ولكن القيمة التي الحصول من استخدام مؤشرات تفوق بكثير مضاعفات التي تأتي من تعلم منهم. ولذا فإنني أتمنى لكم الأفضل ل الحظ التعلم عن المؤشرات. أنا دوغ ويد، وهذا هو CS50.