English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
في هذا المقال، ستتعلم كيفية مرور الإشارات كمعلمات لدوال، واستخدامها بشكل فعال في البرنامج.
فيوظائف في C++في هذا المقال، تعرفت على كيفية مرور المعلمات إلى الدوال. لأن يتم مرور القيمة الفعلية، يُسمى هذا الأسلوب بـ "مرور القيمة".
لكن هناك طريقة أخرى يمكن استخدامها لمرور المعلمات إلى دالة، حيث لا يتم مرور قيمة المعلمات الفعلية.
#include <iostream> using namespace std; // بيانات النموذج void swap(int&, int&); int main() { int a = 11, b = 22; cout << "قبل التبادل" << endl; cout << "a = " << a << endl; cout << "b = " << b << endl; swap(a, b); cout << "\nبعد التبادل" << endl; cout << "a = " << a << endl; cout << "b = " << b << endl; return 0; } void swap(int& n1, int& n2) { int temp; temp = n1; n1 = n2; n2 = temp; }
نتائج الإخراج
قبل التبادل a = 11 b = 22 بعد التبادل a = 22 b = 11
في دالة main()، تم تعريف متغيرين كاملين a و b. تم مرور هذه الكاملات بالإشارة إلى دالة swap().
يمكن للمعالج التعرف على أنها مرور بالإشارة لأن تعريف الدالة هو void swap(int& n1, int& n2) (لاحظ أن نوع البيانات يأتي بعدها&الرمز).
تقبل دالة swap() إشارات إلى متغيرات a و b فقط، ويحدث التبادل في العناوين الأصلية للمتغيرات.
في دالة swap()، n1 و n2 هي معلمات شكلية، وهم في الواقع متساويان مع متغيرات a و b.
هناك طريقة أخرى تستخدمالإشاراتطريقة أخرى لإنجاز نفس المهمة.
#include <iostream> using namespace std; // بيانات النموذج void swap(int*, int*); int main() { int a = 1, b = 2; cout << "قبل التبادل" << endl; cout << "a = " << a << endl; cout << "b = " << b << endl; swap(&a, &b); cout << "\nبعد التبادل" << endl; cout << "a = " << a << endl; cout << "b = " << b << endl; return 0; } void swap(int* n1, int* n2) { int temp; temp = *n1; *n1 = *n2; *n2 = temp; }
النتيجة المقدمة للنموذج متطابقة مع النتيجة السابقة.
في هذه الحالة، يتم إرسال عناوين المتغيرات أثناء استدعاء الوظيفة وليس المتغير نفسه.
swap(&a, &b); // &a هو عنوان a، &b هو عنوان b
بما أن يتم إرسال العناوين وليس القيم، فإنه يجب استخدام عمليات الاستدلال لاستعادة القيم المخزنة في تلك العناوين.
void swap(int* n1, int* n2) { ... .. ... }
* n1 و * n2 يعطيان القيم المخزنة في العنوان n1 والعنوان n2 على التوالي.
بما أن n1 يحتوي على عنوان a، فإن أي شيء يتم القيام به بواسطة * n1 سيتغير أيضًا قيمة a في وظيفة main(). وبالمثل، سيكون لدي b نفس القيمة.