البرمجة

Passing Pointers to Functions in C

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

عندما تستخدم مصفوفة مزدوجة البُعد (matrix)، فإنك بالفعل تمرر عنوان بداية المصفوفة، وليس نسخة منها. لذا، عند تعديل المصفوفة في الدالة، فإنك تعدل المصفوفة الأصلية أيضًا. لتجنب هذا، يجب عليك استخدام الإشارات (pointers) بشكل صحيح.

التعديل الصحيح لدالتك هو كما يلي:

c
void stampmatrix(int **matrix, int dim) { int r=0, c=0; for(r=0; rprintf("("); for(c=0;c1; // تعديل المصفوفة الأصلية printf(" %d , ",matrix[r][c]); } printf(")"); } }

هذا سيقوم بتعديل المصفوفة الأصلية بدلاً من إنشاء نسخة منها.

المزيد من المعلومات

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

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

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

c
void stampmatrix(int **matrix, int dim) { int r=0, c=0; int **newMatrix; // تخصيص ذاكرة للمصفوفة الجديدة newMatrix = (int **)calloc(dim, sizeof(int *)); for(r=0; rint *)calloc(dim, sizeof(int)); } // نسخ قيم المصفوفة الأصلية إلى المصفوفة الجديدة for(r=0; rfor(c=0; c// طباعة المصفوفة الجديدة for(r=0; rprintf("("); for(c=0; cprintf(" %d , ", newMatrix[r][c]); } printf(")"); } // حرر الذاكرة المخصصة للمصفوفة الجديدة for(r=0; rfree(newMatrix[r]); } free(newMatrix); }

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

مقالات ذات صلة

زر الذهاب إلى الأعلى
إغلاق

أنت تستخدم إضافة Adblock

يرجى تعطيل مانع الإعلانات حيث أن موقعنا غير مزعج ولا بأس من عرض الأعلانات لك فهي تعتبر كمصدر دخل لنا و دعم مقدم منك لنا لنستمر في تقديم المحتوى المناسب و المفيد لك فلا تبخل بدعمنا عزيزي الزائر