أهلا ومرحبا بكم مرة أخرى. آخر شيء أريد أن أتحدث عنه فيما
يتعلق بالبنى هو كيفية ارتباطها بالوظائف ، وكيف
يمكنك تمرير الهياكل كوسيطة إلى معلمة ووظيفة وكيف يكون ذلك أكثر
كفاءة أيضًا.
لذا الهياكل كحجج للوظائف.
بعد إعلان هيكل
اسمه الأسرة. في هذا المثال ، سننشئ عائلة مسماة
، كيف يمكننا تمرير هذا الهيكل كوسيطة إلى دالة.
لذلك لدينا هذا الهيكل المسمى العائلة.
لدينا مجموعة من مصفوفات الشخصيات
هنا الاسم ، الأب والأم ، ثم لدينا عمر int.
هذا هو تعريف هيكلنا.
نحن نعلم أنها بنية لأن الكلمة الأساسية الهيكلية موجودة متبوعة باسم العلامة
لدينا أقواسنا المتعرجة وما إلى ذلك.
الآن كيف يمكننا بالفعل تمرير هذا الهيكل
إلى وظيفة تسمى الأشقاء؟
حسنًا ، ستفعل ذلك تمامًا مثلما تعلن عن الهيكل
، يمكنك أن تقول النوع كاسم المعلمة.
إنه حقًا واضح ومباشر. في هذه الحالة ، لدينا أشقاء منطقيون.
الأشقاء يعودون منطقية.
وهو يأخذ معلمتين ، معلمتين هيكليتين.
يجب عليك تحديد نوع الهيكل الذي هو نوع عائلة الهيكل.
الآن في c الأكثر تقدمًا ، يمكنك فعلاً
عمل typedf على هذا الهيكل وتسميته بشيء آخر ويمكنك تقصير الاسم
هنا ، لكننا لم نتحدث عن الكتابة.
من المحتمل أن يكون ذلك أفضل.
ولكن هذا هو حقًا ما ستحتاجه للقيام بذلك. سيتعين عليك تحديد النوع بالكامل
، وهو عائلة البنية ثم اسم المتغير ، تمامًا مثل أي معلمة أخرى.
إذن نحن هنا نمرر معاملين ، العضو الأول والعضو الثاني.
كلاهما من عائلة من النوع المهيكل.
ثم داخل وظيفتنا ، إذا أردنا الوصول إلى الأعضاء ، فإننا نصل إلى الأعضاء
تمامًا مثل المعتاد.
العضو الأول والعضو الثاني ، ليسوا مؤشرات ، لذلك لا نستخدم الشرطة ثم أكبر من ذلك ، فنحن نفعل
ذلك فقط على المؤشرات لأننا نحتاج إلى إلغاء الإشارة إليها لمعرفة ما يشيرون إليه.
لأنها ليست مؤشرات ، يمكننا فقط عمل نقطة. عضو واحد أم نقطة ، عضو أم نقطتين.
تعد الأم المكونة من نقطة واحدة والأم المكونة
من نقطتين مصفوفات الأحرف ، ومصفوفات الأحرف هي مؤشرات بشكل أساسي.
حتى نتمكن من تمريرها إلى مقارنة str. ستؤدي مقارنة Str إلى إرجاع تساوي إذا كانتا متطابقتين
، لذا ما نقوم به هنا هو أننا نتحقق من أن العضو الواحد
أم والعضوان متماثلان. وإذا كان الأمر كذلك ، فسوف نعود إلى الحقيقة.
لأنه إذا كان كلاهما يحمل نفس الاسم وسيكون هذا
هو الاسم الأخير حقًا ، فسيكونان أشقاء.
واضحة ومباشرة جدا.
من السهل تمرير الوسائط إلى الوظائف
طالما أن إعلان الوظيفة يحتوي على هذا النوع من البنية هناك.
إذن هذه الوظيفة ، مرة أخرى ، معلمتان ، كل منهما عبارة عن هيكل من
عائلة النوع.
ماذا لو أردنا أن يكون لدينا مؤشرات للبنى كوسائط دالة.
وقد ذكرت سابقًا ، من الأفضل القيام بذلك لأننا نقوم
بالتمرير بالقيمة و c.
عندما تمر بالقيمة ، فإنك تنسخ.
إذا كان لديك هيكل يحتوي على الكثير من البيانات
، والكثير من الهياكل الكبيرة كوسيطات
، فيجب عليك نسخ كل شيء في هذا الهيكل إلى
الوظيفة الفعلية.
لذلك قد يستغرق ذلك بعض الوقت
لنسخ تلك الهياكل الكبيرة.
حسنًا ، إذا كان لديك مؤشر ، فكل ما عليك فعله هو نسخ
العنوان وهو أسرع بكثير. لذلك يتم استخدام مؤشرات
الهياكل كمعلمات ووظائف لتجنب استهلاك الذاكرة
والوقت الذي يستغرقه نسخ جميع الهياكل.
الآن إذا كان لديك هيكل صغير ، ليس بالأمر المهم
، لكنك تريد بالتأكيد استخدام المؤشرات والهياكل الكبيرة.
إذن في هذه الحالة ، ماذا تفعل ، ما زلت تحدد اسم أنواع البنية ، ما عليك
سوى وضع علامة النجمة مسبقًا
، بسيطة جدًا. وإذا كنت لا تريد تغيير
أي من البيانات الموجودة داخل الهيكل ، فيمكنك استخدام ثابت قبل نوع البنية.
إذا كنت لا تريد تغيير العنوان ، فستضع الثابت بعد مؤشر عائلة البنية.
لكن هنا ، نفعل نفس الشيء. لكننا الآن بصدد الوصول إليه بشكل
مختلف لأنه الآن بعد أن أصبح مؤشرًا ، يمكننا استخدام الشرطة أكبر
من ذلك الرمز الجديد للوصول إليه بدلاً من استخدام النقطة.
لا يتعين علينا استخدام النقطة هنا. لأنك تذكر أن المؤشرات
يجب عليك إزالة الإشارة إليها أولاً ، لذا عليك وضعها بين قوسين ، فمن الأفضل
إلغاء الإشارة إلى المؤشر ، ثم يتعين عليك وضع النقطة خارج الأقواس لأنها تتمتع
بأولوية أعلى ، أسهل في استخدام الشرطة من أكبر من.
اندفاعة وأكبر من الأم ، واندفاعة
وأكبر من الأم ، وكلاهما مؤشرين ، ويمكن تمريرها في مقارنة str.
إذا كانتا متطابقتين ، فارجع إلى الحقيقة. وإلا ، فقم بإرجاع القيمة false والمباشرة إلى حد ما.
يمكنك أيضًا استخدام مُعدِّل ثابت كما ذكرت
إذا كنت لا تريد السماح بأي تعديل لأعضاء البنية.
ما تشير إليه البنية ثم تضع الثابت قبل المؤشر.
يمكنك وضع الثابت في الواقع أمام العائلة أيضًا.
في هذه الحالة ، الأسرة لديها محرف.
لذلك هنا سيكون
حقًا مؤشر تكوين عائلة أو بنية عائلة.
ثم قم بالوصول مرة أخرى بنفس الطريقة ، فأنت لا تقوم بتعديل أي شيء. لذلك أنت على ما يرام.
المترجم لن يشكو.
يمكنك أيضًا استخدام المُعدِّل الثابت إذا كنت لا تريد السماح
بأي تعديل على العنوان نفسه.
ستؤدي أي محاولة لتغيير هذه الهياكل إلى ظهور رسالة خطأ أثناء التجميع.
لذلك هنا يمكنك أن تقول
نجم العائلة وتضع الثابت بعد النجم.
وما يقوله هذا هو أنه لا يمكنك تغيير
قيمة p-member ، قيمة المؤشر ، وهو العنوان.
لكن مرة أخرى ، هذا ليس مفيدًا جدًا لأنه عندما
تمرر بالقيمة ، فأنت تقوم بالفعل بتمرير نسخة من العنوان.
لذلك هذا زائد عن الحاجة ، لست بحاجة إلى القيام بذلك ، لكن يمكنك ذلك.
وهنا ، مرة أخرى ، تريد أن تكون قادرًا على تغيير عنوان ما هو عضو p.
وفي هذه الحالة ، تقوم فقط بالوصول إلى البيانات على أي حال لمعرفة ما إذا كانت متساوية.
عامل المراوغة في تعريف كل معلمة الآن أمام الكلمة
الأساسية الثابتة.
هذه العلامة النجمية ، ليست أمام اسم المعلمة.
لا يمكنك تعديل العنوان المخزن في المؤشرات لأنه يقع بعد علامة النجمة.
إذا كان أمام نوع اسم المعلمة ، فأنت تريد أن
تكون قادرًا على تعديل ما يشير إليه بالفعل.
إذا كان لدينا عامل المراوغة هذا أمام اسم المعلمة ، فماذا سيكون في
الثابت قبله ، فهذا يعني أنك تريد أن
تكون قادرًا على تعديل ما يشير إليه. هذا فقط يقول العنوان.
لذلك لا يمكنك تعديل العنوان المخزن في المؤشرات.
إنها المؤشرات المحمية هنا وليس الهياكل التي تشير
إليها ، تمامًا مثل معلمات المؤشر الثابتة وغيرها ، لا فرق مع البنيات.
إذا كنت تريد إرجاع بنية من دالة تمثل مؤشرًا ، فيجب أن
يشير النموذج الأولي للدالة إلى قيمة الإرجاع هذه بالطريقة
العادية في الإعلان.
لذلك هنا يجب أن تقول ضرب حتى الآن
مؤشر المرح الخاص بي
أم لا ، لا يهم. هذا نموذج أولي لوظيفة لا يأخذ أي وسيطات تُرجع بنية
تاريخ النوع ، ومن السهل جدًا إرجاع بنية من وظيفة. وما هي قيمة هذا.
حسنًا ، يمكننا الآن إرجاع أكثر
من عنصر واحد أو عنصر بيانات واحد من دالة.
إذا كنت تعيد بنية ، يمكنك إرجاع 10 قيم ، 10 عناصر بيانات مختلفة.
كم ذلك رائع. يسمح لك الهيكل بإرجاع أكثر من دالة من دالة.
قيمة جدا جدا.
لذلك غالبًا ما يكون من الأنسب إرجاع مؤشر إلى بنية بدلاً من مجرد بنية.
عندما تعيد مؤشرًا إلى البنية ، يتم إنشاؤه على الكومة لأن جميع المؤشرات
يتم إنشاؤها على الكومة.
هذا يعني أنها ستكون موجودة لفترة أطول قليلاً.
وهذا يعني أنه يمكنك حذفه وإدارته في أوقات عشوائية.
لذلك في هذا المثال ، نقوم بإنشاء صناديق باسم هيكل.
يحتوي على مصفوفة أحرف تسمى
bank ، وتحتوي على حرف مزدوج آخر يسمى محفوظًا
بطول معين. افترض للتو أن طول المرح يساوي 50.
وبعد ذلك لديها ضعف حفظ واحد.
لدينا وظيفة تسمى sum والتي تأخذ هذا الهيكل كمعامل.
وكل ما نقوم به هو أننا نعيد أ - صندوق البنك
من الهيكل الأول بالإضافة إلى صندوق التوفير ، وهذا
سيعيد المبلغ الذي لديهم في بنكهم.
في هذا المثال ، المجموع هو ضعف فقط.
نحن لا نعيد المؤشر. نحن فقط نأخذ المؤشر كمعامل.
وهكذا في وظيفتنا الرئيسية ، نقوم بإنشاء متغير هيكل
يسمى ستان من نوع هيكلة الصناديق.
نحن نهيئها ببعض القيم ، ثم نطبع إجمالي مجموع
الاستدعاء. ونمرر هذه البنية مثلما نجتاز أي متغير.
لا يتعين علينا إزالة المرجع ، فهو ليس مؤشرًا. ليس علينا فعل أي شيء مميز.
نتأكد فقط من وجود هذا النوع من البنية في إعلان الوظيفة ، لكن كل
شيء آخر يبدو طبيعيًا.
زوجان من التذكيرات.
لقد ذكرت سابقًا أنه يجب عليك دائمًا استخدام المؤشرات عند تمرير الهياكل إلى وظيفة.
لماذا ا؟ لأن تذكر أن الإصدارات القديمة
من c لا تسمح بتمرير
الهياكل ، لكنها تسمح بالمؤشرات.
لذلك يمكنك تجنب أي نوع من التوافق مع الإصدارات السابقة.
إذا كنت تستخدم إصدارًا أقدم من c ، فسيعمل برنامجك.
لذا فإن مجرد تمرير هذا العنوان الفردي
هو أيضًا أكثر كفاءة بسبب نسخ الوقت.
ولكن إذا قمت بذلك ، إذا قمت بتمرير معلمة تمثل مؤشرًا إلى
بنية داخل دالة ، فستكون لديها حماية أقل لبياناتك.
لذلك يمكن أن تؤثر بعض العمليات في الوظيفة المستدعاة عن غير قصد على البيانات
الموجودة في الهيكل الأصلي.
وهذا هو المكان الذي تريد استخدام مؤهل const.
ويمكنك استخدام const قبل النوع الفعلي
، وليس بعد العلامة النجمية وقبل اسم المعلمة
، قبل النوع.
ميزة تمرير الهياكل هي الوسيطات ، وتعمل الوظيفة
مع نسخ من البيانات الأصلية.
إنه أكثر أمانًا من العمل مع البيانات الأصلية.
إذن فهذه هي المرة الوحيدة التي تريد فيها تمرير بنية على أنها حجة ليست مؤشرًا.
ويميل أسلوب البرمجة إلى أن يكون أوضح قليلاً.
العيوب الرئيسية لتمرير الهياكل كحجج بدلاً من تمرير مؤشر منظم
كحجة هي أن التطبيقات القديمة قد لا
تتعامل مع الكود ، فهي تهدر الوقت والمكان
، وهي مضيعة بشكل خاص عندما يكون
لديك هياكل كبيرة يتعين علينا القيام بالكثير من النسخ
لكل منها عضو. لذا ضع هذا في الاعتبار.
بالنسبة للجزء الأكبر ، تريد تمرير المؤشرات
إلى الهياكل ، فهي أكثر كفاءة وتوفر الوقت.
يستخدم المبرمجون مؤشرات البنية كوسيطات وظيفية لأسباب تتعلق بالكفاءة
ويستخدمون الثابت عند الضرورة. وهذا هو المزيج الذي تريد القيام به.
إذا كنت قلقًا بشأن الحماية ، فما عليك سوى استخدام مؤشر
الوظيفة لتحقيق الكفاءة ثم استخدام
ثابت ثابت حتى لا يفسد أي شيء داخل الوظيفة ، تمامًا
مثل المؤشرات العادية حقًا أكثر أو أقل ، ولكن
مع المؤشرات ، يكون الأمر أكثر أهمية مع الكفاءة لأنه من الهياكل
الكبيرة.
غالبًا ما يتم تمرير الهياكل حسب القيمة للبنى الصغيرة ، وهذه هي نوع
من القواعد التي تريد التفكير فيها.
حسنًا ، لتمرير هيكل ليس مؤشرًا طالما أنه صغير.
مرة أخرى ، تتعلق بعض المفاهيم المهمة
بالبنى ومؤشرات التمرير كمعلمات وحجج
ومؤشرات إرجاع أيضًا. الآن ، يمكننا بالفعل البدء في تنفيذ
بعض من هذا. نحن نقدم العديد من الأمثلة. نحن نفهم المفاهيم. نحن نفهم بناء الجملة.
الآن أريد أن أقدم لكم بعض التحديات التي تجعلك تفعل ذلك بالفعل ، هل حفظت
في بناء الجملة أنه الآن إذا كنت تريد إنشاء هيكل في البرنامج ، فأنت تعرف
كيف تفعل ذلك مثل يدك الخلفية.
لذلك سنواجه تحديين في المحاضرتين القادمتين لنجعلك
على دراية بكل هذه الأشياء التي تحدثنا عنها بشأن الهياكل.
شكرًا لك.