عامل السهم (->)
جزء من قسم Logic & Flow في رحلة C على Coddy — الدرس 45 من 63.
عند العمل مع المؤشرات إلى الهياكل (structs)، يتطلب الوصول إلى أعضاء الهيكل بناء جملة خاصاً. وبينما يمكنك استخدام عامل إلغاء المرجعية (dereference operator) وتدوين النقطة (dot notation) معاً، توفر لغة C عاملاً أكثر ملاءمة خصيصاً لهذا الغرض: وهو عامل السهم (arrow operator) (->).
يتيح لك عامل السهم الوصول إلى أعضاء الـ struct من خلال مؤشر بطريقة نظيفة وقابلة للقراءة:
ptr->memberهذا يعادل كتابة (*ptr).member، ولكنه أكثر إيجازاً بكثير.
إليك كيف يعمل ذلك من الناحية العملية:
struct Point p1 = {10, 20};
struct Point *ptr = &p1;
// استخدام عامل السهم
printf("x = %d, y = %d\n", ptr->x, ptr->y);
// هذا يعادل:
printf("x = %d, y = %d\n", (*ptr).x, (*ptr).y);يجعل عامل السهم الكود الخاص بك أكثر نظافة وأسهل في القراءة، خاصة عند التعامل مع هياكل البيانات المعقدة. وهي الطريقة القياسية للوصول إلى أعضاء struct من خلال المؤشرات (pointers) في برمجة C.
التحدي
سهلقم بإنشاء برنامج بلغة C يوضح استخدام عامل السهم (arrow operator) للوصول إلى أعضاء الهيكل (struct members) من خلال المؤشرات. يجب أن يقوم برنامجك بما يلي:
- تعريف
structباسمBookيحتوي على الأعضاء التالية:- عدد صحيح
idلتخزين معرف الكتاب - مصفوفة أحرف
titleبحجم 40 لتخزين عنوان الكتاب - مصفوفة أحرف
authorبحجم 30 لتخزين اسم المؤلف - عدد عشري
priceلتخزين سعر الكتاب - عدد صحيح
pagesلتخزين عدد الصفحات
- عدد صحيح
- في الدالة الرئيسية (main function)، قم بإنشاء متغير من نوع
BookباسمmyBook - قم بالتصريح عن مؤشر لهيكل
BookباسمbookPtr - قم بتعيين عنوان
myBookإلىbookPtr - اقرأ قيم المدخلات التالية وقم بتعيينها لأعضاء الهيكل باستخدام عامل السهم من خلال المؤشر:
- اقرأ عدداً صحيحاً للمعرف (ID) وقم بتعيينه باستخدام
bookPtr->id - اقرأ سلسلة نصية للعنوان وقم بتعيينها باستخدام
bookPtr->title - اقرأ سلسلة نصية للمؤلف وقم بتعيينها باستخدام
bookPtr->author - اقرأ عدداً عشرياً للسعر وقم بتعيينه باستخدام
bookPtr->price - اقرأ عدداً صحيحاً للصفحات وقم بتعيينه باستخدام
bookPtr->pages
- اقرأ عدداً صحيحاً للمعرف (ID) وقم بتعيينه باستخدام
- بعد قراءة جميع القيم، قم بإجراء العمليات التالية باستخدام عامل السهم:
- تطبيق خصم بنسبة 10% على السعر:
bookPtr->price = bookPtr->price * 0.9; - إضافة 50 صفحة إضافية (bonus pages):
bookPtr->pages += 50;
- تطبيق خصم بنسبة 10% على السعر:
- اطبع معلومات الكتاب باستخدام عامل السهم للوصول إلى كل عضو بهذا التنسيق الدقيق:
Book Information:ID: [id]Title: [title]Author: [author]Price: [price]Pages: [pages]
- احسب واطبع السعر لكل صفحة باستخدام عامل السهم بالتنسيق التالي:
Price per page: [price_per_page]
يختبر هذا التحدي فهمك لعامل السهم للوصول إلى أعضاء الهيكل من خلال المؤشرات. ستتدرب على استخدام صيغة ptr->member لكل من القراءة من أعضاء الهيكل والكتابة إليها، مما يوضح أنها تعادل (*ptr).member ولكنها أكثر ملاءمة وقابلية للقراءة.
ورقة مرجعية
يوفر عامل السهم (->) طريقة ملائمة للوصول إلى أعضاء الـ struct من خلال مؤشر:
ptr->memberهذا مكافئ لـ (*ptr).member ولكنه أكثر اختصاراً ووضوحاً.
مثال على الاستخدام:
struct Point p1 = {10, 20};
struct Point *ptr = &p1;
// استخدام عامل السهم
printf("x = %d, y = %d\n", ptr->x, ptr->y);
// هذا مماثل لـ:
printf("x = %d, y = %d\n", (*ptr).x, (*ptr).y);جرّب بنفسك
#include <stdio.h>
#include <string.h>
// TODO: قم بتعريف هيكل الكتاب (Book struct) هنا
int main() {
// TODO: قم بإنشاء متغير من نوع Book باسم myBook
// TODO: قم بتعريف مؤشر إلى Book باسم bookPtr
// TODO: قم بتعيين عنوان myBook إلى bookPtr
// قراءة قيم المدخلات
int id;
char title[40];
char author[30];
float price;
int pages;
scanf("%d", &id);
scanf("%s", title);
scanf("%s", author);
scanf("%f", &price);
scanf("%d", &pages);
// TODO: قم بتعيين قيم المدخلات لأعضاء الهيكل باستخدام عامل السهم (arrow operator)
// TODO: قم بتطبيق خصم 10% على السعر باستخدام عامل السهم (arrow operator)
// TODO: قم بإضافة 50 صفحة إضافية باستخدام عامل السهم (arrow operator)
// TODO: قم بطباعة معلومات الكتاب باستخدام عامل السهم (arrow operator)
// TODO: قم بحساب وطباعة السعر لكل صفحة باستخدام عامل السهم (arrow operator)
return 0;
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
1أساسيات المؤشرات
ما هو المؤشر؟الإعلان عن المؤشراتعامل العنوان (&)عامل إلغاء المرجعية (*)مؤشرات NULLمراجعة: أساسيات المؤشرات4مشروع: أداة نصوص بسيطة
نظرة عامة على المشروععد الأحرف2المؤشرات والمصفوفات
أسماء المصفوفات كمؤشراتعناصر المصفوفة - المؤشراتالعمليات الحسابية على المؤشراتمقارنة المؤشراتمراجعة: التنقل في المصفوفة باستخدام المؤشرات5المؤشرات والدوال
التمرير بالقيمةتمرير المؤشرات إلى الدوالتعديل المتغيرات عبر المؤشراتمثال كلاسيكي: التبديلتمرير المصفوفات إلى الدوالملخص: وسائط المؤشرات في الدوال8الهياكل والمؤشرات
المؤشرات إلى الهياكلعامل السهم (->)تمرير الهياكل بالقيمةتمرير مؤشرات الهياكلالتخصيص الديناميكي للهياكلمراجعة: تعديل الهياكل باستخدام المؤشرات11تحديات المراجعة النهائية
مراجعة: دمج السلاسل النصية الديناميكيمراجعة: مصفوفة من الـ Structsمراجعة: عداد تكرار الكلمات3مصفوفات الأحرف والسلاسل النصية
السلاسل النصية كمصفوفات charالمُنهي الصفري (Null Terminator)إدخال السلاسل النصية باستخدام scanfاستخدام strlen()استخدام strcpy()استخدام strcat()استخدام strcmp()مراجعة: دوال السلاسل النصية الأساسية