C ++ هي لغة برمجة مرنة للأغراض العامة. تم إنشاؤه في الأصل من قبل بيارن ستروستروب، عالم كمبيوتر دانمركي ، في عام 1985. يدعم C ++ طرق تمرير ثلاثية المعلمات ، أي الاتصال حسب القيمة ، والاتصال حسب العنوان ، والاتصال حسب المرجع. في هذه المقالة ، سنناقش حول الاتصال حسب العنوان والاتصال عن طريق آلية المرجع.
ما هي الوظيفة؟
قبل أن ننتقل إلى الموضوع الفعلي ، نحتاج إلى فهم ماهية الوظيفة في C ++. قد يكون العديد منكم بالفعل على دراية بالوظائف.
الوظيفة هي في الأساس جزء من التعليمات البرمجية التي يمكن استخدامها لأداء مهمة معينة. تُستخدم الوظيفة بشكل أساسي لتقليل الشفرة المتكررة في برنامج C ++. يأخذ المدخلات كمعلمات ويعيد الإخراج كقيمة إرجاع. إذا حددنا الوظيفة مرة واحدة ، فيمكننا الاتصال بها / استخدامها عدة مرات في الجزء الأخير من برنامجنا. بهذه الطريقة ، نوفر الكثير من التعليمات البرمجية المتكررة في البرنامج.
يجب أن يكون لكل برنامج C ++ الوظيفة الرئيسية (). الدالة main () هي نقطة الدخول لبرنامج C ++. بصرف النظر عن الوظيفة الرئيسية () ، يمكن للمبرمج تحديد العديد من الوظائف كما يريد.
فيما يلي بناء جملة تعريف الوظيفة:
Return_type Function_Name(قائمة معلمات الإدخال)
يمكن للوظيفة في C ++ قبول عدد 0 أو أكثر من معلمات الإدخال ، بينما يمكنها إرجاع قيمة إرجاع واحدة فقط.
ما هو العنوان؟
هناك نوعان من المتغيرات في C ++ (على غرار لغة C) - متغير البيانات ومتغير العنوان. يستخدم متغير العنوان لتخزين عنوان متغير بيانات آخر. على سبيل المثال ، دعنا نفكر في مقتطف الشفرة التالي:
intأنا= 100؛
int *ptr= &أنا؛
هنا ، يخبرنا البيان الأول أن المتغير i هو متغير بيانات ، وأنه يخزن القيمة 100. في العبارة الثانية ، نعلن عن متغير مؤشر ، أي ptr ، ونقوم بتهيئته بعنوان المتغير i.
ما هو المرجع؟
المرجع هو ميزة قوية أخرى للغة C ++. دعنا نفكر في مقتطف الشفرة التالي:
intإلى= 200؛int &ص=إلى؛
في هذا المثال ، أعلنا عن عدد صحيح ، أي a ثم أعلنا عن متغير مرجعي r ، والذي تمت تهيئته بقيمة a. لذا ، فإن المتغير المرجعي ليس سوى اسم مستعار لمتغير آخر.
طرق تمرير المعلمة:
هناك ثلاثة أنواع من طرق تمرير المعلمات في لغة C ++:
- استدعاء بالقيمة / تمرير بالقيمة
- الاتصال بالعنوان / المرور بالعنوان
- دعوة بالإشارة / تمرير بالرجوع
في هذه المقالة ، نناقش حول - الاتصال حسب العنوان والاتصال بالإشارة.
ما هو الاتصال بالعنوان / المرور بالعنوان؟
في حالة طريقة Call by address / Pass by address ، يتم تمرير وسيطات الوظيفة كعنوان. تقوم وظيفة المتصل بتمرير عنوان المعلمات. يتم استخدام متغيرات المؤشر في تعريف الوظيفة. بمساعدة طريقة الاتصال حسب العنوان ، يمكن للوظيفة الوصول إلى المعلمات الفعلية وتعديلها. سنرى مثالًا على قسم طريقة الاتصال حسب العنوان لاحقًا من هذه المقالة.
ما هو Call By Reference / Pass by Reference؟
في طريقة الاتصال بالمرجع / المرور حسب المرجع ، يتم تمرير معلمات الوظيفة كمرجع. داخل تعريف الوظيفة ، يتم الوصول إلى المعلمات الفعلية باستخدام المتغير المرجعي.
أمثلة:
الآن ، نظرًا لأننا نفهم مفهوم طرق تمرير المعلمات ، فسنرى العديد من أمثلة البرامج لفهم آلية تمرير المعلمات في C ++:
- مثال -1 - الاتصال حسب العنوان (1)
- مثال -2 - الاتصال حسب العنوان (2)
- مثال 3 - الاتصال بالمرجع (1)
- مثال 4 - الاتصال بالمرجع (2)
تم إعطاء المثالين الأولين لشرح كيفية عمل طريقة الاتصال حسب العنوان في C ++. المثالان الأخيران هما شرح مفهوم الاتصال بالإشارة.
مثال -1 - الاتصال حسب العنوان (1)
في هذا المثال ، سوف نوضح آلية الاتصال حسب العنوان. من الدالة main () ، نستدعي الدالة hello () ونمرر عنوان var. في تعريف الوظيفة ، نتلقى عنوان var في متغير المؤشر ، أي p. داخل الدالة hello ، يتم تغيير قيمة var إلى 200 بمساعدة المؤشر. لذلك ، يتم تغيير قيمة var إلى 200 داخل الدالة main () بعد استدعاء الوظيفة hello ().
#يشملاستخدام مساحة الاسمساعات؛
فارغأهلا(int *ص)
{
كلفة <<endl<< 'داخل hello () وظيفة:' <<endl؛
كلفة << 'قيمة * p =' << *ص<<endl؛
*ص= 200؛
كلفة << 'قيمة * p =' << *ص<<endl؛
كلفة << 'الخروج من وظيفة hello ().' <<endl؛
}
intالأساسية()
{
intأين= 100؛
كلفة << 'قيمة var داخل الدالة الرئيسية () =' <<أين<<endl؛
أهلا(&أين)؛
كلفة <<endl<< 'قيمة var داخل الدالة الرئيسية () =' <<أين<<endl؛
إرجاع 0؛
}
مثال -2 - الاتصال حسب العنوان (2)
هذا مثال آخر على طريقة الاتصال حسب العنوان. في هذا المثال ، سنشرح كيف يمكن استخدام طريقة الاتصال حسب العنوان لحل مشكلة واقعية. على سبيل المثال ، نريد كتابة دالة لمبادلة متغيرين. إذا استخدمنا آلية الاستدعاء بالقيمة لمبادلة متغيرين ، فلن يتم تبديل المتغيرات الفعلية في وظيفة المتصل. يمكن استخدام طريقة الاتصال حسب العنوان في مثل هذا السيناريو. في هذا المثال ، نقوم بتمرير عنوان كل من var_1 (& var_1) و var_2 (& var_2) إلى دالة mySwap (). داخل وظيفة mySwap () ، نقوم بتبديل قيم هذين المتغيرين بمساعدة المؤشرات. كما ترى في الإخراج أدناه ، يتم تبديل القيمة الفعلية لهذه المتغيرات في الوظيفة main () بعد تنفيذ وظيفة mySwap ().
#يشملاستخدام مساحة الاسمساعات؛
فارغmySwap(int *vptr_1 ،int *vptr_2)
{
inttemp_var؛
temp_var= *vptr_1؛
*vptr_1= *vptr_2؛
*vptr_2=temp_var؛
}
intالأساسية()
{
intفار_1= 100؛
intvar_2= 300؛
كلفة << 'قبل استدعاء دالة mySwap () ، قيمة var_1:' <<فار_1<<endl؛
كلفة << 'قبل استدعاء دالة mySwap () ، قيمة var_2:' <<var_2<<endl<<endl؛
كلفة << 'استدعاء وظيفة mySwap () - الاتصال حسب العنوان.' <<endl<<endl؛
mySwap(&var_1 ،&var_2)؛
كلفة << 'بعد استدعاء دالة mySwap () ، قيمة var_1:' <<فار_1<<endl؛
كلفة << 'بعد استدعاء دالة mySwap () ، قيمة var_2:' <<var_2<<endl؛
إرجاع 0؛
}
مثال 3 - الاتصال بالمرجع (1)
في هذا المثال ، سوف نوضح كيف يعمل الاتصال حسب المرجع في C ++. في تعريف الدالة hello () ، يتم تلقي القيمة كمتغير مرجعي (& p). بمساعدة المتغير المرجعي (أي ، p) ، يمكننا تغيير قيمة المعلمة الفعلية (var) داخل الوظيفة الرئيسية ().
#يشملاستخدام مساحة الاسمساعات؛
فارغأهلا(int &ص)
{
كلفة <<endl<< 'داخل hello () وظيفة:' <<endl؛
كلفة << 'قيمة p =' <<ص<<endl؛
ص= 200؛
كلفة << 'قيمة p =' <<ص<<endl؛
كلفة << 'الخروج من وظيفة hello ().' <<endl؛
}
intالأساسية()
{
intأين= 100؛
كلفة << 'قيمة var داخل الدالة الرئيسية () =' <<أين<<endl؛
أهلا(أين)؛
كلفة <<endl<< 'قيمة var داخل الدالة الرئيسية () =' <<أين<<endl؛
إرجاع 0؛
}
مثال 4 - الاتصال بالمرجع (2)
هذا مثال آخر لمكالمة من خلال الإشارة. في هذا المثال ، سوف نوضح كيف يعمل الاتصال حسب المرجع في C ++ بمساعدة مثال من العالم الحقيقي. يتم استدعاء وظيفة mySwap () من الدالة main () بالمعلمات التالية - var_1 و var_2. داخل وظيفة mySwap () ، نتلقى المعلمات كمتغيرات مرجعية.
#يشملاستخدام مساحة الاسمساعات؛
فارغmySwap(int &vref_1 ،int &vref_2)
{
inttemp_var؛
temp_var=vref_1؛
vref_1=vref_2؛
vref_2=temp_var؛
}
intالأساسية()
{
intفار_1= 100؛
intvar_2= 300؛
كلفة << 'قبل استدعاء دالة mySwap () ، قيمة var_1:' <<فار_1<<endl؛
كلفة << 'قبل استدعاء دالة mySwap () ، قيمة var_2:' <<var_2<<endl<<endl؛
كلفة << 'استدعاء وظيفة mySwap () - الاتصال بالإشارة.' <<endl<<endl؛
mySwap(var_1 ، var_2)؛
كلفة << 'بعد استدعاء دالة mySwap () ، قيمة var_1:' <<فار_1<<endl؛
كلفة << 'بعد استدعاء دالة mySwap () ، قيمة var_2:' <<var_2<<endl؛
إرجاع 0؛
}
استنتاج
فهم طرق تمرير المعلمات في C ++ أمر بالغ الأهمية. تدعم لغة البرمجة C الاتصال حسب القيمة والاتصال بالعنوان فقط. ولكن ، يدعم C ++ الاتصال بالإشارة إلى جانب الآليتين السابقتين. في هذه المقالة ، رأينا العديد من الأمثلة العملية لفهم مفهوم الاتصال حسب العنوان والمكالمة بالإشارة. الاتصال حسب العنوان هو وسيلة قوية وشائعة للغاية في تطبيقات المجال المضمنة.