المؤشرات إلى الهياكل
جزء من قسم Logic & Flow في رحلة C على Coddy — الدرس 44 من 63.
الآن بعد أن أصبحت مرتاحاً في التعامل مع الـ structs، حان الوقت لدمجها مع مفهوم قوي آخر في لغة C: المؤشرات (pointers). تماماً كما يمكنك إنشاء مؤشرات لأنواع البيانات الأساسية مثل int أو char، يمكنك أيضاً إنشاء مؤشرات تحمل عنوان متغير من نوع struct.
يتبع بناء الجملة للإعلان عن مؤشر إلى هيكل (struct) نفس النمط المتبع في إعلانات المؤشرات الأخرى:
struct StructureName *pointerName;على سبيل المثال، باستخدام هيكل Point المألوف لدينا:
struct Point p1 = {10, 20};
struct Point *ptr;يؤدي هذا إلى إنشاء مؤشر باسم ptr يمكنه تخزين عنوان Point struct. ولجعل المؤشر يشير فعلياً إلى متغير الـ struct الخاص بنا، استخدم عامل العنوان (address-of operator):
ptr = &p1;الآن يحمل ptr عنوان الذاكرة لمتغير الـ p1 struct. يفتح هذا آفاقاً جديدة للعمل مع الـ structs، خاصة عند تمريرها إلى الدوال أو إدارة الذاكرة ديناميكياً. تعد المؤشرات إلى الـ structs ضرورية لبناء هياكل بيانات أكثر تعقيداً وكتابة برامج C فعالة.
التحدي
سهلقم بإنشاء برنامج بلغة C يوضح كيفية التعامل مع المؤشرات إلى الهياكل (pointers to structs). يجب أن يقوم برنامجك بما يلي:
- تعريف
structباسمProductمع الأعضاء التاليين:- عدد صحيح
idلتخزين معرف المنتج - مصفوفة أحرف
nameبحجم 25 لتخزين اسم المنتج - رقم عشري
priceلتخزين سعر المنتج - عدد صحيح
quantityلتخزين الكمية المتاحة
- عدد صحيح
- في الدالة الرئيسية (main function)، قم بإنشاء متغير من نوع
Productباسمitemوقم بتهيئته بالقيم التالية:- ID: 501
- Name: "Laptop"
- Price: 899.99
- Quantity: 15
- قم بالتصريح عن مؤشر (pointer) إلى هيكل
ProductباسمitemPtr - قم بتعيين عنوان المتغير
itemإلىitemPtrباستخدام عامل العنوان (address-of operator) - اطبع معلومات المنتج الأصلية عن طريق الوصول إلى أعضاء الهيكل مباشرة (باستخدام عامل النقطة dot operator) بهذا التنسيق الدقيق:
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 إذا كانت مختلفة.
يختبر هذا التحدي فهمك للتصريح عن المؤشر إلى الهيكل (pointer-to-struct)، وتعيين العنوان باستخدام عامل العنوان، والوصول إلى أعضاء الهيكل من خلال المؤشرات باستخدام عامل إلغاء المرجعية مدمجاً مع تدوين النقطة. ستتحقق أيضاً من أن المؤشر يحمل عنوان متغير الهيكل بشكل صحيح.
ورقة مرجعية
يمكنك إنشاء مؤشرات للهياكل (structs) باستخدام نفس بناء الجملة المستخدم في إعلانات المؤشرات الأخرى:
struct StructureName *pointerName;لجعل مؤشر يشير إلى متغير هيكل (struct variable)، استخدم عامل العنوان (address-of operator):
struct Point p1 = {10, 20};
struct Point *ptr;
ptr = &p1;قم بالوصول إلى أعضاء الهيكل من خلال مؤشر باستخدام عامل إلغاء المرجعية (dereference operator) وتدوين النقطة (dot notation):
(*ptr).memberجرّب بنفسك
#include <stdio.h>
#include <string.h>
// TODO: قم بتعريف هيكل المنتج (Product struct) هنا
int main() {
// TODO: اكتب الكود الخاص بك هنا
// 1. قم بإنشاء وتهيئة متغير المنتج 'item'
// 2. قم بتعريف مؤشر للمنتج باسم 'itemPtr'
// 3. قم بتعيين عنوان 'item' إلى 'itemPtr'
// 4. قم بطباعة معلومات المنتج الأصلية باستخدام عامل النقطة (dot operator)
// 5. قم بطباعة معلومات المنتج عبر المؤشر باستخدام (*itemPtr).member
// 6. قم بطباعة العناوين والتحقق منها
return 0;
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
1أساسيات المؤشرات
ما هو المؤشر؟الإعلان عن المؤشراتعامل العنوان (&)عامل إلغاء المرجعية (*)مؤشرات NULLمراجعة: أساسيات المؤشرات4مشروع: أداة نصوص بسيطة
نظرة عامة على المشروععد الأحرف2المؤشرات والمصفوفات
أسماء المصفوفات كمؤشراتعناصر المصفوفة - المؤشراتالعمليات الحسابية على المؤشراتمقارنة المؤشراتمراجعة: التنقل في المصفوفة باستخدام المؤشرات5المؤشرات والدوال
التمرير بالقيمةتمرير المؤشرات إلى الدوالتعديل المتغيرات عبر المؤشراتمثال كلاسيكي: التبديلتمرير المصفوفات إلى الدوالملخص: وسائط المؤشرات في الدوال8الهياكل والمؤشرات
المؤشرات إلى الهياكلعامل السهم (->)تمرير الهياكل بالقيمةتمرير مؤشرات الهياكلالتخصيص الديناميكي للهياكلمراجعة: تعديل الهياكل باستخدام المؤشرات11تحديات المراجعة النهائية
مراجعة: دمج السلاسل النصية الديناميكيمراجعة: مصفوفة من الـ Structsمراجعة: عداد تكرار الكلمات3مصفوفات الأحرف والسلاسل النصية
السلاسل النصية كمصفوفات charالمُنهي الصفري (Null Terminator)إدخال السلاسل النصية باستخدام scanfاستخدام strlen()استخدام strcpy()استخدام strcat()استخدام strcmp()مراجعة: دوال السلاسل النصية الأساسية