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

تمرير المصفوفات إلى الدوال

جزء من قسم Logic & Flow في رحلة C على Coddy — الدرس 29 من 63.

عندما تقوم بتمرير مصفوفة إلى دالة في لغة C، يحدث شيء مثير للاهتمام خلف الكواليس. فالمصفوفة نفسها لا يتم نسخها فعلياً إلى الدالة. بدلاً من ذلك، ما يتم تمريره هو مؤشر إلى العنصر الأول في المصفوفة.

هذا يعني أنه عندما تكتب معامل دالة مثل int arr[] أو int *arr، فإن كليهما متكافئان - كلاهما يمثلان مؤشراً إلى العنصر الأول في المصفوفة. تستقبل الدالة عنوان الذاكرة حيث تبدأ المصفوفة، مما يمنحها وصولاً مباشراً إلى بيانات المصفوفة الأصلية.

void printArray(int arr[], int size) {
    // arr هو في الواقع مؤشر للعنصر الأول
    // يمكن للدالة الوصول إلى المصفوفة الأصلية وتعديلها
}

بما أن الدالة تعمل مع موقع الذاكرة الخاص بالمصفوفة الأصلية بدلاً من نسخة منها، فإن أي تغييرات يتم إجراؤها داخل الدالة ستؤثر على المصفوفة الأصلية. هذا يختلف عن تمرير المتغيرات الفردية، والذي ينشئ نسخاً.

ستلاحظ أيضًا أنك بحاجة إلى تمرير حجم المصفوفة كمعامل منفصل لأن الدالة لا يمكنها تحديد طول المصفوفة من المؤشر وحده.

challenge icon

التحدي

سهل

اكتب برنامجاً بلغة C يوضح كيفية تمرير المصفوفات إلى الدوال من خلال إنشاء دالة تعالج بيانات درجات الحرارة. يجب أن يقوم برنامجك بما يلي:

  1. إنشاء دالة باسم analyzeTemperatures تأخذ مصفوفة من الأعداد الصحيحة وحجمها كمعاملات
  2. داخل دالة analyzeTemperatures، قم بحساب وطباعة متوسط درجة الحرارة بمنزلة عشرية واحدة بالضبط بالتنسيق: Average temperature: [value]
  3. داخل دالة analyzeTemperatures، ابحث عن أعلى درجة حرارة واطبعها بالتنسيق: Highest temperature: [value]
  4. داخل دالة analyzeTemperatures، قم بعدّ درجات الحرارة التي تزيد عن 25 درجة واطبع العدد بالتنسيق: Days above 25 degrees: [count]
  5. في دالة main، اقرأ عدداً صحيحاً n يمثل عدد قراءات درجات الحرارة
  6. اقرأ n من قيم درجات الحرارة وقم بتخزينها في مصفوفة أعداد صحيحة
  7. استدعِ دالة analyzeTemperatures، مع تمرير المصفوفة وحجمها

يجب أن يعالج برنامجك بيانات درجات الحرارة ويعرض نتائج التحليل. على سبيل المثال، إذا كان المدخل هو:

5
20 28 15 32 26

يجب أن يكون المخرج:

Average temperature: 24.2
Highest temperature: 32
Days above 25 degrees: 3

يوضح هذا التحدي كيفية تمرير المصفوفات إلى الدوال كمؤشرات (pointers) إلى عنصرها الأول، مما يسمح للدالة بالوصول إلى جميع عناصر المصفوفة الأصلية ومعالجتها دون إنشاء نسخة منها.

ورقة مرجعية

عند تمرير المصفوفات إلى الدوال في لغة C، لا يتم نسخ المصفوفة نفسها. بدلاً من ذلك، يتم تمرير مؤشر إلى العنصر الأول.

كل من int arr[] و int *arr هما معلمات دالة متكافئة - فهما يمثلان مؤشراً للعنصر الأول:

void printArray(int arr[], int size) {
    // arr هو في الواقع مؤشر للعنصر الأول
    // يمكن للدالة الوصول إلى المصفوفة الأصلية وتعديلها
}

نقاط رئيسية:

  • تستقبل الدوال عنوان الذاكرة حيث تبدأ المصفوفة
  • التغييرات التي يتم إجراؤها داخل الدالة تؤثر على المصفوفة الأصلية
  • يجب تمرير حجم المصفوفة كمعلمة منفصلة لأن الدالة لا يمكنها تحديد الطول من المؤشر وحده

جرّب بنفسك

#include <stdio.h>

// TODO: قم بإنشاء دالة analyzeTemperatures هنا

int main() {
    // قراءة عدد قراءات درجات الحرارة
    int n;
    scanf("%d", &n);
    
    // التصريح عن مصفوفة لتخزين درجات الحرارة
    int temperatures[n];
    
    // قراءة قيم درجات الحرارة
    for (int i = 0; i < n; i++) {
        scanf("%d", &temperatures[i]);
    }
    
    // TODO: قم باستدعاء دالة analyzeTemperatures هنا
    
    return 0;
}
quiz iconاختبر نفسك

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

جميع دروس Logic & Flow