الانتقال إلى المحتوى الرئيسي

كيفية نقل مصفوفة ديناميكية ثنائية الأبعاد إلى دالة ج في ج

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

المصفوفات ثنائية الأبعاد هي جداول تتكون من صفوف وأعمدة. لنقل مثل هذه المصفوفة إلى وظيفة ، يجب مراعاة العديد من الميزات. أولا ، من الضروري تحديد حجم المصفوفة داخل الوظيفة من أجل الوصول إلى عناصرها بشكل صحيح. ثانيا ، تجدر الإشارة إلى أن صفيف ديناميكي ثنائي الأبعاد يمثله مؤشر للمؤشرات.

لنقل مصفوفة ديناميكية ثنائية الأبعاد إلى دالة ، يمكنك استخدام المؤشرات إلى المؤشرات أو المؤشرات إلى المصفوفات. في الحالة الأولى ، تأخذ الدالة وسيطتين – مؤشر إلى مؤشر وحجم المصفوفة. في الحالة الثانية ، تأخذ الدالة وسيطتين-مؤشر إلى صفيف وحجم الصفيف.

  1. مشاكل نقل مصفوفة ديناميكية ثنائية الأبعاد إلى أ ج دالة في لغة ج
  2. مقرر
  3. باستخدام مؤشر إلى مؤشر
  4. سؤال وجواب
  5. كيف يمكنني تمرير مجموعة ديناميكية ثنائية الأبعاد إلى وظيفة?
  6. كيف يمكنني إنشاء مصفوفة ديناميكية ثنائية الأبعاد في ج?
  7. هل من الممكن لتمرير مجموعة ديناميكية ثنائية الأبعاد من حيث القيمة إلى وظيفة?
  8. كيف يمكنني تحرير الذاكرة من قبل مجموعة ديناميكية ثنائية الأبعاد المحتلة?
  9. هل من الممكن تغيير حجم مصفوفة ديناميكية ثنائية الأبعاد في وظيفة?

مشاكل نقل مصفوفة ديناميكية ثنائية الأبعاد إلى أ ج دالة في لغة ج

تمرير صفيف ديناميكي ثنائي الأبعاد إلى وظيفة قليلا من التحدي في اللغة ج. وذلك لأن المصفوفات ثنائية الأبعاد في ج هي مجموعة من المؤشرات إلى المصفوفات. عند تمرير صفيف إلى وظيفة ، كنت في الواقع تمرير مؤشر إلى العنصر الأول من الصفيف.

ومع ذلك ، عندما يتعلق الأمر صفائف ثنائية الأبعاد ، المؤشر إلى العنصر الأول هو بالفعل مؤشر إلى مجموعة من المؤشرات. لذلك ، من أجل نقل مصفوفة ديناميكية ثنائية الأبعاد إلى وظيفة ، عليك أن تضع في اعتبارك العديد من الفروق الدقيقة.

  1. نقل أحجام الصفيف: على عكس المصفوفات الثابتة ، لا تخزن المصفوفات الديناميكية معلومات حول أحجامها. لذلك ، عند تمرير مصفوفة ديناميكية ثنائية الأبعاد إلى دالة ، من الضروري تمرير أبعادها بشكل صريح حتى تعرف الوظيفة عدد العناصر التي يحتوي عليها كل بعد من المصفوفة.
  2. المؤشر إلى مصفوفة من المؤشرات: لتمرير مصفوفة ديناميكية ثنائية الأبعاد إلى دالة ، يجب عليك تمرير مؤشر إلى مصفوفة من المؤشرات. سيحتوي هذا المؤشر على عنوان العنصر الأول من مصفوفة المؤشر.

مثال على تمرير مصفوفة ديناميكية ثنائية الأبعاد إلى دالة:

نموذج التعليمات البرمجية:
}

}

// Вызов функции с передачей массива

printArray(arr, rows, cols);

  1. // Освобождение памяти

for (int i = 0; i < rows; i++) {

free(arr[i]);

}

free(arr);

return 0;

}

في هذا المثال ، تقبل وظيفة برينتراي مصفوفة ديناميكية ثنائية الأبعاد آر وأبعادها كمعلمات. تعرض الوظيفة محتويات المصفوفة على الشاشة.

لإنشاء وملء صفيف ، يتم استخدام مشغل مالوك لتخصيص الذاكرة. بعد استخدام المصفوفة ، من الضروري تحرير الذاكرة المخصصة باستخدام مجانا.

يمكن أن تنشأ مشاكل عندما لا يكون هناك تخصيص الذاكرة المناسبة أو عند العمل مع مؤشرات إلى صفائف من المؤشرات. لذلك ، من المهم توخي الحذر عند العمل مع المصفوفات الديناميكية ثنائية الأبعاد واتباع قواعد العمل بدقة مع المؤشرات في لغة سي.

مقرر

لتمرير مصفوفة ديناميكية ثنائية الأبعاد إلى دالة في ج ، يجب عليك استخدام مؤشر إلى مؤشر وتمرير أبعاد المصفوفة كوسيطات إلى الوظيفة.

في ما يلي مثال على دالة تقبل مصفوفة ديناميكية ثنائية الأبعاد:

باطلة ميفونكتيون (إنت** ميراي ، إنت الصفوف ، إنت كولز) {

// قم بإجراء عمليات باستخدام مصفوفة ثنائية الأبعاد

}

في هذا المثال ، تأخذ وظيفة ميفونكتيون مؤشر إلى مؤشر مياراي واثنين من صفوف الحجج الصحيحة و كولس لتحديد حجم الصفيف.

لنقل مصفوفة ديناميكية ثنائية الأبعاد إلى هذه الوظيفة ، اتبع الخطوات التالية:

خصص ذاكرة للمصفوفة في الجزء الرئيسي من البرنامج واملأها بالقيم:

الصفوف كثافة العمليات = 3;

كثافة العمليات الأعمدة = 3;

إنت * * مياراي = مالوك (الصفوف * سيزوف (إنت*));

ل (إنت أنا = 0 ؛ أنا < الصفوف ؛ أنا i) {

مياراي [أنا] = مالوك (كولز * سيزوف ( إنت));

  1. إلى عن على (الباحث ي = 0 ؛ ي < الأعمدة ؛ ي j) {
  2. مياراي [أنا] [ي] = أنا + ي;
  3. }

}

استدعاء الدالة عن طريق تمرير مصفوفة ديناميكية ثنائية الأبعاد وأبعادها:

ميفونكتيون (ميراي ، الصفوف ، كولز);

داخل وظيفة ميفونكتيون ، يمكنك إجراء عمليات مع صفيف ثنائي الأبعاد عن طريق الوصول إلى العناصر من خلال مؤشر إلى مؤشر:

باطلة ميفونكتيون (إنت** ميراي ، إنت الصفوف ، إنت كولز) {

ل (إنت أنا = 0 ؛ أنا < الصفوف ؛ أنا i) {

إلى عن على (الباحث ي = 0 ؛ ي < الأعمدة ؛ ي j) {

برينتف ("٪د " ، مياراي [ط] [ي]);

}

برينتف("

");

}

}

في هذا المثال ، تتكرر وظيفة ميفونكتيون من خلال جميع عناصر مصفوفة ثنائية الأبعاد وتخرج قيمها.

عند الانتهاء من العمل مع صفيف ثنائي الأبعاد ، تحتاج إلى تحرير الذاكرة المخصصة لذلك:

ل (إنت أنا = 0 ؛ أنا < الصفوف ؛ أنا i) {

مجانا (مياراي [أنا]);

}

مجانا (مياراي);

يؤدي استدعاء الوظيفة المجانية إلى تحرير الذاكرة المخصصة لكل صف من المصفوفة ، ثم تحرير الذاكرة المخصصة للمؤشر إلى المؤشر.

في هذا النموذج ، يمكنك نقل المصفوفات الديناميكية ثنائية الأبعاد إلى الوظائف وإجراء العمليات اللازمة معها.

باستخدام مؤشر إلى مؤشر

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

يتم استخدام مؤشر إلى مؤشر للعمل مع صفائف متغيرة الطول عندما يكون عدد الصفوف والأعمدة غير معروف مسبقا.

لإعلان مؤشر إلى مؤشر ، استخدم علامة نجمية مزدوجة وحدد نوع البيانات الذي سيشير إليه المؤشر:

كثافة العمليات * * صفيف;

لتمرير مؤشر إلى مؤشر إلى وظيفة ، يجب تحديد نوع بيانات المؤشر في إعلان المعلمة:

وظيفة باطلة (كثافة العمليات** صفيف);

عند نقل مصفوفة ديناميكية ثنائية الأبعاد إلى دالة ، يجب مراعاة النقاط التالية:

تخصيص الذاكرة للمصفوفة نفسها: أولا ، يتم تخصيص الذاكرة للمؤشر إلى المؤشر ، ثم لكل صف من المصفوفة.

إرسال صفيف حسب المرجع: يتم تمرير المؤشر إلى المؤشر إلى الدالة بحيث تؤثر التغييرات داخل الدالة على الصفيف الأصلي.

تحرير الذاكرة: بعد استخدام المصفوفة ، من الضروري تحرير الذاكرة المخصصة لها ، سواء بالنسبة للمؤشر إلى المؤشر ولكل صف.

Вот пример кода, демонстрирующего использование указателя на указатель:

#include

#include

void function(int** array, int rows, int cols) {

// Вывод значений массива в функции

for (int i = 0; i < rows; i++) {

for (int j = 0; j < cols; j++) {

printf("%d ", array[i][j]);

}

printf("

");

}

// Изменение значений массива в функции

for (int i = 0; i < rows; i++) {

for (int j = 0; j < cols; j++) {

array[i][j]++;

}

}

}

int main() {

int rows = 3;

int cols = 3;

// تخصيص الذاكرة للمؤشر إلى المؤشر

إنت * * صفيف = (إنت**)مالوك (الصفوف * سيزوف (إنت*));

// تخصيص الذاكرة لكل صف من المصفوفة

ل (إنت أنا = 0 ؛ أنا < الصفوف ؛ أنا i) {

صفيف [أنا] = (إنت*)مالوك(كولز * سيزوف (إنت));

ل (إنت أنا = 0 ؛ أنا < الصفوف ؛ أنا i) {

// قيم مصفوفة الإخراج قبل استدعاء الوظيفة

ل (إنت أنا = 0 ؛ أنا < الصفوف ؛ أنا i) {

إلى عن على (كثافة العمليات ي = 0 ؛ ي < الأعمدة; j++) {

printf("%d ", array[i][j]);

}

printf("

");

}

// Вызов функции

function(array, rows, cols);

// Вывод значений массива после вызова функции

for (int i = 0; i < rows; i++) {

for (int j = 0; j < cols; j++) {

printf("%d ", array[i][j]);