سؤال

رأيت هذا المثال عندما كنت أحاول معرفة كيفية تمرير المؤشرات إلى المصفوفات ثنائية الأبعاد مخصصة ديناميكيًا للوظائف:

void zeroit(int **array, int nrows, int ncolumns)
 {
 int i, j;
 for(i = 0; i < nrows; i++)
  {
  for(j = 0; j < ncolumns; j++)
   array[i][j] = 0;
  }
 }

جربته وهو يعمل ، لكنني لا أفهم كيف. كيف تحسب وظيفة "Zeroit" العنوان الصحيح؟

هل كانت مفيدة؟

نصائح أخرى

لا يلزم حساب. تصل وظيفتك "Zeroit" إلى عدد صحيح من خلال "عدم التوجيه المزدوج".

"int ** Array" ليست في الحقيقة مصفوفة من الأعداد الصحيحة. إنه بالضبط "مؤشر على المؤشرات على عدد صحيح" - أكثر متجهات من ناقلات الأعداد الصحيحة. عند الوصول إلى "Array [i] (أول توجيه) ، ستحصل على "int *" ، أي عنوان ناقل ITH من الأعداد الصحيحة. عند الوصول إلى "Array [i] [j] (عدم التوجيه الثاني) ، ستحصل على "int" ، أي عدد صحيح JTH من متجه ITH.

إذا كانت "صفيف 2D" مجرد مجموعة من المؤشرات على الصفوف الفردية ، فإنها تحسب العنوان الصحيح لمجرد البحث عن عنوان الصف ثم تطبيق إزاحة عليه. ومع ذلك ، هذه طريقة غير فعالة للغاية لتنفيذ "صفيف ثنائي الأبعاد". أفضل طريقة هي ببساطة استخدام المصفوفات العادية ذات الأبعاد وحساب الفهرس بنفسك بالضرب والإضافة ، ولكن في C99 ، يمكنك أيضًا استخدام دلالات VLA لتعامله المترجم مثل صفيف ثنائي الأبعاد حقيقي.

إذا كنت تفكر في تخطيط الذاكرة/العناوين أدناه:

array     =  |10|11|12|

array[0]  =  |20|21|22|

array[1]  =  |30|31|32|

تحتوي الخلية 10 على مؤشر للخلية 20 ، والخلية 11 تحتوي على مؤشر إلى 30 array هو تسلسل عرض كلمة متسلسل للمؤشرات إلى صفائف من ints ، ليست هناك حاجة لحساب ، فقط dereference اثنين من المؤشرات

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top