[Powered by Google Translate] دعونا نتحدث عن البنيات.
البنيات توفر لنا وسيلة لتجميع مجموعة من المتغيرات معا
في حزمة جميلة.
هو على الأرجح أسهل لمشاهدة مثال على الفور،
ولذلك نقول البنية،
ثم فتح متعرج،
وفي هذا البنية، سيكون لدينا عصر الباحث،
* اسم شار،
وهذا كل شيء.
قد يبدو غريب بفاصلة منقوطة بعد متعرج،
ولكن من الضروري في الواقع مع البنيات.
يمكن لأي نوع صالح الذهاب ضمن تعريف البنية.
هنا، لقد استخدمنا الباحث و* شار،
ولكن هل يمكن أيضا استخدام صفيف، من يقول، 100 عناصر
أو حتى البنية آخر.
عندما كنت تستخدم البنيات في C،
كنت تقوم بإنشاء أنواع جديدة
من مجموعة من أنواع أخرى.
هنا، ونحن نحقق نوع جديد
من عدد صحيح و* شار.
كما سنرى لاحقا، والبنية نوع
في الكثير من الطرق ما يعادل أي نوع آخر كنت تستخدم ل.
عادة، سوف يتم مقارنة كيف يمكن لنوع البنية
يشبه إلى نوع عدد صحيح.
في حين أن كتبنا رمز C هو صالح،
انها ليست مفيدة جدا،
وسوف تعطينا رنة تحذير.
ونتذكر كيف البنيات لها متشابهة؟
حسنا، نحن في الأساس وقال فقط
الباحث،
وهي ليست خط مفيدة جدا.
لذلك دعونا نعلن الواقع متغير من هذا النوع
بإعطائه اسما قبل الفاصلة المنقوطة.
سوف ندعو الطالب متغير.
الآن لدينا أعلن طالب متغير يسمى
مع نوع معين من البنية.
كيف نصل إلى المتغيرات داخل البنية؟
من الناحية الفنية، وأسماء لهذه المتغيرات
هي أعضاء فيها.
للوصول إلى أي عضو معين في البنية طالب،
يمكنك إلحاق نقطة إلى اسم متغير،
يليه اسم العضو الذي تريد.
حتى هنا، وفقط 2 الاحتمالات صالحة
هي student.age
وstudent.name.
ويمكننا أن نفعل شيء من هذا القبيل
student.age = 12
وstudent.name = طالب.
الآن ماذا لو أردنا أن تجعل الطالب الثاني؟
قد تعتقد لنسخ ولصق هذه الخطوط
وطالب لطالب تغيير 2 أو شيء ما،
وسوف تعمل،
لكن من الناحية الفنية، وطالب 2 الطالب
لم يكن لديك نفس النوع.
ترى، فلن تكون قادرة على التنازل عنها لبعضهم البعض.
هذا هو لأنه، حتى الآن،
وكانت البنية دون الافصاح عن هويتك.
نحن بحاجة إلى إعطائها اسما.
للقيام بذلك، ونحن إدراج اسم البنية
بعد كلمة البنية.
طالب،
تليها التعريف.
يمكننا تزال تعلن على الفور متغير من نوع
البنية الطلاب، كما فعلنا من قبل.
سوف نطلق عليه S1
من خلال إعطاء البنية اسما،
يمكننا الآن استخدام الطالب البنية
في الطريق تقريبا بالضبط نفس الباحث أن نستخدمها.
حتى نتمكن من تعريف متغير من نوع البنية طالب،
مثل
البنية طالب S2.
مثل صفائف، البنيات توفير بناء جملة التهيئة المختصرة،
لذلك يمكننا أن نقول، طالب البنية S2
يساوي
اليسار متعرج 3، S2.
هنا، سوف تكون S2.age 3،
وسوف نشير إلى S2.name S2.
التفكير في جميع الأشياء التي يمكنك القيام به مع نوع الباحث
ومعظم هؤلاء يمكن ان تفعل مع البنية نوع الطالب.
يمكننا استخدام الطالب البنية كنوع من وظيفة معلمة.
يمكننا استخدام الطالب البنية من داخل البنية الجديدة.
فإننا يمكن أن يكون مؤشر إلى البنية طالب.
يمكننا أن نفعل حجم البنية طالب.
البنية الطالب هو نوع
تماما مثل الباحث هو نوع.
يمكننا أيضا تعيين S1 إلى S2
منذ كلاهما من نفس النوع، لذلك يمكننا أن نفعل
S1 S2 =.
ماذا يحدث إذا لم نفعل
S1.age = 10؟
لا تغيير S2 على الإطلاق؟
مرة أخرى، والتفكير في البنيات فقط أنها أعداد صحيحة العادية.
إذا كان لنا أن تعيين بعض الباحث إلى بعض X Y الباحث،
مثل Y = X
ثم قم بتغيير X،
كما هو الحال في X + +،
لا Y تغيير على الإطلاق؟
Y لا يتغير هنا، وحتى لا لا S2 أعلاه.
S2.age لا يزال 3.
لكن لاحظ أنه عندما تكليف إحدى البنية إلى آخر،
كل المؤشرات تشير إلى تزال نفس الشيء،
منذ تم نسخها تماما كما.
إذا كنت لا تريد أن تكون مشتركة المؤشرات،
ستحتاج للتعامل مع يدويا التي،
ربما malicking كتلة واحدة من الذاكرة لأحد المؤشرات للإشارة إلى
ونسخ البيانات عبر.
قد يكون مزعج لديك لكتابة الطالب البنية في كل مكان.
باستخدام مواطنه نوع، يمكننا أن نفعل
نوع صفر
البنية
وسوف نطلق عليه الطالب.
الآن، يمكننا استخدام الطالب في كل مكان
أن كنا لاستخدام الطالب البنية.
هذا نوع من مواطنه والبنية مجهول
ويسميها الطلاب.
ولكن إذا واصلنا أيضا معرف الطالب
إلى جانب البنية كلمة واحدة، كما هو الحال في البنية typedef الطالب،
يمكننا استخدام كل من الطالب والطالب الآن البنية بالتبادل.
لم يكن لديهم حتى يكون لها نفس الاسم.
يمكن أن اكتب مواطنه الطالب إلى البنية بوب
وطالب والبنية ثم بوب
سيكون أنواع قابلة للتبديل.
بغض النظر عن نوع صفر،
نحن بحاجة إلى معرف بجانب البنية
إذا كان تعريف البنية
هو العودية.
على سبيل المثال،
نوع مواطنه البنية عقدة
وسيتم تعريفه على أنه فال الباحث
وسيكون له المؤشر الذي يشير إلى عقدة أخرى بنية،
كما هو الحال في البنية عقدة * المقبل.
وبعد ذلك سوف نطلق عليه عقدة.
هذه البنية هي متكررة،
منذ تعريف العقدة البنية يحتوي في داخله
مؤشر إلى البنية عقدة.
لاحظت أن لابد من القول البنية عقدة * المقبل
داخل لتعريف العقدة البنية،
منذ مواطنه نوع لم تنته بعد للسماح لنا لتبسيط هذه
* لمجرد عقدة المقبل.
سوف تتعلم المزيد عن البنيات مشابهة لهذه
عند التعامل مع القوائم المرتبطة والأشجار.
ماذا عن وظيفة في البنيات؟
وينطبق هذا أيضا على أكمل وجه.
يمكن لدينا
إفراغ ظائفه
والتي تأخذ كوسيطة،
طالب ق
ويفعل شيئا مع هذا الطالب.
وبعد ذلك يمكننا تمريرها كما طالب البنية مثل ذلك.
من ظائفه S1 من قبل.
البنية يتصرف
وتماما كما عند تمرير عدد صحيح إلى وظيفة.
ظيفيا يتلقى نسخة من S1
وحتى لا يمكن تعديل S1؛
بدلا من ذلك، فقط نسخة منه أن يتم تخزينها في S.
إذا كنت تريد وظيفة لتكون قادرة على تعديل S1،
وظائفه تحتاج إلى اتخاذ الطالب * S،
وسيكون لديك لتمرير S1 حسب العنوان، مثل ذلك.
طالب * S، S1 و ظائفه.
هناك سبب آخر لتمرير حسب العنوان هنا.
ماذا لو لدينا البنية الواردة 100 الحقول؟
في كل مرة نعبر طالب لظائفه،
برنامجنا يحتاج لنسخ جميع تلك الحقول S 100 في حجة ظائفه في،
حتى لو لم يستخدم الغالبية العظمى منهم.
لذلك حتى لو ظائفه لا تخطط لتعديل الطلاب،
وإذا أمكن لا تزال قيمة لتمرير حسب العنوان.
حسنا، ماذا لو كنا نريد لإنشاء مؤشر إلى البنية؟
يمكن أن نفعل شيء من هذا القبيل
طالب * S
يساوي malloc
حجم الطالب.
تلاحظ أن حجم لا يزال يعمل هنا.
كيف لنا إذن أن الآن الوصول إلى سن الأعضاء
كتلة يشير إلى S؟
قد تعتقد أول من يفعل
* S.age = 4،
ولكن هذا لن يعمل تماما.
ومنذ هذا حقا أن تفسر على أنها
* S.age بين قوسين = 4،
والتي سوف يتم ترجمة ذلك،
منذ S ليس البنية أو بالأحرى مؤشر على البنية إلى،
وبالتالي فإن نقطة لا تعمل هنا.
يمكن أن نقوم به
(* S). العمر = 4
ولكن يمكن الحصول على مزعج الأقواس ومربكة.
لحسن الحظ، لدينا مشغل سهم خاص
ويبدو أن شيئا مثل
S-> العصر = 4.
هذه الطرق 2 من الرجوع العمر
تعادل
ونحن لا حقا أي وقت مضى الحاجة المشغل السهم،
ولكنه يجعل الامور تبدو أجمل.
منذ S هو مؤشر لبعض كتلة من الذاكرة التي تحتوي على البنية،
يمكنك التفكير في سن> S على النحو التالي السهم المؤشر
والاستيلاء على عضو العمر.
فلماذا نستخدم أي وقت مضى البنيات؟
انها بالتأكيد من الممكن الحصول على بعيدا مع الأعداد الصحيحة فقط البدائية،
حرف، ومؤشرات مثل
اعتدنا أن ل؛
بدلا من S1 و S2 من قبل،
يمكن أن كان لدينا age1، AGE2، NAME1، وNAME2
جميع المتغيرات في منفصلة.
هذا على ما يرام مع الطلاب فقط 2،
ولكن ماذا لو كان لدينا 10 منهم؟
وماذا لو بدلا من الحقول فقط 2،
كان البنية الطالب 100 الحقول؟
GPA، ودورات، ولون الشعر، ونوع الجنس، وهلم جرا.
بدلا من مجرد 10 البنيات، ونحن بحاجة إلى 1،000 المتغيرات منفصلة.
أيضا، والنظر في وظيفة
أن يأخذ البنية مع 100 الحقول مع حجتها فقط
وبطباعة كافة المجالات.
إذا لم نكن استخدام البنية،
في كل مرة ندعو تلك الوظيفة،
نحن بحاجة لتمرير جميع المتغيرات في 100،
وإذا كان لدينا 100 طالب للمتغيرات 1،
المتغيرات و 100 للطلاب 2،
نحن بحاجة للتأكد من أننا لا تمر بطريق الخطأ بعض المتغيرات من الطالب 1
وبعض المتغيرات من الطالب 2.
من المستحيل أن نقع في هذا الخطأ مع البنية،
منذ وترد جميع المتغيرات 100 في حزمة واحدة.
بضع ملاحظات نهائية:
إذا كنت قد فهمت كل شيء حتى هذه النقطة، عظيم.
بقية الفيديو هو فقط لأجل اكتمال '.
لأن البنيات يمكن أن تعقد أي نوع من المؤشر،
فإنها يمكن أن تعقد أيضا مؤشرات الدالة.
إذا كنت على دراية البرمجة الموجهة الكائن،
هذا يوفر وسيلة لاستخدام البنيات لبرنامج بأسلوب الموجهة الكائن.
أكثر على مؤشرات الدالة في وقت آخر.
أيضا، في بعض الأحيان قد لديك 2 البنيات
تعريفات التي تعتمد على بعضها البعض.
على سبيل المثال،
يمكن لدينا البنية A،
كما يتم تعريف التي
مؤشر إلى البنية B،
البنية B * X،
ويمكن الآن لدينا البنية B
ويعرف الذي كمؤشر
لA البنية ألف،
البنية A * Y.
ولكن هذا لا ترجمة،
منذ البنية B غير موجود في الوقت الذي يجري تجميع البنية A.
وإذا كان لنا أن البنية مبادلة ألف والبنية B،
ثم كنت مجرد أننا يمكن ترك مع نفس المشكلة؛
هذه المرة، مع البنية الموجودة A لا.
لحل هذه، يمكن أن نكتب
البنية B؛
قبل تعريف البنية A.
وهذا ما يسمى إعلان قدما.
هذا يتيح فقط مترجم نعرف أن
البنية B هو نوع صالح أنه سيتم في وقت لاحق تعريفا كاملا أو أي مكان آخر.
اسمي روب بودين، وهذا هو CS50.
[CS50.TV]