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

ما هي المصفوفة (Array)؟

المصفوفة (array) بنية بيانات تخزّن مجموعة من القيم من النوع نفسه في كتلة متصلة واحدة من الذاكرة. ويُوصَل إلى كل قيمة، وتُسمّى عنصرًا، برقم موقعها، ويُسمّى الفهرس (index)، ويبدأ من 0 في معظم اللغات.

بقلم Kevin Spektor, شريك مؤسس ورئيس قسم التكنولوجيا (CTO)

آخر تحديث 24 سبتمبر 2026

تطبيق الطقس الذي يعرض درجات حرارة الأسبوع يحتاج إلى سبعة أعداد. يمكنه استخدام سبعة متغيرات منفصلة، monday وtuesday وهكذا، لكن حينها لن تستطيع أي حلقة المرور عليها، وإضافة يوم ثامن تعني كتابة كود جديد. المصفوفة تضع الأعداد السبعة كلها تحت اسم واحد، temperatures، في خانات مرقّمة من 0 إلى 6.

كيف تعمل المصفوفة

تحتفظ المصفوفة بعناصرها متجاورة في كتلة واحدة من الذاكرة، وكل عنصر يشغل عدد البايتات نفسه. وهذا الترتيب يتيح للحاسوب إيجاد أي عنصر بعملية حسابية واحدة:

address of element i = start address + i × element size

لنفترض أن مصفوفة من الأعداد الصحيحة بحجم 32 بت (4 بايتات لكل عدد) تبدأ عند عنوان الذاكرة 1000. العنصر 0 عند 1000، والعنصر 1 عند 1004، والعنصر 2 عند 1008، والعنصر 3 عند 1012. والوصول إلى العنصر 3 أو العنصر 3,000,000 يستغرق الخطوة الواحدة نفسها، ولهذا تُسمّى قراءة المصفوفة بالفهرس عملية ذات زمن ثابت، وتُكتب O(1).

تخزّن وحدة array في Python الأعداد الخام بهذه الطريقة، فيمكنك التحقق من الحساب:

4 bytes per element
16 bytes in total
scores[0] = 90 at address 1000
scores[1] = 75 at address 1004
scores[2] = 88 at address 1008
scores[3] = 62 at address 1012

وتفسّر هذه الصيغة أيضًا سبب بدء العدّ من 0 في معظم اللغات. الفهرس إزاحة: عدد العناصر التي تتخطاها من البداية. العنصر الأول يبعد 0 عناصر عن البداية، لذا فهرسه 0، والعنصر الأخير في مصفوفة طولها n فهرسه n − 1. وبعض اللغات القليلة، مثل Lua وMATLAB وR وFortran، تبدأ من 1 بدلًا من ذلك.

استخدام المصفوفة في Python

معظم كود Python يستخدم النوع المدمج list كمصفوفة. تُنشئها بالأقواس المربعة، وتقرأ العناصر وتغيّرها بالفهرس، وتعرف طولها بالدالة len():

18
25
19
5
[18, 22, 25, 23, 19, 20]

الفهرس السالب يعدّ من النهاية، فـ temperatures[-1] هو العنصر الأخير. وهذا الاختصار خاص بـ Python؛ فلا توجد فهارس سالبة في C ولا Java.

كلفة العمليات على المصفوفة

الترتيب المتصل يجعل بعض العمليات سريعة وأخرى بطيئة. وتزداد الكلفة مع n، أي عدد العناصر:

العمليةمثال في Pythonالكلفة
قراءة عنصر أو تغييره بالفهرسa[3] = 7O(1)، خطوة واحدة
إضافة عنصر في النهايةa.append(7)O(1) في المتوسط
الإدراج أو الحذف في البدايةa.insert(0, 7)O(n)، كل عنصر يُزاح
البحث عن قيمة في مصفوفة غير مرتبة7 in aO(n)، يفحص العناصر واحدًا تلو الآخر
البحث عن قيمة في مصفوفة مرتبةالبحث الثنائيO(log n)

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

المرور على عناصر المصفوفة

المصفوفات والحلقات متلازمتان: الحلقة تزور كل عنصر بدوره، وهذا ما يُسمّى التكرار (iteration). والأسطر القليلة نفسها تتعامل مع مصفوفة من 5 عناصر أو من 5 ملايين عنصر.

Total: 28.5
Most expensive: 12.0

المصفوفات في اللغات الأخرى

في C، للمصفوفة حجم ثابت يُحدَّد عند الإعلان عنها، وتحمل قيمًا خامًا من نوع واحد. ويُبلغ sizeof عن حجمها بالبايتات:

int scores[5] = {90, 75, 88, 62, 100};   /* 5 × 4 bytes = 20 bytes */

مصفوفات Java أيضًا ذات طول ثابت، وتبدأ العناصر الجديدة بقيمة افتراضية مثل 0 للأعداد. وعندما تحتاج في Java إلى مصفوفة تكبر، تستخدم ArrayList:

int[] scores = new int[5];   // five elements, all 0
scores[0] = 90;

أما مصفوفات JavaScript فتكبر وتصغر بحرية ويمكن أن تخلط الأنواع، مثل [1, "two", true].

المصفوفات التي تكبر، مثل list في Python وArrayList في Java وstd::vector في C++، تُسمّى مصفوفات ديناميكية. وهي تحجز مساحة إضافية في نهايتها. وعندما تنفد هذه المساحة، تحجز كتلة أكبر، وتنسخ إليها كل العناصر، ثم تتابع. وعمليات النسخ هذه نادرة بما يكفي لتبقى الإضافة سريعة في المتوسط.

ويمكن للمصفوفة أيضًا أن تحمل مصفوفات أخرى. يقرأ grid[row][col] خلية واحدة من مصفوفة ثنائية الأبعاد، وهو الترتيب المستخدم في رقع الألعاب وجداول البيانات والصور. ويُظهر دليل C للمصفوفات متعددة الأبعاد كيف توضع في الذاكرة.

أخطاء شائعة

الخطأ بفارق واحد (off by one). المصفوفة ذات 3 عناصر فهارسها 0 و1 و2، فالفهرس 3 يقع بعد النهاية. وتتوقف Python مع خطأ:

IndexError: list index out of range

وتطلق Java الاستثناء ArrayIndexOutOfBoundsException، وتُرجع JavaScript بصمت undefined. أما C فلا تفحص شيئًا على الإطلاق: القراءة بعد النهاية سلوك غير معرَّف (undefined behavior)، قد يعيد قيمًا عشوائية أو يُسقط البرنامج مع خطأ التجزئة.

النسخ بالإسناد. في Python وJava وJavaScript، لا ينسخ b = a المصفوفة؛ فالاسمان يشيران إلى المصفوفة نفسها، وتغيير b يغيّر a. استخدم a.copy() في Python أو [...a] في JavaScript للحصول على نسخة حقيقية. وتشرح صفحة المتغير السبب.

إلى أين بعد ذلك

المصفوفة لا تفيد إلا مع حلقة تمر عليها، لذا اقرأ ما هو التكرار بعد ذلك، وما هو البايت لتعرف الوحدة وراء أحجام العناصر السابقة. ويشرح دليل القوائم في Python التقطيع والترتيب ودوال القوائم، ويُظهر التمثيل المرئي للقائمة المترابطة البنية التي تتخلى عن سرعة الوصول بالفهرس مقابل سرعة الإدراج.

الأسئلة الشائعة

ما هي المصفوفة في الرياضيات؟
في الرياضيات الابتدائية، المصفوفة مجموعة من الأشياء مرتبة في صفوف وأعمدة متساوية، مثل 3 صفوف في كل منها 4 نقاط. وتُستخدم لتوضيح الضرب: عدّ النقاط يعطي 3 × 4 = 12. والمصفوفة ثنائية الأبعاد في البرنامج هي الصورة نفسها، مع قيمة في كل موقع.
ما هو مثال على المصفوفة؟
قائمة درجات الحرارة في أسبوع، [18, 21, 25, 23, 19, 17, 20]، مصفوفة من سبعة أعداد، وtemperatures[0] هي قيمة يوم الاثنين. ومن الأمثلة اليومية الأخرى وحدات البكسل في صف من صورة، وأحرف سلسلة نصية، ونتائج اللاعبين في لوحة صدارة لعبة.
كيف أشرح المصفوفة لطفل؟
شبّهها بعلبة البيض. للعلبة اسم واحد، وفيها عدد ثابت من الخانات في صف، وكل خانة تحمل بيضة واحدة. تجد البيضة برقم خانتها، والمبرمجون يبدؤون عدّ الخانات من 0.
ماذا تحتوي المصفوفة؟
تحتوي المصفوفة على عناصر، وهي القيم المفردة المخزّنة فيها، كل منها في فهرسه الخاص. في C وJava تكون كل العناصر من النوع نفسه، مثل int كلها أو double كلها. أما قوائم Python ومصفوفات JavaScript فيمكن أن تخلط الأنواع، لأنها تخزّن مراجع إلى القيم بدلًا من القيم نفسها.
ما الفرق بين المصفوفة والقائمة؟
المصفوفة تخزّن عناصرها متجاورة في الذاكرة، لذا يمكن الوصول إلى أي عنصر مباشرة بفهرسه. أما القائمة المترابطة (linked list) فتخزّن كل عنصر منفصلًا مع مؤشر إلى العنصر التالي، فالوصول إلى العنصر رقم 1,000 يعني المرور على أول 999 عنصرًا. والنوع list المدمج في Python ليس قائمة مترابطة: إنه مصفوفة ديناميكية تكبر كلما أضفت عناصر.
Coddy programming languages illustration

تعلّم البرمجة مع Coddy

ابدأ الآن