أهلا ومرحبا بكم مرة أخرى.
أود تقديم حل ل التحدي السابق في هذه المحاضرة.
مظاهرة لكيفية يمكن أن تحتوي على مؤشرات كعناصر داخل الهيكل
وأيضًا تمرير حول المؤشرات وظيفتين وهي الهياكل.
لذلك دعونا نطرح الكود كتل ، إنشاء مشروع جديد.
ستكون هذه وحدة تحكم التطبيق ، وسنقوم بتسمية
مثال مؤشرات البنية هذا.
ولذا إذا كنت تتذكر ملف متطلبات هذا
، كان هذا في الأساس مجرد نوع منتج الهيكل الذي يخزن اسم العنصر والكمية
والسعر والمبلغ.
وكان اسم العنصر ذاهبًا ليكون مؤشر شخصية.
كنت ستحصل على المبلغ الذي ضاعف الكمية
في السعر.
وبعد ذلك كان لدينا وظيفتان التي ستأخذ كمؤشرات
معلمات إلى بنية.
لذا فإن أول شيء نحن نحن بصدد
إنشاء هيكلنا.
وقد ذكرت هذا سابقًا ، لكن من الجيد إنشاء الهيكل
عالميًا لأنه إذا كنت تريد ذلك استخدامه في وظائف متعددة.
خلق الهيكل هو تعريفها حقًا.
أنت لا تخصص أي ذاكرة.
لذلك ليس هناك ضرر وضعها عالميا.
وعادة ما يذهبون إلى الداخل ملف الرأس على أي حال.
لذلك لإنشاء هيكل ، نقول فقط هيكل.
سنطلق على هذا العنصر ، و سيكون لدينا أربعة عناصر.
سيكون لدينا شخصية المؤشر ، الذي سنطلق عليه
اسم العنصر.
سيكون لدينا كمية.
سيكون لدينا عوامة بالنسبة للسعر ، وسيكون
لدينا تعويم للمبلغ.
وهذه هي الطريقة التي يمكننا تحديدها هيكلنا الأساسي جدًا.
الآن داخل وظيفتنا الرئيسية ، نحن تريد إنشاء متغير لنوع الهيكل
وأيضًا مؤشر.
لذا فإن أول شيء نريد القيام به هل نريد فقط أن نقول عنصرًا هيكليًا
مع اسم الهيكل و ثم سنسمي هذا العنصر فقط.
وهذا عادل إنشاء مؤشر فردي.
هذا سوف يخصص الذاكرة للمتغيرات والعناصر الأربعة
داخل الهيكل.
ولذا نريد إنشاء مؤشرنا الآن ، ويمكننا فقط أن نقول عنصرًا هيكليًا.
سنقول p البند لأننا عادة نسمي مؤشراتنا
بالبادئة p.
لذلك نقول علامة النجمة ، ونقول ف البند.
ثم في السطر التالي ، نريد
فقط تعيين عنصر المؤشر لدينا ، عنصرنا.
لذلك نحن بحاجة إلى استخدام عنوان ونقول البند.
وهنا لدينا ذاكرة مخصصة لعناصر في هيكلنا لمؤشرنا.
ليس لدينا أي ذاكرة المخصصة لمؤشر الشخصية لدينا وهو
اسم العنصر لدينا ، لذلك ستكون هذه هي الخطوة التالية.
الآن قد تسأل لماذا نحتاج لإنشاء بنية العنصر.
نحن لا نفعل ذلك حقًا.
يمكننا فقط إنشاء المؤشر و سوف يقوم المؤشر فقط بإنشاء ذاكرة لمؤشر
عنصر البنية هذا.
سيخصص ذاكرة لـ int و floats ، ولكن لا يزال
يتعين علينا القيام بتخصيص اسم العنصر.
أنا فقط أحب فعل هذا بسبب عادة ما تكون هذه هي الممارسة الجيدة.
عادة ما كنت ستفعل به العنصر الأول هو أنك ستقوم بتهيئته
، وهكذا أنت سيكون لديها بعض التهيئة.
لكننا لسنا بحاجة إلى القيام بذلك.
لذا فإن أول شيء نريد القيام به هو تخصيص ذاكرة لاسم العنصر لدينا.
لذا يمكننا استخدام أ عامل خاص للوصول إلى العناصر إذا
كان مؤشرًا.
تذكر ، للهياكل التي هي مؤشرات ، لديك الشرطة ثم أكبر من الرمز الذي
لديك يمكن استخدامها للوصول إلى العناصر.
خلاف ذلك ، سيكون عليك إلغاء المرجع المؤشر للوصول إلى العناصر.
يمكننا القيام بشيء مثل هذا داخل الأقواس.
يمكننا إلغاء إشارة المؤشر ، لذلك
يتعين علينا القيام بشيء مثل عنصر star p ثم استخدامه النقطة للوصول إلى العناصر.
هذا صحيح تماما لفعل شيء كهذا.
لكنه نوع من بناء الجملة الإضافي التي لا تحتاجها حقًا.
لذلك c له بناء جملة خاص يمكنك استخدامها كلما كان الهيكل الخاص بك
هو مؤشر إذا كنت تريد الوصول إلى العناصر.
يمكنك ببساطة قول الاسم من المؤشر وهو عنصر p ثم استخدم
الشرطة ثم أكبر من.
وفي هذه الحالة ، نريد ذلك تخصيص ذاكرة لاسم العنصر.
لذلك سنقوم بتعيينه ما هو عاد من وظيفة malloc.
تذكر ، وظيفة malloc إرجاع مؤشر الفراغ.
لذلك علينا أن نلقيها لنجم الشخصية.
لكن يمكننا فقط استدعاء malloc ، فقط قل malloc ثم حجم البايت
الذي نريد تكوينه.
في هذه الحالة ، سنقول فقط 30 ، وسنضربها في حجم الحرف ، فقط في حال
كان الحرف a حجم مختلف على أجهزة كمبيوتر مختلفة.
وهذا سوف يخصص ذاكرة لاسم العنصر لدينا.
نحن بحاجة إلى القيام بذلك لأن اسم العنصر هو مؤشر داخل الهيكل.
ليس لديها ذاكرة المخصصة لها
عند تعيينها لهيكل آخر.
لذلك علينا أن نفعل هذا.
الآن أول شيء تريده يجب القيام به بعد
تخصيص الذاكرة هو التحقق من malloc.
لذلك نريد التحقق من وجود قيمة فارغة هنا.
سنقول فقط إذا كان العنصر p ، إذا إنه فارغ قد يقول أنه لاغ.
وإلا ، ستقول إن لم يكن كذلك ، يمكنك ذلك فقط قل أن العودة أو الخروج سيكون أفضل على الأرجح ، اخرج من البرنامج
إذا كنا لم تكن قادرًا على تخصيص الذاكرة ويمكنك تحويلها إلى
ذاكرة سلبية.
خلاف ذلك ، نريد أن نقرأ في البند ، لذلك نريد إنشاء وظيفة.
الوظيفة التي سنقوم بها لإنشاء يسمى قراءة العنصر.
دعنا نضع تصريح دالة هنا فوق الهيكل.
ستكون مجرد قراءة في البيانات في الهيكل الذي مررنا إليه.
لن يتم إرجاع أي بيانات.
لذلك يمكننا أن نقول فقط اقرأ البند ويتطلب بنية ، وسيكون هذا مؤشرًا.
إذن فهو عنصر هيكلي ، علامة النجمة I.
الآن يمكننا جعل هذا ثابتًا لذا تتغير القيم نوعًا
ما ، لكننا نغير القيم.
ولكن يمكننا أن نقول بنية ثابتة ، و لن تكون القيم قادرة على التغيير
لهذا المؤشر الذي يشير إليه.
إذا فعلنا الثابت بعد علامة النجمة ، والتي تشير إلى أن العنوان لا يمكن تغييره أو
تصحيحه قبل علامة النجمة شيء من هذا القبيل بعد
الاسم.
هذا من شأنه أن يقول أن العنوان لا يمكنه ذلك التغيير
، لكن هذا زائد لأننا نمرر بقيمة النسخ.
لدينا البند المقروء لدينا.
وبينما أنا هنا ربما وكذلك تفعل عنصر الطباعة الخاص بي.
ستكون هذه مجرد وظيفة إعلان ، نموذج وظيفي.
هنا ، سيكون الأمر غاية في الأهمية ما شابه ذلك ، خذ أيضًا مؤشرًا.
يمكن أن يكون لديك مساحة إذا كنت تريد بعد علامة النجمة أم لا؟
الآن يمكننا تحديد قراءتنا البند أدناه طريقتنا الرئيسية.
وهذا سيقرأ بقيم العنصر ثم احسب المبلغ
الإجمالي.
لذلك يمكننا القول باطل القراءة البند لدينا مؤشر لدينا.
والداخل هنا ، نريد فقط لاستخدام بعض ملفات scanfs حقًا.
سنقوم بطباعة بعض الرسائل لإخبار المستخدم بإدخال المعلومات.
لذلك سنقول أدخل اسم المنتج ، ثم نقرأه.
لذلك سنقول scanf ، ولدينا مؤشر للبنية ، حتى نتمكن من الوصول إليها
باستخدام الشرطة ثم أكبر من.
نريد أن نقرأ في scanf ، ملف اسم المنتج هو حرف المخزن المؤقت.
لذلك نريد أن نقول النسبة المئوية s و ثم سنقول أنا ، سنقوم بتخزينه
في اسم العنصر.
ويمكننا العودة واستخدام intellisense انتقل إلى اسم العنصر.
لا يتعين علينا استخدام ملف عنوان المشغل
لأنه مؤشر حرف.
ثم نريد الطباعة والحصول على السعر ، ربما
ترغب في إضافة بعض خطوط التغذية هنا ، أدخل السعر.
سنقوم بالتخزين هذا في الهيكل.
لذا مرة أخرى ، السعر متحرك بالرغم من ذلك.
لذلك سأقول النسبة المئوية f ، لكن سنصل إليه أيضًا لأنه مؤشر ، ما زلنا نريد
ذلك استخدم الشرطة ثم أكبر من.
باستثناء هذه المرة ، سنقوم بذلك قل السعر ، ونحتاج إلى الحصول على عنوانه ، لذلك سنقوم
بذلك ضع علامة العطف أمامه لأن السعر ليس
مؤشرًا.
وبعد ذلك سنقوم بعمل نفس الشيء بالنسبة للكمية.
لذا فالكمية هي عدد صحيح.
إذن يمكننا القول النسبة المئوية d ، ما زلنا بحاجة للحصول على
عنوانه ، ولكننا نريد تخزينه في عنصر مختلف ، نريد تخزينه بالكمية.
الآن بعد أن قمنا بتخزينها أو طلبناها المستخدم لإدخال ثلاثة
عناصر من المعلومات ، يمكننا الآن في الواقع احسب المبلغ ، وقم بتخزين شيء
ما في المبلغ.
المبلغ هو فقط الكمية مضروبة في السعر.
لذلك ما زلنا نريد الوصول إلى ملف باستخدام بناء الجملة لدينا ، نريد
أن نلقيها ، نريد أن نوقع الكمية مضروبة في السعر.
وهذه هي وظيفة قراءة العنصر.
يأخذ مؤشر هيكل.
وهكذا عندما نقوم بتعديل هذا المؤشر داخل عنصر القراءة
، سيتم تعديله خارج الوظيفة.
لذا مهما كانت البنية نحن بالمرور إلى هذه الوظيفة ، سيتم
تعديلها.
سيخزن كل ملفات العناصر واسم العنصر والسعر
والكمية والمبلغ.
لذلك يقرأ في البيانات.
في هذه المرحلة ، قد ترغب في ذلك اختبار وربما تريد التجميع
والاختبار قبل ذلك.
لكن يمكننا الآن استدعاء العنصر المقروء منهجنا الرئيسي ونمرره
في هيكلنا الذي أنشأناه.
لذلك يمكننا أن نقول قراءة العنصر ، ويمكننا أن نقول فقط عنصر p.
ليس علينا المرور في العنوان لأنه مؤشر ، لذلك
نحن فقط نمرر في هيكلنا.
ثم الشيء التالي نحن يمكن أن نفعله هو يمكننا طباعته.
وما سيظهر لك هذا هو أنه يتم حفظ البيانات ، يتم تعديل العنصر
p داخل الوظيفة ويتم حفظه خارج الوظيفة ، الوظيفة الرئيسية
في الواقع قد حفظ تلك القيم.
لذلك يمكننا أن نقول طباعة العنصر يمر في المؤشر مرة أخرى ، ومن ثم يمكننا تحديد وظيفة
عنصر الطباعة.
عنصر الطباعة أساسي جدًا.
لا يعيد أي شيء ، لذلك نقول باطل ونقول أن
عنصر الطباعة يأخذ مؤشرًا.
لذلك نقول فقط نجمة عنصر هيكل أنا ، كل ما تريد تسميته.
وبعد ذلك نقوم فقط بطباعة البيانات للهيكل الذي تم تمريره.
لذلك سنفعل شيئًا مثل printf name بالمائة s ، أنا اسم العنصر ، أنا السعر
، أنا الكمية وأنا كمية ثم نقوم بتنسيق البيانات.
ما هو آخر شيء لدينا بشكل رئيسي
بعد طباعة البيانات ، فإن ملف وظيفة حرة مهمة حقًا.
علينا الاتصال مجانا لأننا تريد تحرير الذاكرة التي خصصناها
لاسم العنصر.
لذلك يمكننا أن نقول فقط عنصر p مجاني ثم الوصول إلى اسم العنصر.
لا نريد تحرير الكل هيكل لأنه سيتم
حذف الهيكل بأكمله من كومة عند عودة الوظيفة.
نريد فقط أن نحرر ما أوقعناه.
نحن فقط مالوسيد للعنصر الاسم حتى نحرر ذلك ، ثم
نعود من الرئيسي.
لذلك دعونا نمضي قدما و حاول بناء هذا.
ولدينا خطأ.
دعونا نرى أنه يقول نجمة عنصر هيكل.
لذلك كان لدينا خطأ حيث تم تحديد الوظائف فوق
الهيكل.
لكن وظيفة أخذ المعلمة كنوع هيكل.
لذلك يجب أن يكون لدينا الهيكل المحددة أعلاه حيث نستخدمها.
لذلك أقوم بنقل الوظائف وصولا إلى السطور 12 و 13.
الآن نحن قادرون على تجميع.
دعنا نمضي قدما وندير هذا.
ودعونا نرى ما وصلنا إليه هنا.
لدينا خطأ آخر.
عليك التأكد منك تحقق من عنصر p لـ null.
إذا كنت تقول فقط إذا كان العنصر p لـ صحيح ، سيكون دائمًا صحيحًا.
لذلك يمكنك إما التحقق من القول هذا ليس صحيحًا مع رمز not الذي
يعني أنه ليس فارغًا أو أنت يمكن التحقق لمعرفة ما إذا كان فارغًا.
لذا فقد أضفت القيمة الفارغة هناك.
حتى الآن نقوم بتشغيله ، نحن ينبغي أن يكون على ما يرام.
يمكننا إدخال اسم المنتج.
سنقول مسلسل وسنقوم بذلك لنفترض أن السعر 1. 99.
وسنقول أن لدينا خمسة من هؤلاء.
والآن نطبعه ، ونقول 99 دولار تسلسلي.
5 ، المبلغ الإجمالي هو 9. 95.
السعر رغم أنني لا أحب كيف يتم طباعة السعر.
لذلك دعونا نصلح ذلك.
في عنصر الطباعة لدينا ، يمكننا فقط أن نقول لـ يتحرك السعر dor 2 f
، الآن سنبدو أفضل قليلاً ، ونقوم بتشغيله.
سنحصل على القليل قليلا من تنسيق أفضل.
أربعة منهم والآن هو يبدو أفضل قليلاً ، وكل
شيء على ما يرام.
مرة أخرى ، استخدام البرنامج الأساسي الهياكل والمؤشرات.
أنشأنا الهيكل في الأعلى.
لدينا عضو يحتوي على مؤشر ، من المفيد جدًا القيام بذلك
لأننا نستطيع ذلك ما عليك سوى نسخ العناوين والعناوين بدلاً
من مصفوفات الأحرف.
لدينا إعلانان func ، قراءة عنصر طباعة العنصر الذي
يستغرق إتلاف المؤشرات.
ثم نقوم بإنشاء المؤشر وإسنادها إلى هيكل منتظم داخل
نظامنا الرئيسي.
نخصص ذاكرة على السطر 22.
نتأكد من الذاكرة تم تخصيصه بنجاح إذا لم يتم الخروج
من البرنامج.
ثم نسمي اثنين الوظائف التي تأخذ المؤشرات
إلى الهياكل ، وتمررها.
ثم أخيرًا وليس آخرًا ، نحرر الذاكرة ثم ننهي البرنامج.
والوظائف واضحة ومباشرة جدا.
تأخذ هذا المؤشر.
يمكنك الوصول إلى المؤشر باستخدام شرطة أكبر من.
وتحصل على عنوان إنه لـ scanfs التي لا تحتوي
على مؤشرات كعناصر.
وهذا في الأساس كل شيء.
سأحفظ هذا البرنامج ، يمكنك إلقاء نظرة عليه.
اسمحوا لي أن أعرف إذا كان لديك أي أسئلة. شكرًا لك.