مصفوفة (نوع البيانات)
في علوم الحاسوب ، تُعدّ المصفوفة نوعًا من أنواع البيانات التي تُمثّل مجموعة من العناصر ( قيم أو متغيرات )، يتم اختيار كل عنصر منها بواسطة فهرس واحد أو أكثر (مفاتيح تعريفية) يُمكن حسابها أثناء تشغيل البرنامج. تُسمى هذه المجموعة عادةً متغير مصفوفة أو قيمة مصفوفة . [1] قياسًا على المفهومين الرياضيين المتجه والمصفوفة ، تُسمى أنواع المصفوفات ذات الفهرس الواحد والمتجه والمصفوفة على التوالي . وبشكلٍ أعم، يُمكن تسمية نوع المصفوفة متعددة الأبعاد (أو المصفوفة ذات الأبعاد n ) بنوع الموتر ، قياسًا على المفهوم الرياضي للموتر . [ 2 ]
قد يشمل دعم اللغة لأنواع المصفوفات أنواع بيانات مصفوفات مدمجة ، وبعض البنى النحوية ( منشئات أنواع المصفوفات ) التي يمكن للمبرمج استخدامها لتعريف هذه الأنواع والإعلان عن متغيرات المصفوفة، بالإضافة إلى ترميز خاص لفهرسة عناصر المصفوفة. [ 1 ] على سبيل المثال، في لغة برمجة باسكال ، يُعرّف التصريح `<math> ` نوع بيانات مصفوفة جديدًا يُسمى `<math>` . ثم يُعرّف التصريح ` <math>` متغيرًا من هذا النوع، وهو عبارة عن مجموعة من ثمانية عناصر ، كل منها متغير عدد صحيح مُعرّف بفهرسين. في برنامج باسكال، يُرمز لهذه العناصر بـ ` <math> ` , ...typeMyTable=array[1..4,1..2]ofintegerMyTablevar A: MyTableAA[1,1]A[1,2]A[2,1]A[4,2]
تُعدّ القوائم الديناميكية أكثر شيوعًا وأسهل في التنفيذ من المصفوفات الديناميكية . وتتميز أنواع المصفوفات عن أنواع السجلات بشكل أساسي بإمكانية حساب مؤشرات العناصر أثناء التشغيل ، كما هو الحال في عملية إسناد باسكال . ومن بين مزاياها الأخرى، تسمح هذه الخاصية لعبارة تكرارية واحدة بمعالجة أي عدد من عناصر متغير المصفوفة.A[I,J] := A[N-I,2*J]
في سياقات نظرية أكثر، وخاصة في نظرية الأنواع وفي وصف الخوارزميات المجردة ، يشير مصطلحا "المصفوفة" و"نوع المصفوفة" أحيانًا إلى نوع بيانات مجرد (ADT) يسمى أيضًا المصفوفة المجردة أو قد يشير إلى مصفوفة ترابطية ، وهو نموذج رياضي يحتوي على العمليات الأساسية وسلوك نوع المصفوفة النموذجي في معظم اللغات - بشكل أساسي، مجموعة من العناصر التي يتم تحديدها بواسطة مؤشرات يتم حسابها في وقت التشغيل.
بحسب لغة البرمجة، قد تتداخل أنواع المصفوفات (أو تُعرّف مع) أنواع بيانات أخرى تصف تجميعات القيم، مثل القوائم والسلاسل النصية . غالبًا ما تُنفّذ أنواع المصفوفات باستخدام هياكل بيانات المصفوفات ، ولكن أحيانًا بوسائل أخرى، مثل جداول التجزئة ، أو القوائم المتصلة ، أو أشجار البحث .
تاريخ
تضمنت لغة البرمجة Superplan التي ابتكرها هاينز روتشاوزر (1949-1951) المصفوفات متعددة الأبعاد. ومع ذلك، فعلى الرغم من أن روتشاوزر وصف كيفية بناء مترجم للغته، إلا أنه لم يقم بتنفيذه.
لا تحتوي لغات التجميع واللغات منخفضة المستوى مثل BCPL [ 4 ] بشكل عام على دعم نحوي للمصفوفات.
نظراً لأهمية هياكل المصفوفات من أجل الحساب الفعال، فقد وفرت لغات البرمجة عالية المستوى الأولى، بما في ذلك FORTRAN (1957) و COBOL (1960) و Algol 60 (1960)، دعماً للمصفوفات متعددة الأبعاد.
المصفوفات المجردة
يمكن نمذجة بنية بيانات المصفوفة رياضياً كبنية بيانات مجردة ( مصفوفة مجردة ) مع عمليتين
- get ( A , I ) : البيانات المخزنة في عنصر المصفوفة A الذي تكونمؤشراته هي مجموعة الأعداد الصحيحة I.
- set ( A , I , V ) : المصفوفة الناتجة عن تعيين قيمة هذا العنصر إلى V .
هذه العمليات مطلوبة لتحقيق البديهيات [ 5 ]
- get ( set ( A , I , V ), I ) = V
- get ( set ( A , I , V ), J ) = get ( A , J ) if I ≠ J
لأي حالة مصفوفة A ، وأي قيمة V ، وأي أزواج I و J التي تم تعريف العمليات عليها.
تنص البديهية الأولى على أن كل عنصر يتصرف كمتغير. أما البديهية الثانية فتنص على أن العناصر ذات المؤشرات المختلفة تتصرف كمتغيرات منفصلة ، بحيث لا يؤثر تخزين قيمة في عنصر واحد على قيمة أي عنصر آخر.
لا تفرض هذه البديهيات أي قيود على مجموعة صفوف الفهرس الصالحة I ، وبالتالي يمكن استخدام هذا النموذج المجرد للمصفوفات المثلثية والمصفوفات الأخرى ذات الأشكال الغريبة.
التطبيقات
لتحقيق تنفيذ فعال لمتغيرات من أنواع مثل هياكل المصفوفات (مع استخدام المؤشرات في الفهرسة )، تقصر العديد من لغات البرمجة الفهارس على أنواع البيانات الصحيحة [ 6 ] [ 7 ] (أو أنواع أخرى يمكن تفسيرها كأعداد صحيحة، مثل البايتات وأنواع التعداد )، وتشترط أن تكون جميع العناصر من نفس نوع البيانات وحجم التخزين. كما تقيد معظم هذه اللغات كل فهرس بنطاق محدود من الأعداد الصحيحة، يظل ثابتًا طوال فترة صلاحية متغير المصفوفة. في بعض اللغات المترجمة ، قد يكون من الضروري معرفة نطاقات الفهارس وقت الترجمة .
من جهة أخرى، توفر بعض لغات البرمجة أنواع مصفوفات أكثر مرونة، تسمح بالفهرسة باستخدام قيم عشوائية، مثل الأعداد العشرية ، والسلاسل النصية ، والكائنات ، والمراجع ، وما إلى ذلك. لا يمكن تقييد قيم الفهرسة هذه بفترة محددة، ناهيك عن فترة ثابتة. لذا، تسمح هذه اللغات عادةً بإنشاء عناصر جديدة عشوائية في أي وقت. هذا الخيار يمنع تنفيذ أنواع المصفوفات كهياكل بيانات مصفوفات. أي أن هذه اللغات تستخدم صيغة شبيهة بالمصفوفات لتنفيذ دلالات مصفوفة ترابطية أكثر عمومية ، وبالتالي يجب تنفيذها باستخدام جدول تجزئة أو أي هيكل بيانات بحث آخر .
الدعم اللغوي
يكتب
تختلف لغات البرمجة في تعريف أنواع المصفوفات. على سبيل المثال، في لغة C، تُعتبر المصفوفة في الواقع كتلة من الذاكرة المتجاورة، والتي تُعامل أساسًا كمؤشر . [ 8 ] في مثل هذه الحالات، يمكن أن تتحول تعريفات المصفوفات إلى مؤشرات.
int a [ 10 ]; // مصفوفة 'a' مكونة من 10 أعداد صحيحة int * p = a ; // يشير 'p' إلى العنصر الأول من 'a'void foo ( int arr []) { // المعامل 'arr' هو مصفوفة من الأعداد الصحيحة // يتم تحويل 'arr' إلى مؤشر إلى العنصر الأول فيه }مع ذلك، في لغات أخرى، مثل جافا ، تُعتبر المصفوفة نوعًا فعليًا. فلكل نوع T، يوجد نوع مصفوفة مطابق له T[]، وهو عبارة عن كائن يحتوي على lengthحقل. [ 9 ]
int [] a = new int [ 5 ] ; // يُعلن عن مصفوفة 'a' تحتوي على 5 أعداد صحيحةالمصفوفات متعددة الأبعاد

يُطلق على عدد المؤشرات اللازمة لتحديد عنصر ما اسم بُعد أو بُعدية أو رتبة نوع المصفوفة. [ أ ]
هناك طريقتان شائعتان لدعم المصفوفات متعددة الأبعاد.
عن طريق تتبع المؤشر
تدعم العديد من لغات البرمجة المصفوفات أحادية البعد فقط. في هذه اللغات، تُمثَّل المصفوفة متعددة الأبعاد عادةً بمتجه إيليف ، وهو عبارة عن مصفوفة أحادية البعد تحتوي على مراجع لمصفوفات أصغر منها ببعد واحد. على وجه الخصوص، تُنفَّذ المصفوفة ثنائية الأبعاد كمتجه من المؤشرات إلى صفوفها. [ 10 ] وبالتالي، يُمكن الوصول إلى عنصر في الصف i والعمود j من المصفوفة A باستخدام الفهرسة المزدوجة ( في الترميز الشائع). تُمكّن هذه الطريقة في محاكاة المصفوفات متعددة الأبعاد من إنشاء مصفوفات غير منتظمة ، حيث قد يكون لكل صف حجم مختلف ، أو بشكل عام، حيث يعتمد النطاق الصالح لكل فهرس على قيم جميع الفهارس السابقة.A[i][j]
يُعدّ هذا التمثيل للمصفوفات متعددة الأبعاد شائعًا جدًا في برامج C و C++. مع ذلك، تستخدم C و C++ صيغة فهرسة خطية للمصفوفات متعددة الأبعاد التي تُصرّح بحجم ثابت وقت الترجمة، مثلاً باستخدام `______` أو `______ `، بدلاً من الصيغة التقليدية `______` . [ 11 ]inta[10][20]inta[m][n]int**a
قدّم معيار C99 أنواع المصفوفات ذات الطول المتغير، والتي تسمح بتعريف أنواع المصفوفات بأبعاد تُحسب أثناء التشغيل. يمكن إنشاء مصفوفة ديناميكية رباعية الأبعاد باستخدام مؤشر إلى مصفوفة رباعية الأبعاد، على سبيل المثال . يتم الوصول إلى العناصر الفردية عن طريق فك مرجعية مؤشر المصفوفة أولاً، ثم استخدام الفهرسة، على سبيل المثال . بدلاً من ذلك، يمكن تعريف المصفوفات ذات الأبعاد (n-1) كمؤشرات إلى عنصرها الأول، وهو مصفوفة (n-1) الأبعاد، على سبيل المثال، والوصول إليها باستخدام صيغة أكثر شيوعًا، على سبيل المثال .int(*arr)[t][u][v][w]=malloc(sizeof*arr);(*arr)[i][j][k][l]int(*arr)[u][v][w]=malloc(t*sizeof*arr);arr[i][j][k][l]
عن طريق الحوسبة
تسمح بعض لغات البرمجة بالحساب المباشر لمواقع العناصر. عادةً ما تُحاط قائمة الفهارس في اللغات التي تُتيح الحساب المباشر لمواقع العناصر بزوج واحد من المحددات، مثل (foo,bar,baz)( FORTRAN و PL/I ) و ( ALGOL 60 و Pascal )، بدلاً من وضع كل فهرس في زوج من المحددات . يختلف ترتيب تخزين عناصر المصفوفة بين اللغات، فمثلاً، تستخدم FORTRAN مصفوفات ذات ترتيب صفّي رئيسي، بينما تستخدم PL/I مصفوفات ذات ترتيب عمودي رئيسي.[foo,bar,baz][foo][bar][baz]
ترميز الفهرسة
تدعم معظم لغات البرمجة التي تدعم المصفوفات عمليات التخزين والاستعلام ، ولها صيغة خاصة للفهرسة. استخدمت اللغات القديمة الأقواس، مثلاً ، كما في لغة فورتران؛ بينما اختارت لغات أخرى الأقواس المربعة، مثلاً ، كما في لغة ألغول 60 ولغة باسكال (لتمييزها عن استخدام الأقواس لاستدعاء الدوال ).A(i,j)A[i,j]A[i][j]
أنواع الفهرسة
تُنفَّذ أنواع بيانات المصفوفات غالبًا على شكل هياكل مصفوفات: حيث تقتصر الفهارس على القيم الصحيحة (أو المرتبة ترتيبًا كليًا)، وتُحدَّد نطاقات الفهارس عند إنشاء المصفوفة، ويتم عنونة العناصر بشكل خطي متعدد. كان هذا هو الحال في معظم لغات "الجيل الثالث" ، ولا يزال كذلك في معظم لغات برمجة الأنظمة مثل Ada و C و C++ . مع ذلك، في بعض اللغات، تتخذ أنواع بيانات المصفوفات دلالات المصفوفات الترابطية، بفهارس من أي نوع وإنشاء عناصر ديناميكي. هذا هو الحال في بعض لغات البرمجة النصية مثل Awk و Lua ، وفي بعض أنواع المصفوفات التي توفرها مكتبات C++ القياسية .
التحقق من الحدود
تُجري بعض لغات البرمجة (مثل باسكال وموديولا) فحصًا للحدود عند كل عملية وصول، فتُصدر استثناءً أو تُنهي البرنامج إذا كان أي فهرس خارج نطاقه الصحيح. وقد تسمح المترجمات بتعطيل هذه الفحوصات لتحقيق سرعة أعلى على حساب الأمان. بينما تثق لغات أخرى (مثل فورتران وسي) بالمبرمج ولا تُجري أي فحوصات. كما قد تُحلل المترجمات الجيدة البرنامج لتحديد نطاق القيم المُحتملة للفهرس، وقد يُؤدي هذا التحليل إلى الاستغناء عن فحص الحدود .
فهرس الأصل
تُوفّر بعض لغات البرمجة، مثل لغة C، أنواع مصفوفات تبدأ من الصفر فقط ، حيث تكون القيمة الدنيا الصالحة لأي فهرس هي 0. [ 12 ] يُعدّ هذا الخيار مناسبًا لتنفيذ المصفوفات وحساب عناوينها. في لغة مثل C، يُمكن تعريف مؤشر إلى داخل أي مصفوفة، والذي سيعمل رمزيًا كمصفوفة وهمية تستوعب الفهارس السالبة. يعمل هذا فقط لأن لغة C لا تتحقق من الفهرس مقابل حدود المصفوفة عند استخدامه.
توفر لغات برمجة أخرى أنواع مصفوفات تبدأ من 1 فقط ، حيث يبدأ كل فهرس من 1؛ وهذا هو الاصطلاح التقليدي في الرياضيات للمصفوفات والمتتاليات الرياضية . تدعم بعض اللغات، مثل باسكال ولوا، أنواع مصفوفات تبدأ من n ، حيث يختار المبرمج الحد الأدنى للفهارس المسموح بها. وقد كانت مزايا كل خيار موضع نقاش حاد. يمكن للفهرسة التي تبدأ من الصفر تجنب أخطاء "الخطأ بمقدار واحد" أو أخطاء "العمود" . [ 13 ]
أعلى مؤشر
تختلف العلاقة بين الأرقام الواردة في تعريف المصفوفة وفهرس العنصر الأخير فيها باختلاف لغة البرمجة. ففي العديد من اللغات (مثل C)، يجب تحديد عدد العناصر الموجودة في المصفوفة؛ بينما في لغات أخرى (مثل Pascal و Visual Basic .NET ) يجب تحديد القيمة العددية لفهرس العنصر الأخير. ولا يوجد هذا التمييز في اللغات التي تبدأ فيها الفهارس من 1، مثل Lua .
جبر المصفوفات
تدعم بعض لغات البرمجة برمجة المصفوفات ، حيث تُعمَّم العمليات والدوال المُعرَّفة لأنواع بيانات مُحدَّدة ضمنيًا لتشمل مصفوفات من عناصر تلك الأنواع. بالتالي، يُمكن كتابة A + B لجمع العناصر المُتناظرة في مصفوفتين A و B. عادةً ما تُوفِّر هذه اللغات كلاً من الضرب العنصري وضرب المصفوفات القياسي في الجبر الخطي ، ويختلف أيٌّ منهما يُمثَّل بالمعامل * باختلاف اللغة.
انتشرت اللغات التي توفر إمكانيات برمجة المصفوفات بشكل واسع منذ ابتكارات لغة APL في هذا المجال . تُعد هذه الإمكانيات أساسية في لغات البرمجة المتخصصة مثل GAUSS و IDL و Matlab و Mathematica . كما أنها ميزة أساسية في اللغات الحديثة، مثل Julia والإصدارات الأخيرة من Fortran . وتُوفر هذه الإمكانيات أيضًا عبر مكتبات التوسعة القياسية للغات البرمجة العامة الأخرى (مثل مكتبة NumPy واسعة الانتشار في Python ).
أنواع السلاسل والمصفوفات
تُوفّر العديد من لغات البرمجة نوع بيانات نصي مُدمج ، مع رموز خاصة (" النصوص الحرفية ") لإنشاء قيم من هذا النوع. في بعض اللغات (مثل لغة C)، يكون النص مجرد مصفوفة من الأحرف، أو يُعالج بطريقة مشابهة. [ 14 ] بينما قد تُوفّر لغات أخرى، مثل باسكال ، عمليات مختلفة تمامًا للنصوص والمصفوفات.
استعلامات نطاق فهرس المصفوفة
تُوفّر بعض لغات البرمجة عمليات تُعيد حجم (عدد عناصر) متجه، أو بشكل أعم، نطاق كل عنصر من عناصر المصفوفة. في لغتي C و C++، لا تدعم المصفوفات هذه size()الوظيفة، لذا غالبًا ما يضطر المبرمجون إلى تعريف متغير منفصل لتخزين الحجم، وتمريره إلى الإجراءات كمعامل منفصل.
قد تحتوي عناصر المصفوفة التي تم إنشاؤها حديثًا على قيم غير محددة (كما هو الحال في لغة C)، أو قد يتم تعريفها لتكون لها قيمة "افتراضية" محددة مثل 0 أو مؤشر فارغ (كما هو الحال في لغة Java).
في لغة C++، يدعم std::vectorالكائن عمليات التخزين والاختيار والإلحاق مع خصائص الأداء المذكورة أعلاه. [ 15 ] يمكن الاستعلام عن حجم المتجهات وتغيير حجمها. كما تدعم اللغة عمليات أبطأ مثل إدراج عنصر في المنتصف .
التقطيع
تأخذ عملية تقطيع المصفوفة مجموعة فرعية من عناصر كيان من نوع مصفوفة (قيمة أو متغير) ثم تُجمّعها في كيان آخر من نوع مصفوفة، ربما بمؤشرات مختلفة. إذا تم تنفيذ أنواع المصفوفات كهياكل مصفوفة، فيمكن تنفيذ العديد من عمليات التقطيع المفيدة (مثل تحديد مصفوفة فرعية، أو تبديل المؤشرات، أو عكس اتجاهها) بكفاءة عالية من خلال معالجة متجه البيانات الخاص بالهيكل. تعتمد عمليات التقطيع الممكنة على تفاصيل التنفيذ: على سبيل المثال، تسمح لغة فورتران بتقطيع عمود واحد من متغير مصفوفة، ولكن ليس صفًا، والتعامل معه كمتجه.
من ناحية أخرى، تكون عمليات التقطيع الأخرى ممكنة عندما يتم تنفيذ أنواع المصفوفات بطرق أخرى.
تغيير الحجم
تسمح بعض اللغات بالمصفوفات الديناميكية (وتسمى أيضًا قابلة لتغيير الحجم أو قابلة للتوسيع): متغيرات المصفوفة التي يمكن توسيع نطاقات فهارسها في أي وقت بعد إنشائها، دون تغيير قيم عناصرها الحالية.
بالنسبة للمصفوفات أحادية البعد، يمكن توفير هذه الخاصية كعملية تزيد حجم المصفوفة A بمقدار واحد، ثم تُعيّن قيمة العنصر الأخير إلى x . أما أنواع المصفوفات الأخرى (مثل سلاسل باسكال) فتُوفّر عامل دمج، يُمكن استخدامه مع التقطيع لتحقيق هذا التأثير وأكثر. في بعض اللغات، يؤدي تعيين قيمة لعنصر في مصفوفة إلى توسيع المصفوفة تلقائيًا، إذا لزم الأمر، لتشمل ذلك العنصر. في أنواع أخرى من المصفوفات، يُمكن استبدال التقطيع بمصفوفة ذات حجم مختلف، مع إعادة ترقيم العناصر اللاحقة وفقًا لذلك - كما هو الحال في تعيين قائمة بايثون ، الذي يُدرج ثلاثة عناصر جديدة (10، 20، و30) قبل العنصر " A [5]". تُشبه المصفوفات القابلة لتغيير الحجم القوائم من حيث المفهوم ، ويُعتبر المفهومان مترادفين في بعض اللغات.append(A,x) A[5:5] = [10,20,30]
يمكن تنفيذ المصفوفة القابلة للتوسيع كمصفوفة ثابتة الحجم، مع عداد يسجل عدد العناصر المستخدمة فعليًا. appendتُزيد العملية قيمة العداد فقط؛ إلى أن تُستخدم المصفوفة بأكملها، وعندها appendيمكن تحديد فشل العملية. هذا تطبيق لمصفوفة ديناميكية ذات سعة ثابتة، كما هو الحال في stringنوع باسكال. بدلاً من ذلك، appendيمكن للعملية إعادة تخصيص مساحة أكبر للمصفوفة الأساسية، ونسخ العناصر القديمة إلى المساحة الجديدة.
انظر أيضاً
ملحوظات
- ↑ يتعارض هذا المصطلح مع مفهوم البُعد في الجبر الخطي، الذي يُعبّر عن شكل المصفوفة . لذا، يُقال إن مصفوفة من الأرقام ذات 5 صفوف و4 أعمدة، أي 20 عنصرًا، لها بُعد 2 في سياقات الحوسبة، لكنها تُمثّل مصفوفة يُقال إنها ذات بُعد 4×5. كما يتعارض معنى "الرتبة" في علوم الحاسوب مع مفهوم رتبة الموتر ، وهو تعميم لمفهوم رتبة المصفوفة في الجبر الخطي .
مراجع
- 1 2 روبرت دبليو. سيبستا (2001) مفاهيم لغات البرمجة . أديسون-ويسلي. الطبعة الرابعة (1998)، الطبعة الخامسة (2001)، رقم ISBN 9780201385960
- ↑ "مقدمة إلى الموترات | TensorFlow Core" . TensorFlow .
- ↑ ك. جنسن ونيكلاوس ويرث، دليل مستخدم وتقرير باسكال . سبرينغر. طبعة ورقية (2007) 184 صفحة، رقم ISBN 978-3540069508
- ↑ جون ميتشل، مفاهيم لغات البرمجة . مطبعة جامعة كامبريدج.
- ↑ لوكهام، سوزوكي (1979)، "التحقق من عمليات المصفوفات والسجلات والمؤشرات في باسكال". معاملات ACM في لغات البرمجة والأنظمة 1 (2)، 226 – 244.
- ↑ ديتيل، هارفي م.؛ ديتيل، بول ج. (2005). لغة سي شارب للمبرمجين . برنتيس هول بروفيشنال. ص 303. ISBN 978-0-13-246591-5تم الاطلاع عليه بتاريخ 22 مايو 2024 .
- ↑ فريزن، جيف (5 مارس 2014). تعلم جافا لتطوير تطبيقات أندرويد: إصدار جافا 8 وأندرويد 5. دار نشر أبريس. ص 56. ISBN 978-1-4302-6455-2تم الاطلاع عليه بتاريخ 22 مايو 2024 .
- ↑ "تعريف المصفوفة" . cppreference.com . cppreference . تم الاطلاع عليه بتاريخ 15 نوفمبر 2025 .
- ↑ "المصفوفات (دروس جافا)" . docs.oracle.com . شركة أوراكل . تم الاطلاع عليه بتاريخ 15 نوفمبر 2025 .
- ↑ فان دير ليندن، بيتر (1994). برمجة لغة سي الاحترافية: أسرار لغة سي العميقة . إنجلوود كليفس، نيوجيرسي: دار نشر صن سوفت. رقم ISBN 978-0-13-177429-2.
- ↑ برايان دبليو. كيرنيغان ودينيس إم. ريتشي (1988)، لغة البرمجة سي . برنتيس هول، ص 81.
- ↑ كيرنيغان، برايان دبليو؛ ريتشي، دينيس إم. (1988). لغة البرمجة سي ( الطبعة الثانية). إنجلوود كليفس، نيوجيرسي: برنتيس هول. ص 24. ISBN 978-0-13-110370-2.
- ↑ إدسكار دبليو. ديكسترا ، " لماذا يجب أن يبدأ الترقيم من الصفر "
- ↑ "سلاسل البايت المنتهية بـ NULL" . cppreference.com . cppreference.com . تم الاطلاع عليه بتاريخ 15 نوفمبر 2025 .
- ↑ "std::vector" . cppreference.com . cppreference.com . تم الاطلاع عليه بتاريخ 15 نوفمبر 2025 .
روابط خارجية
- المصفوفات
- أنواع البيانات
- أنواع البيانات المركبة
