فراخوانی با ارجاع در ++C — راهنمای جامع

۲۴۳۳ بازدید
آخرین به‌روزرسانی: ۱۸ شهریور ۱۴۰۲
زمان مطالعه: ۲ دقیقه
فراخوانی با ارجاع در ++C — راهنمای جامع

در این مقاله در مورد روش ارسال اشاره‌گرها به یک تابع به عنوان آرگومان صحبت می‌کنیم و شیوه استفاده مؤثر از آن‌ها را در برنامه‌های ++C مورد بررسی قرار می‌دهیم. بدین ترتیب با روش فراخوانی با ارجاع در ++C آشنا خواهید شد. برای مطالعه بخش قبلی این سری مطالب روی لینک زیر کلیک کنید:

997696

در بخش‌های قبلی این سری مطالب آموزشی در مقاله‌ای با عنوان «تابع‌های ++C — به زبان ساده» در مورد روش ارسال آرگومان‌ها به یک تابع صحبت کردیم. این روش به نام فراخوانیِ با مقدار نامیده می‌شود، زیرا در آن مقدار واقعی به تابع ارسال می‌شود. با این حال روش دیگری نیز برای ارسال آرگومان‌ها به تابع وجود دارد که در آن مقدار واقعی آرگومان ارسال نمی‌شود، بلکه به جای آن تنها ارجاعی به آن مقدار ارسال خواهد شد.

مثال 1: ارسال با ارجاع بدون اشاره‌گر

کدهای مربوطه را در ادامه آورده‌ایم.

1#include <iostream>
2using namespace std;
3// Function prototype
4void swap(int&, int&);
5int main()
6{
7    int a = 1, b = 2;
8    cout << "Before swapping" << endl;
9    cout << "a = " << a << endl;
10    cout << "b = " << b << endl;
11    swap(a, b);
12    cout << "\nAfter swapping" << endl;
13    cout << "a = " << a << endl;
14    cout << "b = " << b << endl;
15    return 0;
16}
17void swap(int& n1, int& n2) {
18    int temp;
19    temp = n1;
20    n1 = n2;
21    n2 = temp;
22}

خروجی

Before swapping
a = 1
b = 2

After swapping
a = 2
b = 1

فراخوانی با ارجاع در ++C

در تابع ()main دو مقدار صحیح به نام‌های a و b تعریف کرده‌ایم. این مقادیر صحیح به تابع ()swap به صورت با ارجاع ارسال می‌شوند. کامپایلر می‌تواند تشخیص دهد که این مقادیر به صورت با ارجاع ارسال شده‌اند، زیرا تعریف تابع به صورت زیر است:

1void swap(int& n1, int& n2)

علامت & پس از نوع داده نشان‌دهنده ارجاعی بودن آن است. تنها ارجاع (آدرس) متغیرهای a و b در تابع swap()‎ دریافت می‌شوند و تعویض مقادیر در آدرس اصلی متغیرها صورت می‌گیرد. در تابع ()swap‎، مقادیر n1 و n2 آرگومان‌های صوری هستند که در عمل به ترتیب برابر با a و b هستند. روش دیگری برای اجرای این کار با استفاده از اشاره‌گرها نیز وجود دارد:

مثال 2: ارسال با ارجاع با استفاده از اشاره‌گرها

1#include <iostream>
2using namespace std;
3// Function prototype
4void swap(int*, int*);
5int main()
6{
7    int a = 1, b = 2;
8    cout << "Before swapping" << endl;
9    cout << "a = " << a << endl;
10    cout << "b = " << b << endl;
11    swap(&a, &b);
12    cout << "\nAfter swapping" << endl;
13    cout << "a = " << a << endl;
14    cout << "b = " << b << endl;
15    return 0;
16}
17void swap(int* n1, int* n2) {
18    int temp;
19    temp = *n1;
20    *n1 = *n2;
21    *n2 = temp;
22}

خروجی مثال فوق همانند مثال قبلی است. در این حالت، آدرس متغیر در طی فراخوانی تابع به جای خود متغیر ارسال می‌شود.

1swap(&a, &b); // &a is address of a and &b is address of b

از آنجا که آدرس به جای مقدار ارسال شده است، عملگر «ارجاع‌زدایی» (dereference) باید برای دسترسی به مقدار ذخیره شده در آن آدرس مورد استفاده قرار گیرد:

1void swap(int* n1, int* n2) { 
2 ... .. ...
3}

n1* و n2* به ترتیب مقدارهای ذخیره شده در آدرس‌های n1 و n2 را به دست می‌دهند. از آنجا که n1 شامل آدرس a است، هر تغییری که روی n1* اجرا شود، مقدار a در تابع ()main نیز تغییر می‌یابد. به این ترتیب به پایان این بخش از سری مطالب آموزش جامع ++C می‌رسیم.

برای مطالعه بخش بعدی این سری مقالات روی لینک زیر کلیک کنید:

اگر این مطلب برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

==

بر اساس رای ۸ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
programiz
۲ دیدگاه برای «فراخوانی با ارجاع در ++C — راهنمای جامع»

سلام مهندس جان خداقوت
تفاوت دو روش فراخوانی با ارجاع بدون اشاره گر و با اشاره گر چی هست؟ اگه ممکنه بیشتر توضیح بدین تا مطلب جا بیفته..

سلام و وقت بخیر دوست عزیز؛
برای آشنایی با روش‌های مختلف فراخوانی‌های تابع پیشنهاد می‌کنم مطلب زیر را مطالعه کنید:
ارسال متغیرها به روش با مقدار و با ارجاع در جاوا اسکریپت — به زبان ساده
از توجه شما سپاسگزاریم.

نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *