Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

عامل السهم (->)

جزء من قسم 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.

challenge icon

التحدي

سهل

قم بإنشاء برنامج بلغة C يوضح استخدام عامل السهم (arrow operator) للوصول إلى أعضاء الهيكل (struct members) من خلال المؤشرات. يجب أن يقوم برنامجك بما يلي:

  1. تعريف struct باسم Book يحتوي على الأعضاء التالية:
    • عدد صحيح id لتخزين معرف الكتاب
    • مصفوفة أحرف title بحجم 40 لتخزين عنوان الكتاب
    • مصفوفة أحرف author بحجم 30 لتخزين اسم المؤلف
    • عدد عشري price لتخزين سعر الكتاب
    • عدد صحيح pages لتخزين عدد الصفحات
  2. في الدالة الرئيسية (main function)، قم بإنشاء متغير من نوع Book باسم myBook
  3. قم بالتصريح عن مؤشر لهيكل Book باسم bookPtr
  4. قم بتعيين عنوان myBook إلى bookPtr
  5. اقرأ قيم المدخلات التالية وقم بتعيينها لأعضاء الهيكل باستخدام عامل السهم من خلال المؤشر:
    • اقرأ عدداً صحيحاً للمعرف (ID) وقم بتعيينه باستخدام bookPtr->id
    • اقرأ سلسلة نصية للعنوان وقم بتعيينها باستخدام bookPtr->title
    • اقرأ سلسلة نصية للمؤلف وقم بتعيينها باستخدام bookPtr->author
    • اقرأ عدداً عشرياً للسعر وقم بتعيينه باستخدام bookPtr->price
    • اقرأ عدداً صحيحاً للصفحات وقم بتعيينه باستخدام bookPtr->pages
  6. بعد قراءة جميع القيم، قم بإجراء العمليات التالية باستخدام عامل السهم:
    • تطبيق خصم بنسبة 10% على السعر: bookPtr->price = bookPtr->price * 0.9;
    • إضافة 50 صفحة إضافية (bonus pages): bookPtr->pages += 50;
  7. اطبع معلومات الكتاب باستخدام عامل السهم للوصول إلى كل عضو بهذا التنسيق الدقيق:
    • Book Information:
    • ID: [id]
    • Title: [title]
    • Author: [author]
    • Price: [price]
    • Pages: [pages]
  8. احسب واطبع السعر لكل صفحة باستخدام عامل السهم بالتنسيق التالي: 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;
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Logic & Flow