المؤشرات إلى الهياكل
جزء من قسم المنطق وتدفق التنفيذ في رحلة C على Coddy. الدرس 44 من 63.
والآن بعد أن أصبحت مرتاحًا في التعامل مع البُنى، حان وقت دمجها مع مفهوم قوي آخر في C: المؤشرات. تمامًا كما يمكنك إنشاء مؤشرات لأنواع البيانات الأساسية مثل int أو char، يمكنك أيضًا إنشاء مؤشرات تخزّن عنوان متغير من نوع بنية.
تتبع صياغة التصريح عن مؤشر إلى بنية النمط نفسه المتبع في تصريحات المؤشرات الأخرى:
struct StructureName *pointerName;على سبيل المثال، باستخدام البنية المألوفة لدينا Point:
struct Point p1 = {10, 20};
struct Point *ptr;ينشئ هذا مؤشرًا باسم ptr يمكنه تخزين عنوان بنية Point. لجعل المؤشر يشير فعليًا إلى متغير البنية، استخدم عامل أخذ العنوان:
ptr = &p1;لقراءة عضو عبر المؤشر، أزل الإشارة عنه ثم استخدم عامل النقطة. الأقواس مطلوبة، لأن . له أسبقية أعلى من *:
printf("%d", (*ptr).x); // مثل p1.x تمامًاالآن، يحتوي ptr على عنوان الذاكرة لمتغير البنية p1. يتيح هذا إمكانيات جديدة للعمل مع البنى، خاصةً عند تمريرها إلى الدوال أو إدارة الذاكرة ديناميكيًا. تُعد المؤشرات إلى البنى ضرورية لإنشاء هياكل بيانات أكثر تعقيدًا وكتابة برامج C فعّالة.
التحدي
سهلأنشئ برنامجًا بلغة C يوضّح كيفية التعامل مع المؤشرات إلى البنى. يجب أن يقوم برنامجك بما يلي:
- عرّف
structباسمProductمع الأعضاء التالية:- عدد صحيح
idلتخزين معرّف المنتج - مصفوفة محارف
nameبحجم 25 لتخزين اسم المنتج - عدد عشري
priceلتخزين سعر المنتج - عدد صحيح
quantityلتخزين الكمية المتاحة
- عدد صحيح
- في الدالة الرئيسية، أنشئ متغيرًا من نوع
Productباسمitemوامنحه القيم التالية عند تهيئته:- المعرّف: 501
- الاسم: "Laptop"
- السعر: 899.99
- الكمية: 15
- صرّح عن مؤشر إلى بنية
ProductباسمitemPtr - أسند عنوان المتغير
itemإلىitemPtrباستخدام معامل أخذ العنوان - اطبع معلومات المنتج الأصلية عن طريق الوصول مباشرةً إلى أعضاء البنية (باستخدام معامل النقطة) بهذا التنسيق بالضبط:
Original Product Info:ID: [id]Name: [name]Price: [price]Quantity: [quantity]
- اطبع معلومات المنتج نفسها عن طريق الوصول إلى أعضاء البنية من خلال المؤشر (باستخدام معامل إلغاء الإشارة وصيغة النقطة:
(*itemPtr).member) بهذا التنسيق بالضبط:Product Info via Pointer:ID: [id]Name: [name]Price: [price]Quantity: [quantity]
- تحقّق من أن المؤشر يشير إلى البنية على نحو صحيح، وذلك بطباعة عناوين الذاكرة بهذا التنسيق بالضبط:
Address of item: [address]Value of itemPtr: [address]Address verification: [result]
للتحقق من العنوان، اطبع Match إذا كان العنوانان متطابقين، أو No Match إذا كانا مختلفين.
يتحقق هذا التحدي من فهمك للتصريح عن مؤشر إلى بنية، وإسناد العنوان باستخدام معامل أخذ العنوان، والوصول إلى أعضاء البنية من خلال المؤشرات باستخدام معامل إلغاء الإشارة مع صيغة النقطة. وستتحقق أيضًا من أن المؤشر يحتوي على عنوان متغير البنية على نحو صحيح.
جرّب بنفسك
#include <stdio.h>
#include <string.h>
// TODO: عرّف البنية Product هنا
int main() {
// TODO: اكتب الكود الخاص بك هنا
// 1. أنشئ المتغير 'item' من النوع Product وهيّئه
// 2. صرّح بمؤشر إلى Product باسم 'itemPtr'
// 3. أسند عنوان 'item' إلى 'itemPtr'
// 4. اطبع معلومات المنتج الأصلية باستخدام عامل النقطة
// 5. اطبع معلومات المنتج عبر المؤشر باستخدام (*itemPtr).member
// 6. اطبع العناوين وتحقّق منها
return 0;
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المنطق وتدفق التنفيذ
1أساسيات المؤشرات
ما هو المؤشر؟الإعلان عن المؤشراتعامل العنوان (&)عامل إلغاء المرجعية (*)مؤشرات NULLمراجعة: أساسيات المؤشرات4مشروع: أداة نصوص بسيطة
نظرة عامة على المشروععد الأحرف2المؤشرات والمصفوفات
أسماء المصفوفات كمؤشراتعناصر المصفوفة - المؤشراتالعمليات الحسابية على المؤشراتمقارنة المؤشراتمراجعة: التنقل في المصفوفة باستخدام المؤشرات5المؤشرات والدوال
التمرير بالقيمةتمرير المؤشرات إلى الدوالتعديل المتغيرات عبر المؤشراتمثال كلاسيكي: التبديلتمرير المصفوفات إلى الدوالملخص: وسائط المؤشرات في الدوال8الهياكل والمؤشرات
المؤشرات إلى الهياكلعامل السهم (->)تمرير الهياكل بالقيمةتمرير مؤشرات الهياكلالتخصيص الديناميكي للهياكلمراجعة: تعديل الهياكل باستخدام المؤشرات11تحديات المراجعة النهائية
مراجعة: دمج السلاسل النصية الديناميكيمراجعة: مصفوفة من الـ Structsمراجعة: عداد تكرار الكلمات3مصفوفات الأحرف والسلاسل النصية
السلاسل النصية كمصفوفات charالمُنهي الصفري (Null Terminator)إدخال السلاسل النصية باستخدام scanfاستخدام strlen()استخدام strcpy()استخدام strcat()استخدام strcmp()مراجعة: دوال السلاسل النصية الأساسيةتدرّب بنفسك: مترجم C عبر الإنترنت