التمرير بالقيمة
جزء من قسم 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) وكيف يمكنها حل هذه المشكلة.
التحدي
سهلاكتب برنامجاً بلغة C يوضح مفهوم التمرير بالقيمة (pass-by-value) من خلال محاولة تعديل متغير داخل دالة وملاحظة أن المتغير الأصلي يظل دون تغيير.
يجب أن يقوم برنامجك بما يلي:
- إنشاء دالة باسم
tryToModifyتأخذ معاملًا صحيحاً (integer) يسمىnumber - داخل دالة
tryToModify، أضف 50 إلى المعاملnumber - داخل دالة
tryToModify، اطبع القيمة المعدلة بالتنسيق التالي:Inside function: [value] - في الدالة
main، صرح عن متغير صحيح باسمoriginalوقم بتهيئته بالقيمة 25 - اطبع القيمة الأصلية قبل استدعاء الدالة بالتنسيق التالي:
Before function call: [value] - استدعِ دالة
tryToModifyومرر المتغيرoriginalكوسطاء (argument) - بعد استدعاء الدالة، اطبع قيمة
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;
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
1أساسيات المؤشرات
ما هو المؤشر؟الإعلان عن المؤشراتعامل العنوان (&)عامل إلغاء المرجعية (*)مؤشرات NULLمراجعة: أساسيات المؤشرات4مشروع: أداة نصوص بسيطة
نظرة عامة على المشروععد الأحرف2المؤشرات والمصفوفات
أسماء المصفوفات كمؤشراتعناصر المصفوفة - المؤشراتالعمليات الحسابية على المؤشراتمقارنة المؤشراتمراجعة: التنقل في المصفوفة باستخدام المؤشرات5المؤشرات والدوال
التمرير بالقيمةتمرير المؤشرات إلى الدوالتعديل المتغيرات عبر المؤشراتمثال كلاسيكي: التبديلتمرير المصفوفات إلى الدوالملخص: وسائط المؤشرات في الدوال8الهياكل والمؤشرات
المؤشرات إلى الهياكلعامل السهم (->)تمرير الهياكل بالقيمةتمرير مؤشرات الهياكلالتخصيص الديناميكي للهياكلمراجعة: تعديل الهياكل باستخدام المؤشرات11تحديات المراجعة النهائية
مراجعة: دمج السلاسل النصية الديناميكيمراجعة: مصفوفة من الـ Structsمراجعة: عداد تكرار الكلمات3مصفوفات الأحرف والسلاسل النصية
السلاسل النصية كمصفوفات charالمُنهي الصفري (Null Terminator)إدخال السلاسل النصية باستخدام scanfاستخدام strlen()استخدام strcpy()استخدام strcat()استخدام strcmp()مراجعة: دوال السلاسل النصية الأساسية