كيف تعرف C أبعاد صفيف ديناميكي ثنائي الأبعاد في وظيفة؟
-
30-09-2019 - |
سؤال
رأيت هذا المثال عندما كنت أحاول معرفة كيفية تمرير المؤشرات إلى المصفوفات ثنائية الأبعاد مخصصة ديناميكيًا للوظائف:
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 اثنين من المؤشرات