Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

التمرير بالقيمة

جزء من قسم Logic & Flow في رحلة C على Coddy — الدرس 25 من 63.

عندما تقوم بتمرير متغير إلى دالة في لغة C، تتلقى الدالة نسخة من قيمة ذلك المتغير، وليس المتغير نفسه. يُسمى هذا المفهوم الأساسي التمرير بالقيمة (pass-by-value).

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

void tryToChange(int num) {
    num = 99;  // هذا يغير النسخة فقط
}

int main() {
    int x = 10;
    tryToChange(x);
    // لا تزال قيمة x هي 10، وليست 99
    return 0;
}

يحمي هذا السلوك بياناتك الأصلية من التعديل غير المقصود بواسطة الدوال. ومع ذلك، فهذا يعني أيضاً أنه إذا كنت تريد أن تقوم دالة بتغيير قيمة متغير بالفعل، فإن التمرير بالقيمة (pass-by-value) لن ينجح. يعد فهم هذا القيد أمراً بالغ الأهمية مع تقدمك في تعلم المؤشرات (pointers) وكيف يمكنها حل هذه المشكلة.

challenge icon

التحدي

سهل

اكتب برنامجاً بلغة C يوضح مفهوم التمرير بالقيمة (pass-by-value) من خلال محاولة تعديل متغير داخل دالة وملاحظة أن المتغير الأصلي يظل دون تغيير.

يجب أن يقوم برنامجك بما يلي:

  1. إنشاء دالة باسم tryToModify تأخذ معاملًا صحيحاً (integer) يسمى number
  2. داخل دالة tryToModify، أضف 50 إلى المعامل number
  3. داخل دالة tryToModify، اطبع القيمة المعدلة بالتنسيق التالي: Inside function: [value]
  4. في الدالة main، صرح عن متغير صحيح باسم original وقم بتهيئته بالقيمة 25
  5. اطبع القيمة الأصلية قبل استدعاء الدالة بالتنسيق التالي: Before function call: [value]
  6. استدعِ دالة tryToModify ومرر المتغير original كوسطاء (argument)
  7. بعد استدعاء الدالة، اطبع قيمة original مرة أخرى بالتنسيق التالي: After function call: [value]

يجب أن يوضح مخرج البرنامج أن قيمة المتغير الأصلي تظل دون تغيير على الرغم من التعديل داخل الدالة:

Before function call: 25
Inside function: 75
After function call: 25

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

ورقة مرجعية

في لغة C، تستقبل الدوال نسخة من قيم المتغيرات، وليس المتغيرات نفسها. يسمى هذا التمرير بالقيمة (pass-by-value).

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

void tryToChange(int num) {
    num = 99;  // هذا يغير النسخة فقط
}

int main() {
    int x = 10;
    tryToChange(x);
    // x لا تزال 10، وليست 99
    return 0;
}

يحمي هذا السلوك بياناتك الأصلية من التعديل العرضي بواسطة الدوال، ولكنه يعني أن التمرير بالقيمة لن يعمل إذا كنت تريد أن تقوم الدالة بتغيير قيمة المتغير فعلياً.

جرّب بنفسك

#include <stdio.h>

// TODO: اكتب دالة tryToModify الخاصة بك هنا

int main() {
    // TODO: اكتب الكود الخاص بك هنا
    // 1. قم بالتصريح عن المتغير الأصلي وتهيئته
    // 2. اطبع القيمة قبل استدعاء الدالة
    // 3. استدعِ دالة tryToModify
    // 4. اطبع القيمة بعد استدعاء الدالة
    
    return 0;
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Logic & Flow