أهلا ومرحبا بكم مرة أخرى.
في هذه المحاضرة ، أريد أن أتحدث عن استخدام المؤشرات والتراكيب
، وكيفية ارتباطها.
يمكن أن يكون لدينا عناصر داخل الهيكل تكون
مؤشرًا ، ومن ثم يمكننا أيضًا أن نجعل هياكلنا نفسها مؤشرات.
مفهومان مفيدان للغاية.
لذا فإن البنية مهمة هنا c تسمح للمؤشرات ببنيتين.
لذلك عندما نقوم بإنشاء متغير لهيكل النوع ، يمكننا
إنشاؤه كمؤشر.
مؤشرات الهياكل أسهل في التلاعب بها من الهياكل نفسها.
لذا مرة أخرى ، إنه نوع من الأشياء الرمزية
، يجعل الأمور أسهل كثيرًا كما أنه أكثر فاعلية.
في بعض التطبيقات القديمة
للغة c ، لا يمكن تمرير
البنية كوسيطة للدالة ، لكننا نعلم أن
المؤشر يمكنه ذلك. لذلك هذا سبب آخر يجعلك تريد أن
يكون لديك بنية تكون مؤشرًا عندما تعلنها لأنه
يمكنك بعد ذلك تمريرها في الإصدارات القديمة من
c ، يمكنك تمريرها كوسيطة إلى دالة.
حتى إذا تمكنت من تمرير بنية كوسيطة ، فإن تمرير
المؤشر يكون أكثر فاعلية.
نحن نعلم أن هذا أكثر كفاءة. لقد تحدثنا عن هذا في الماضي كيف يمكن
أن يكون التمرير أكثر فاعلية.
في هذه الحالة ، يكون الأمر أكثر فاعلية لأنه
إذا كنت تقوم بتمرير بنية كاملة ، وإذا كانت البنية كبيرة وتحتوي
على الكثير من العناصر ، فأنت تقوم بنسخ جميع العناصر
الموجودة في الهيكل إلى تلك المعلمة.
إذا كنت تقوم بتمرير المؤشر ، فما عليك سوى نسخ العنوان.
لذلك من المهم استخدام المؤشرات كوسيطات
منظمة لأن الهياكل يمكن أن تكون كبيرة.
تستخدم العديد من تمثيلات البيانات هياكل تحتوي على مؤشرات
إلى هياكل أخرى.
سترى هذا كثيرًا في جميع هياكل
برامج c التي هي مؤشرات وللأسباب التي ذكرناها.
حقيقة أنه يمكنك تمريرها كمعلمات في الإصدارات القديمة
لتراها كما أنها أكثر فاعلية لأننا نفعل
كل شيء من خلال تمرير القيمة وهو نسخ أكثر
كفاءة لنسخ عنوان من نسخ جميع عناصر
هذا الهيكل الكبير.
لذا فإن إعلان الهيكل كمؤشر واضح ومباشر.
عندما تحدد متغيرًا ليكون مؤشرًا لضربه ، فأنت تستخدم فقط تلك العلامة النجمية
بعد نوع البيانات.
وقلنا أن الهياكل هي نوع جديد حقًا.
في هذه الحالة ، هيكل التاريخ المهم لدينا.
نقول فقط تاريخ البناء ثم نستخدم مؤشر التاريخ بعلامة النجمة
، وربما تريد تهيئة ذلك ليصبح فارغًا.
لأن تذكر ، عندما تقول تاريخ هيكل مؤشر تاريخ هيكل
تاريخ مؤشر ، الذي لا يخصص أي ذاكرة له ، فإنه
يخلق ذاكرة لتخزين المؤشر الفعلي.
إنه لا يخلق ذاكرة للبيانات الموجودة بداخله.
لذلك يمكنك إما تعيين
نقطة التاريخ هذه أو عنوان تاريخ هيكل آخر أو
يمكنك تخصيص ذاكرة لها في مكان آخر أو يمكنك
تهيئتها ببعض البيانات بهذه
الطريقة أيضًا.
لذلك يمكن تعيين مؤشر التاريخ المتغير تمامًا مثل المؤشرات
الأخرى ، يمكنك تعيينه للإشارة إلى تاريخ اليوم باستخدام
بيان التخصيص ، لذلك إذا كان لدينا بالفعل إعلان عن تاريخ اليوم.
سنستخدم فقط علامة العطف للحصول على عنوانها.
لذلك قمنا بإنشاء هيكل تاريخ عادي وهو تاريخ اليوم.
لذلك من شأنه أن يخلق ذاكرة للعناصر الثلاثة.
ثم نقوم بإنشاء المؤشر الخاص بنا وقمنا فقط بتعيين
عنوان التاريخ الآخر له.
واضحة ومباشرة جدا. لقد فعلنا ذلك مع أنواع البيانات العادية ،
ولا يختلف الأمر عند القيام بذلك باستخدام الهياكل.
يمكنك بعد ذلك الوصول بشكل غير مباشر إلى أي من أعضاء بنية البيانات المشار إليها بمؤشر التاريخ.
لذلك علينا القيام بشيء من هذا القبيل.
إذا كنت ترغب في الوصول إلى عنصر بنية مؤشر
اليوم ، فسيتعين عليك إلغاء الإشارة إليه أولاً.
ولذا ربما يكون من المفيد وضعه بين قوسين بحيث يكون واضحًا جدًا.
يجب عليك إزالة مرجع مؤشر التاريخ للحصول على
قيمة ما يشير إليه تاريخ اليوم
، وقيمة عنوان تاريخ اليوم الذي يشير إليه
من أجل تعيين قيم معينة.
لذلك يمكنك إزالة الإشارة إليه
ثم عمل النقطة التي تساوي 21 وهذا من شأنه تعيين 21 لمؤشر اليوم
الخاص بك.
الآن ما ورد أعلاه يقول فقط مهما كان تاريخ اليوم يشير إليه
، نريد الوصول إلى هذه القيمة وتعيين اليوم على 21.
في هذه الحالة ، تكون الأقواس مطلوبة لأن النقطة
لها أسبقية أعلى من علامة النجمة.
إذا لم تضع الأقواس هناك ، فسيتم تفكيكها لأنها ستحاول عمل النقطة أولاً
قبل أن تحصل بالفعل على المؤشر إلى المؤشر ، لتوجيهها
إلى البيانات.
لذلك سيحاول الوصول إلى البيانات باستخدام مؤشر فارغ بشكل أساسي.
وبالتالي ، من خلال إزالة المرجع ، تحصل على القيمة.
الآن عندما نستخدم البنى والمؤشرات.
إذا أردنا اختبار قيمة الأشهر المخزنة في بنية التاريخ المشار إليها بمؤشر التاريخ ، فيمكننا
القيام بشيء من هذا القبيل.
نقوم بإزالة الإشارة إلى المؤشر ، ووضعنا بين قوسين ، بحيث يكون له الأسبقية على النقطة
، ثم نقول أن النقطة الشهرية تساوي 12.
إنها صيغة صحيحة تمامًا.
لكنها مرهقة نوعًا ما.
لذا فإن c لها بناء الجملة الخاص بها ، لذلك لا يتعين عليك
إزالة مرجع كل شيء ووضعه داخل قوس للبنى.
عندما تريد الوصول إلى ما يشير إليه الهيكل ، لا يتعين عليك إلغاء
الإشارة إليه بهذه الطريقة.
هناك عامل خاص موجود في c لهياكل المؤشرات ، وهي
الشرطة أكبر من.
إنها شرطة متبوعة بعلامة أكبر من.
وهذا لا يسمح لك بإلغاء إشارة المؤشر.
لذا بدلاً من وضع النجمة x داخل الأقواس ثم النقطة
y ، يمكنك فقط أن تقول x شرطة أكبر من y.
نظرًا لأن x هو مؤشر ، فلا يتعين عليك الرجوع إليه وتريد الوصول إلى
العنصر الموجود داخل هذا الهيكل أيا كان ما تشير إليه.
لذلك سترى بناء الجملة هذا في كل مكان. لن ترى الأقواس
والمرجع d. إنه صالح تمامًا ، لكنك تكتب المزيد من الأحرف.
من الأفضل أن تقول س شرطة أكبر من ص.
لذا فإن عبارة if السابقة هنا بدلاً من إلغاء الإشارة داخل الأقواس ، كل ما عليك
فعله هو قول ما إذا كان مؤشر التاريخ اندفع أكبر من الشهر.
وهو أمر بديهي إلى حد ما لأن الشرطة أكبر من القول إنها تشير إلى شيء ما.
وبالتالي ، شرطة التاريخ أكبر من الشهر.
وبالتالي ، فإن مؤشر التاريخ هو مؤشر وهذا هو سبب استخدامك للشرطة أكبر من.
الآن إذا كان ذلك عبارة عن بنية متداخلة
، فستقوم بعمل شرطة أكبر من الهيكل ومن ثم سيتعين عليك عمل
نقطة بعد ذلك للوصول إلى عناصر البنية المتداخلة.
ولكن نظرًا لأن مؤشر اليوم هو مؤشر ، فيجب عليك استخدام الشرطة التي تساوي
أو شرطة أكبر من.
إذن ، هذا مثال ، نقوم بإنشاء تاريخ الهيكل لدينا لدينا
ثلاثة عناصر ، ثم نقوم بإنشاء مؤشر تاريخ المؤشر الخاص بنا وننشئ متغيرًا
عاديًا اليوم. نخصص لمؤشرنا عنوان
اليوم ثم نخصص عناصر فعلية للبنية ، نستخدم
فقط تلك الشرطة أكبر من ثم يمكننا طباعتها.
لذلك دعونا نلقي نظرة على هذا في كتل التعليمات البرمجية لنرى كيف يعمل هذا.
لذا سأضع هذا المثال هنا.
وعادة عندما تحدد الهياكل ، فإنك تحددها
خارج الوظيفة لأنه يمكنك استخدامها في أي وظيفة.
إنه نوع ما مثل عالمي. لكن تذكر أنه عندما
تحدد الهيكل ، فأنت لا تنشئ أي ذاكرة في الواقع.
لذلك ما زلت تنشئ المتغيرات كمتغيرات أو مؤشرات محلية ،
لكن التعريف الفعلي خارج الوظيفة.
لذلك إذا كنت ترغب في استخدامه يمكنك استخدامه في أي وظيفة.
هنا في الجزء العلوي ، أنشأنا بنية جديدة لنوع التاريخ أو الاسم
حتى الآن وتحتوي على ثلاثة أعداد صحيحة ، وننهيها بفاصلة منقوطة.
ثم نقوم بإنشاء متغيرين داخل main.
واحد هو مجرد تاريخ متغير عادي اليوم
ثم آخر هو مؤشر. نحن نعلم أنه مؤشر لأنه يحتوي على علامة النجمة قبله.
نحن نعلم أن المؤشر عندما تنشئ مؤشرًا ، فإنه يخصص ذاكرة لتخزين
هذا العنوان لتلك القيمة لذلك المؤشر.
لذلك علينا أن نخصص له عنوانًا نفعله مع علامة العطف اليوم لأن هذا
في الواقع يُنشئ تقريرًا عن الذاكرة.
حتى الآن سوف يشير مؤشر التاريخ إلى ما
هو اليوم مع عنوان اليوم.
يمكننا بعد ذلك البدء في تخصيص البيانات لها باستخدام هذه الشرطة التي تكون أكبر من
كونها مفيدة جدًا وتعيين بيانات مثل أي شخص آخر فقط استخدم عامل التخصيص.
وبعد ذلك عندما نطبعها ، ستلاحظ
أنه لا يتعين علينا إزالة المرجع لطباعتها.
لطباعته ، يمكننا
في الواقع أن نقول أنواع البيانات الخاصة بمحددات التنسيق هنا نسبة مئوية أعلى من
النسبة المئوية d هي نفسها للأعداد الصحيحة ، ثم نستخدم أداة الدرجات لأن هذا
في الواقع يقوم بإلغاء الإشارة إلى التذكر.
الآن يمكننا تغيير هذا وسيكون هذا صحيحًا.
علينا أن نضع أقواس ثم نقول الشهر النقطي.
كلتا الحالتين جيدة ، لكن تعتاد على الشرطة ثم أكبر لأنها بناء جملة أفضل.
والآن عندما نبني هذا
، سترى أنه يطبع قيم مؤشرات التاريخ
وجميعها مضبوطة على 9 25 و 2015.
لذلك تقول أن تاريخ اليوم هو 9 25 15. تمت تهيئته للطباعة بهذه الطريقة.
أشياء بسيطة جدا.
فقط تذكر أن الشرطة أكبر من ، هذه صيغة
جديدة للمؤشرات للبنى.
لكن كل شيء آخر هنا عادي.
نحن نعلم أن المؤشرات يجب أن تكون موجودة في عناوين المتاجر ، لذا فنحن
نعلم أنه يتعين علينا إما تخصيص ذاكرة ديناميكية أو يتعين علينا تخصيص بنية موجودة لها.
دعنا نعود ونتحدث أكثر عن البنيات والمؤشرات.
الآن دعنا نتحدث عن الهياكل التي تحتوي على المؤشرات.
نحن نعرف كيفية إنشاء مؤشر للهيكل.
يمكننا تخصيص ذاكرة لهذا المؤشر إذا لم نرغب
في تعيين عنوان موجود لمؤشر موجود.
ولكن يمكن أيضًا أن يكون لديك عناصر داخل
هيكل يكون مؤشرًا بحد ذاته. لذلك يمكن أن يكون المؤشر أيضًا عضوًا في بنية.
لا يتعين علينا استخدام مجموعة الأحرف هذه.
لذلك يمكننا أن نقول Struct
، يمكننا تسميتها بالمؤشرات ثم يمكننا استخدام هنا في هذا المثال لدينا رقمان صحيحان
، ومؤشران صحيحان p1 و p2 ، بناء جملة صحيح تمامًا للقيام بذلك.
لذلك يتم تعريف البنية التي يتم استدعاؤها في المؤشرات بحيث تحتوي على مؤشرين صحيحين.
الأول يسمى p1 والثاني يسمى p2.
يمكنك تحديد متغير من نوع هيكلة في مؤشرات مثل المؤشرات العادية ،
الهيكلية ، الدولية ، المؤشرات.
يمكن الآن استخدام المؤشرات المتغيرة تمامًا مثل الهياكل الأخرى.
المؤشرات ليست مؤشرا.
انها مؤشرات int. يحتوي على عنصرين داخل ضربته وهما عبارة
عن مؤشرات ، لكن المؤشرات نفسها ليست مؤشرًا فعليًا.
لذا انتبه لذلك. إنه متغير هيكل يحتوي على مؤشرين كأعضائه
، وهذا مختلف.
لذلك إذا أردنا الوصول إلى العناصر داخل متغير
المؤشرات الموجود في المؤشرات ، فإننا لا
نستخدم الشرطة أكبر من لأن المؤشرات ليست مؤشرًا ، إنها بنية.
سنستخدم النقطة للوصول
إلى p1 والوصول إلى p2.
لذلك في هذا المثال ، نقوم بإنشاء هيكلنا
، وننشئ متغيرًا. إنه ليس مؤشرًا يسمى المؤشرات.
ثم ننشئ عددين صحيحين ، i1
يساوي 100 و i2 لم يتم تهيئتهما.
الآن p1 و p2 مؤشرات.
لذلك يجب أن تحتوي على عناوين ذاكرة صالحة حيث تم تخصيص الذاكرة
للعناوين.
وهذا ما تفعله i1 و i2.
عندما تقوم بتعريف متغيرات الأعداد الصحيحة ، يتم تخصيص الذاكرة لتلك الأعداد الصحيحة.
وبالتالي من خلال تعيين العنوانين i1 و i2 إلى p1 و p2 ، فهذا جيد تمامًا لأن
i1 و i2 لديهما ذاكرة مخصصة لأنهما أعداد صحيحة.
الآن إذا لم تكن مؤشرات الأعداد الصحيحة مؤشرات عدد صحيح ولكنها كانت مؤشرات شخصية
، فسيتعين عليك تخصيص ذاكرة ديناميكية.
لذلك نحن الآن نستخدم الأعداد الصحيحة فقط ، لذلك قمنا بتعيين عناوين العددين الصحيحين إلى p1 و p2.
يمكننا الآن أن نقول مؤشرات النجوم. p2 يساوي 97 ، سالب
97.
لماذا يتعين علينا إلغاء الإشارة إليها
هناك بسبب المؤشرات. p2 هو ما نشير إليه.
المؤشرات. مؤشر pt p2.
نحن لا نصل إلى عنصر هيكل.
نحن نلغي الإشارة إلى جميع المؤشرات. ص 2.
وسنخصص ذلك ، أيًا كان ما يشير إلى سالب 97.
لذلك لاحظ الفرق هناك.
نحن لا ننشئ مؤشر هيكل.
نقوم بإنشاء مؤشر متغير عادي ، لكنه يحتوي
على عنصرين يمثلان مؤشرات.
لذا ، إذا أردنا إسناد هذين العنصرين داخل البنية ، فعلينا إلغاء
الإشارة إليهما باستخدام عامل غير مباشر ، وهذا
ما نفعله هناك.
ثم في بياناتنا المطبوعة.
مرة أخرى ، نريد طباعة قيم ما تشير إليه p1 حتى نزيلها
عن نفس المرجع مع p2 ثم نرغب
أيضًا في طباعة القيم التي
تشير إليها المؤشرات مرة أخرى.
لذلك في أول واحد نقول أن i1 يساوي بالمائة
، ومؤشرات فاصلة. p1 يساوي بالمائة
I.
إذن ، أول واحد داخل علامتي الاقتباس المزدوجة هو مجرد طباعة ذلك النص
الفعلي ، فهو لا يلغي الإشارة إلى أي شيء بعد الفاصلة حيث نقوم بإلغاء الإشارة إليه.
نطبع أولاً i1 وهو 100 ثم نطبع المؤشرات
p1 والتي ستكون 100.
سيكون I2 في الواقع سالب
97 بعد إسنادها إلى p2.
فماذا عن مصفوفات الشخصية أو مؤشرات الشخصية. في المحاضرة السابقة تحدثنا
عن كيفية إنشاء مصفوفة أحرف كعنصر داخل
المؤشر. ولكن ماذا عن مؤشرات الشخصية
، هل يجب أن نفعل شيئًا مثل
الأول والأخير لدينا مصفوفات
الأحرف أو يجب أن نفعل شيئًا مثل الأول والأخير باستخدام
مؤشرات الشخصية كعناصر. ما هو الخيار الأفضل.
حسنًا ، سنرى. إنه حقًا شيء تدويني مرة أخرى ولكن هناك مزايا لاستخدام المؤشرات.
لذلك عندما ننشئ مؤشرات لأحرف داخل عناصرنا ، فعادة ما
يكون ذلك أفضل قليلاً.
لكن عليك أن تفهم ما يحدث هنا عند إنشاء
مصفوفة حرف مصفوفة كعنصر أو كمؤشر كعنصر ، كلاهما
صالح. لكن هناك فرق كبير.
لذلك إذا قلنا اسم البنية
veep أو vp وقلنا Talia و Summers ثم قلنا
اسم مؤشر البنية. لذا تذكر أن أسماء الهياكل تحتوي على مصفوفات الأحرف.
تحتوي أسماء مؤشرات البنية على المؤشرات.
ونقوم هنا بتهيئة المؤشرات التي تساوي Brad و Fallingjaw.
وبعد ذلك نطبعها سنقوم بطباعة العنصر
الأول ، وهو الحرف a و vp ثم العنصر
الأول من الكنز ، وهو مؤشر إلى الأول.
لذا فإن متغير أسماء البنية veep.
ما يحدث هنا هو أن الأوتار مخزنة داخل الهيكل.
خصصت البنية ما مجموعه 40 بايت للاحتفاظ بالاسمين ، وهما
مصفوفات الأحرف.
هذا ما يحدث عندما ننشئ مصفوفات شخصية داخل المؤشر.
نخصص 40 بايت للاحتفاظ بهذين الاسمين
، 20 و 20.
بالنسبة لمتغير أسماء المؤشرات ، سواء كان لدينا مؤشران أولاً وأخيراً
، فهذه سلاسل يتم تخزينها أينما يخزن المترجم ثوابت السلسلة.
تحمل البنية العنوانين
لأنهما مؤشرات. المؤشرات تحتوي على القيم التي هي عناوين.
لذلك كل ما سيفعله هو تخصيص مؤشرين داخل هذا الهيكل.
هذا هو 16 بايت لمعظم الأنظمة ، والمؤشرات عادة 8 بايت أو 4 بايت.
لا تخصص بنية اسم Struct p أي مساحة لتخزين السلاسل لأنها
تخصص مساحة للمؤشرات نفسها فقط.
المؤشرات لها قيم تمثل عناوين.
العنوان الذي يشير إليه لا توجد ذاكرة مخصصة لذلك.
لذلك عند إنشاء هذين المؤشرين ، لا توجد ذاكرة مخصصة لهذين المؤشرين.
لا تخصص مساحة.
لذلك يمكن استخدامه فقط مع السلاسل التي تم تخصيص مساحة لها في مكان آخر.
عندما يكون لديك مؤشرات داخل هيكل ، يجب عليك استخدام
malloc أو calloc.
خلاف ذلك ، يمكن تخزينها أينما يتم تخزين ثوابت السلسلة.
وهذا هو الاختلاف الكبير. لذلك يجب استخدام بنية المؤشرات والاسم
p فقط لإدارة السلاسل التي تم إنشاؤها وتخصيصها في مكان آخر في البرنامج.
لا ترغب في تخصيص البيانات
لذلك إلا إذا قمت بتخصيصها ديناميكيًا أو تم تخصيصها في مكان
آخر ، ربما بواسطة بنية موجودة
أو شيء من هذا القبيل. لكن عادةً ، سترغب في مالوك تلك المؤشرات.
مرة أخرى ، مختلفة جدا.
أنت تخصص 40 بايت لهاتين المصفوفتين من الأحرف داخل بنية الاسم.
بالنسبة لـ p name Struct ، لديك مؤشرين.
لا توجد ذاكرة مخصصة لذلك عند إنشاء متغير من هذا النوع.
إنها فقط تُنشئ ذاكرة لمؤشر الحرف ، وهو ثمانية بايت لكل منهما.
لتخصيص ذاكرة فعلية لما يشير إليه الأول والأخير ، عليك أن تقوم بعمل malloc.
لذا فإن أحد الأمثلة التي يكون من المنطقي فيها استخدام مؤشر وبنية هو التعامل
مع السلاسل هو إذا كنت
تقوم بتخصيص تلك الذاكرة ديناميكيًا.
هذا عادة عند استخدامه لأن أنواع
البيانات الأخرى المسموح بها ستقوم تلقائيًا بتخصيص الذاكرة لك.
لذلك تريد استخدام مؤشر لتخزين العنوان.
هذا له ميزة أنه يمكنك أن تطلب من malloc تخصيص مقدار المساحة
المطلوبة للسلسلة فقط. تحدثنا عن مزايا تخصيص الذاكرة الديناميكي.
عندما تقوم بإنشاء أشياء بشكل ثابت في وقت الترجمة ، فإنك
ستقوم فقط بإنشاء عدد محدد من البايتات.
ماذا يحدث إذا احتجت إلى المزيد من البايتات ، أو إذا كنت مضطربًا ، فلن يعمل برنامجك.
عليك العودة وإعادة التجميع. باستخدام السلاسل المخصصة ديناميكيًا
، يمكنك إعادة الضبط ، ويمكنك إنشاء نفس القدر من الذاكرة التي تحتاجها ، مما يجعلها
أكثر كفاءة في البرنامج.
لذلك ستستخدم malloc في أي مؤشرات تم إنشاؤها داخل بنية.
لذلك في هذه الحالة ، لديك بنية اسمها count.
لديك مؤشرين ، مؤشرات الحرف fname واسم العائلة.
وبعد ذلك لديك عدد صحيح ، أحرف.
لا يتم تخزين السلاسل الداخلية هنا في الهيكل.
نقوم فقط بإنشاء ذاكرة للمؤشرات ، والتي تحتوي على عناوين.
نريد إنشاء ذاكرة لـ fname و lname لما تشير إليه المؤشرات.
لذلك نريد تخزين ذلك في جزء تتم إدارته بواسطة موقع ذاكرة ديناميكي ، والذي يستخدم malloc.
عنوان السلسلتين هو ما يتم تخزينه ، وليس ما يشيرون إليه.
لذا فإن العناوين هي ما تعمل به وظائف معالجة السلاسل عادةً
، وهذا أمر جيد ولهذا السبب تريد استخدام المؤشرات هناك
لأنه لا يتعين عليك ذلك ، ثم يمكنك تمريرها بسهولة أكبر.
إذن هذا مثال. لدينا وظيفة تسمى الحصول على المعلومات.
يأخذ المؤشر.
ويمكننا تمرير هذا المؤشر بسهولة بالغة.
الآن سنقوم أيضًا بإنشاء مجموعة أخرى
أو لمصفوفة المؤشر الخاصة بنا التي
تم تمريرها إليها ، وسنخصص ذاكرة
لها.
لذلك سترى أننا أنشأنا شخصية تسمى temp ثم نقوم
بتخزين بعض البيانات في ذلك المؤقت.
نطلب من المستخدم الحصول على شيء. نحن لسنا على دراية بالأدوات ، لكنها مماثلة للمسح الضوئي المحفوظ قليلاً.
ثم نخصص ذاكرة fname داخل هذا المؤشر ونفعل ذلك تمامًا مثلما
نخصص ذاكرة لأي شخصية. نسمي malloc ، نمرر
في عدد البايتات.
في هذه الحالة ، طول السلسلة 10 زائد 1 للفاصل الصفري.
ثم تذكر ، مالوك يحول نجمًا فارغًا ، لذلك قمنا بنقله إلى نجمة شخصية.
لكن هذا أمر بالغ الأهمية هنا. هذا الاستدعاء malloc ضروري لأي بنى تحتوي على مؤشرات.
الآن مررنا هذا المؤشر ولم يكن للمؤشر ذاكرة مخصصة
له.
لذلك نحن نخصص الذاكرة بالداخل هنا. يمكننا بعد ذلك عمل نسختنا بسهولة بالغة.
يمكننا نسخ temp إلى fname من هيكلنا pst الذي تم تمريره
كمعامل.
وبعد ذلك يمكننا أن نجعلهم يدخلون اسمهم الأخير ، ويمكننا أن نضيف المزيد من الذاكرة
للاسم الأخير ثم نخزن في متغير البنية للاسم الأخير.
هذا ما ستحتاج إلى القيام به عندما يكون لديك مؤشرات إلى الشخصيات
داخل الهياكل الخاصة بك ، عليك أن تفعل malloc.
لأنه مرة أخرى ، تخزن هذه المؤشرات العنوان فقط.
يخصصون ذاكرة كافية لتخزين عنوان ، ولا توجد
ذاكرة كافية لتخزين سلسلة.
لذا مهما كان العنوان الذي يشير إليه ، يجب عليك تخصيص ذاكرة لذلك
وتفعل ذلك تمامًا كما هو معتاد مع malloc
، والفرق الوحيد هنا هو أنك تستخدم شرطة أكبر من علامة للوصول
إلى العنصر الفعلي داخل هذا الهيكل ، وهو مؤشر الحرف ، حتى تتمكن من تعيينه
إليه وهذا يؤدي إلى إزالة المرجع.
لذا سترغب في اللعب بهذه الأشياء. هذا شائع جدًا لمؤشرات
الشخصية داخل البنيات.
سنواجه تحديًا حيث ستحتاج إلى القيام بذلك. لكن تلاعب بهذا الكود ، انتقل إلى داخل
كتل التعليمات البرمجية ، وابدأ في تخصيص ذاكرة للسلاسل
أو مؤشرات الأحرف داخل البنى ، وانظر كيف يمكنك
بعد ذلك استخدام نسخة str لوضع البيانات داخلها بالفعل ، ولكن عليك
أولاً تخصيص الذاكرة قبل تعيينها .
إذا كنت تقوم بعمل ثوابت كما في المثال السابق ، فمن يعرف أين يتم تخصيص هذه الذاكرة.
مرة أخرى ، تم عرض الكثير من المفاهيم المهمة في هذه المحاضرة.
فكرة الهيكل التي تمثل مؤشرًا في هذه الصيغة
الجديدة حيث يمكنك
استخدام الشرطة ثم أكبر من استخدام عامل المراوغة
، وهي فكرة لطيفة جدًا.
وبعد ذلك في الواقع وجود العناصر كمؤشرات وكيف يجب
عليك تخصيص ذاكرة لمؤشرات الشخصية. شكرًا لك.