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

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

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

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

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

[3] [4];

في هذا المثال ، يتم إنشاء مصفوفة أر ثنائية الأبعاد مع 3 صفوف و 4 أعمدة.

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

إنت * * آر;

الصفوف كثافة العمليات = 3 ، الأعمدة = 4;

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

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

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

}

في هذا المثال ، يتم إنشاء مصفوفة أر ثنائية الأبعاد مع 3 صفوف و 4 أعمدة ، ثم يتم تخصيص ذاكرة لكل صف لتخزين البيانات.

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

المفاهيم الأساسية

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

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

  • بعد الصفيف: يحدد عدد الصفوف والأعمدة في الصفيف. على سبيل المثال ، يحتوي صفيف ثنائي الأبعاد 3 في 4 على 3 صفوف و 4 أعمدة.
  • عنصر الصفيف: هذه قيمة منفصلة يتم تخزينها في خلية صفيف. كل عنصر من عناصر المصفوفة له إحداثياته الخاصة-فهارس الصف والعمود.
  • الفهرسة: طريقة الوصول إلى عناصر المصفوفة. في ج ، تبدأ الفهرسة من 0 ، وبالتالي فإن العنصر الأول من المصفوفة يحتوي على فهرس 0 ، والعنصر الثاني يحتوي على فهرس 1 ، وما إلى ذلك.
  • وظيفة.
  • .

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

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

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

  1. تحديد المتغيرات التي تخزن عدد الصفوف والأعمدة في صفيف;
  2. تخصيص الذاكرة لمجموعة;
  3. استخدم الحلقات لتهيئة قيم عناصر المصفوفة.

Пример объявления и инициализации двумерного динамического массива:

#include 

#include

int main() {

int rows, cols;

int** array;

printf("Введите количество строк: ");

scanf("%d", &rows);

printf("Введите количество столбцов: ");

scanf("%d", &cols);

// Выделение памяти под массив

array = (int**)malloc(rows * sizeof(int*));

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

array[i] = (int*)malloc(cols * sizeof(int));

}

// Инициализация значений элементов массива

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

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

array[i][j] = i + j;

}

}

// Вывод значений элементов массива

printf("Значения элементов массива:

");

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++) {

free(array[i]);

}

free(array);

return 0;

}

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

تخصيص الذاكرة لصفيف ديناميكي ثنائي الأبعاد

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

لتخصيص الذاكرة لمجموعة ثنائية الأبعاد ، استخدم وظيفة مالوك () ، والذي يسمح لك لطلب كتلة ديناميكية من الذاكرة من حجم معين. ويعلن على النحو التالي:

نوع * * بتر;

حيث النوع هو نوع البيانات من عناصر الصفيف ، و بتر هو مؤشر إلى مؤشر نوع البيانات التي تحتوي على عنوان بداية الصفيف.

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

بتر = (نوع**) مالوك (صف * حجم (نوع*));

حيث الصف هو عدد الصفوف في المصفوفة. الآن يشير مؤشر بتر إلى منطقة الذاكرة حيث توجد مؤشرات لكل صف.

بعد ذلك ، تحتاج إلى تخصيص ذاكرة لكل صف من المصفوفة. يتم تخصيص البيانات باستخدام وظيفة مالوك (). مثال على تخصيص الذاكرة لكل صف:

إلى عن على (كثافة العمليات أنا = 0; أنا < صف; أنا i) {

 

}

حيث العقيد هو عدد الأعمدة في المصفوفة. الآن كل عنصر من عناصر بتر[أنا] يخزن عنوان بداية السطر الأول.

الآن ، المصفوفة الديناميكية ثنائية الأبعاد جاهزة للاستخدام ويمكنك تعيين قيم لعناصرها. تستخدم فهارس الصفوف والأعمدة للوصول إلى عناصر المصفوفة. مثال:

بتر [أنا] [ي] = القيمة;

حيث أنا هو مؤشر الصف ، ي هو مؤشر العمود ، والقيمة هي القيمة لتعيين.

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

إلى عن على (كثافة العمليات أنا = 0; أنا < صف; أنا i) {

 

}

مجانا (بتر);

هذا يسمح لك لتحرير الذاكرة المخصصة للسلاسل وللمصفوفة نفسها بشكل صحيح.

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

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

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

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

الصفوف كثافة العمليات = 3 ؛ / / عدد الصفوف

عدد الأعمدة = 4 ؛ / / عدد الأعمدة

الباحث * * صفيف ؛ / / مؤشر لمجموعة

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

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

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

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

}

وبالتالي ، نقوم بإنشاء مصفوفة ديناميكية تتكون من 3 صفوف و 4 أعمدة.

  1. تهيئة عناصر الصفيف بالقيم المطلوبة. على سبيل المثال:

صفيف [0] [0] = 1;

صفيف [0] [1] = 2;

صفيف [0] [2] = 3;

صفيف [0] [3] = 4;

صفيف [1] [0] = 5;

صفيف [1] [1] = 6;

صفيف [1] [2] = 7;

صفيف [1] [3] = 8;

صفيف [2] [0] = 9;

صفيف [2] [1] = 10;

صفيف [2] [2] = 11;

صفيف [2] [3] = 12;

يحتوي الصفيف الآن على العناصر التالية:

1234
5678
9101112

بعد الانتهاء من العمل مع المصفوفة ، تحتاج إلى تحرير الذاكرة المخصصة لها باستخدام الوظيفة المجانية (). على سبيل المثال:

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

مجانا (صفيف [أنا]);

}

مجانا (صفيف);

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

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

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

1. الوصول إلى العناصر:

للوصول إلى عناصر مصفوفة ديناميكية ثنائية الأبعاد ، يجب عليك تحديد فهارس العنصر المطلوب. يشار إلى الفهارس بين قوسين مربعين مفصولة بفواصل. على سبيل المثال ، للحصول على قيمة عنصر مع إحداثيات (أنا ، ي) ، يتم استخدام الإدخال التالي: صفيف[أنا][ي].

2. تغيير العناصر:

لتغيير قيمة عنصر من مصفوفة ديناميكية ثنائية الأبعاد ، استخدم عامل التعيين. على سبيل المثال ، لتعيين قيمة جديدة لعنصر مع إحداثيات (أنا ، ي) ، تحتاج إلى كتابة السطر التالي من التعليمات البرمجية: صفيف [أنا] [ي] = نيوفالو;

3. قراءة العناصر:

لقراءة عناصر مصفوفة ديناميكية ثنائية الأبعاد ، يتم استخدام عامل الوصول إلى العنصر. يقوم هذا المشغل بإرجاع قيمة العنصر ، والتي يمكن تخزينها في متغير أو استخدامها مباشرة في رمز البرنامج. على سبيل المثال ، لقراءة قيمة عنصر مع إحداثيات (أنا ، ي) ، يمكنك استخدام التعليمات البرمجية التالية: القيمة = صفيف [أنا] [ي];

4. التكرار حسب العناصر:

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

# تشمل 

كثافة العمليات الرئيسية () {

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

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

// Создание и заполнение двумерного динамического массива

int **array = (int **)malloc(rows * sizeof(int *));

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

array[i] = (int *)malloc(columns * sizeof(int));

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

array[i][j] = i * columns + j;

}

}

// Итерация по элементам массива

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

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

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

}

printf("

");

}

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

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

free(array[i]);

}

free(array);

return 0;

}

سيؤدي تنفيذ هذا الرمز إلى إخراج جدول القيم التالي:

0123
4567
891011

في هذا المثال ، نقوم بإنشاء مصفوفة ديناميكية ثنائية الأبعاد 3 * 4 ، ونملأها بقيم من 0 إلى 11 ونعرض كل عنصر من عناصر المصفوفة.

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

تحرير الذاكرة من مجموعة ديناميكية ثنائية الأبعاد

لتحرير الذاكرة التي تشغلها مصفوفة ديناميكية ثنائية الأبعاد ، يجب تنفيذ الخطوات التالية:

  1. انتقل من خلال صفوف المصفوفة وقم بتحرير الذاكرة لكل صف على حدة.
  2. تحرير الذاكرة لمؤشر إلى مجموعة من السلاسل.

لتنفيذ هذه الخطوات ، يتم استخدام وظائف وبنيات اللغة ج:

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

يوجد أدناه مثال على الكود يوضح إصدار الذاكرة لصفيف ديناميكي ثنائي الأبعاد:

"'ج

# تشمل

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

// تحرير الذاكرة لكل سطر

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

مجانا (صفيف [أنا]);

}

// تحرير الذاكرة لمؤشر إلى مجموعة من السلاسل

مجانا (صفيف);

}

كثافة العمليات الرئيسية () {

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

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

// تخصيص الذاكرة لمجموعة من السلاسل

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

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

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

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

}

// باستخدام صفيف

// تحرير ذاكرة مصفوفة ديناميكية ثنائية الأبعاد

فريديناميك2داري (صفيف ، صفوف);

العودة 0;

}

``

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

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

سؤال وجواب

ما هو صفيف ديناميكي ثنائي الأبعاد في ج ل?

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

كيف يمكنني إنشاء مصفوفة ديناميكية ثنائية الأبعاد?

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

كيفية استخدام مصفوفة ديناميكية ثنائية الأبعاد?

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

كيف يمكنني تحرير الذاكرة من قبل مجموعة ديناميكية ثنائية الأبعاد المحتلة?

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

هل هناك طرق بديلة للعمل مع صفائف ثنائية الأبعاد في ج?

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

ما هي مزايا استخدام مصفوفة ديناميكية ثنائية الأبعاد في ج?

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