تمرير المصفوفات إلى الدوال
جزء من قسم Logic & Flow في رحلة C على Coddy — الدرس 29 من 63.
عندما تقوم بتمرير مصفوفة إلى دالة في لغة C، يحدث شيء مثير للاهتمام خلف الكواليس. فالمصفوفة نفسها لا يتم نسخها فعلياً إلى الدالة. بدلاً من ذلك، ما يتم تمريره هو مؤشر إلى العنصر الأول في المصفوفة.
هذا يعني أنه عندما تكتب معامل دالة مثل int arr[] أو int *arr، فإن كليهما متكافئان - كلاهما يمثلان مؤشراً إلى العنصر الأول في المصفوفة. تستقبل الدالة عنوان الذاكرة حيث تبدأ المصفوفة، مما يمنحها وصولاً مباشراً إلى بيانات المصفوفة الأصلية.
void printArray(int arr[], int size) {
// arr هو في الواقع مؤشر للعنصر الأول
// يمكن للدالة الوصول إلى المصفوفة الأصلية وتعديلها
}بما أن الدالة تعمل مع موقع الذاكرة الخاص بالمصفوفة الأصلية بدلاً من نسخة منها، فإن أي تغييرات يتم إجراؤها داخل الدالة ستؤثر على المصفوفة الأصلية. هذا يختلف عن تمرير المتغيرات الفردية، والذي ينشئ نسخاً.
ستلاحظ أيضًا أنك بحاجة إلى تمرير حجم المصفوفة كمعامل منفصل لأن الدالة لا يمكنها تحديد طول المصفوفة من المؤشر وحده.
التحدي
سهلاكتب برنامجاً بلغة C يوضح كيفية تمرير المصفوفات إلى الدوال من خلال إنشاء دالة تعالج بيانات درجات الحرارة. يجب أن يقوم برنامجك بما يلي:
- إنشاء دالة باسم
analyzeTemperaturesتأخذ مصفوفة من الأعداد الصحيحة وحجمها كمعاملات - داخل دالة
analyzeTemperatures، قم بحساب وطباعة متوسط درجة الحرارة بمنزلة عشرية واحدة بالضبط بالتنسيق:Average temperature: [value] - داخل دالة
analyzeTemperatures، ابحث عن أعلى درجة حرارة واطبعها بالتنسيق:Highest temperature: [value] - داخل دالة
analyzeTemperatures، قم بعدّ درجات الحرارة التي تزيد عن 25 درجة واطبع العدد بالتنسيق:Days above 25 degrees: [count] - في دالة
main، اقرأ عدداً صحيحاًnيمثل عدد قراءات درجات الحرارة - اقرأ
nمن قيم درجات الحرارة وقم بتخزينها في مصفوفة أعداد صحيحة - استدعِ دالة
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;
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
1أساسيات المؤشرات
ما هو المؤشر؟الإعلان عن المؤشراتعامل العنوان (&)عامل إلغاء المرجعية (*)مؤشرات NULLمراجعة: أساسيات المؤشرات4مشروع: أداة نصوص بسيطة
نظرة عامة على المشروععد الأحرف2المؤشرات والمصفوفات
أسماء المصفوفات كمؤشراتعناصر المصفوفة - المؤشراتالعمليات الحسابية على المؤشراتمقارنة المؤشراتمراجعة: التنقل في المصفوفة باستخدام المؤشرات5المؤشرات والدوال
التمرير بالقيمةتمرير المؤشرات إلى الدوالتعديل المتغيرات عبر المؤشراتمثال كلاسيكي: التبديلتمرير المصفوفات إلى الدوالملخص: وسائط المؤشرات في الدوال8الهياكل والمؤشرات
المؤشرات إلى الهياكلعامل السهم (->)تمرير الهياكل بالقيمةتمرير مؤشرات الهياكلالتخصيص الديناميكي للهياكلمراجعة: تعديل الهياكل باستخدام المؤشرات11تحديات المراجعة النهائية
مراجعة: دمج السلاسل النصية الديناميكيمراجعة: مصفوفة من الـ Structsمراجعة: عداد تكرار الكلمات3مصفوفات الأحرف والسلاسل النصية
السلاسل النصية كمصفوفات charالمُنهي الصفري (Null Terminator)إدخال السلاسل النصية باستخدام scanfاستخدام strlen()استخدام strcpy()استخدام strcat()استخدام strcmp()مراجعة: دوال السلاسل النصية الأساسية