برنامه نویسی ۴۶۷۹ بازدید

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

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

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

#include <iostream>
using namespace std;
// Function prototype
void swap(int&, int&);
int main()
{
    int a = 1, b = 2;
    cout << "Before swapping" << endl;
    cout << "a = " << a << endl;
    cout << "b = " << b << endl;
    swap(a, b);
    cout << "\nAfter swapping" << 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;
}

خروجی

Before swapping
a = 1
b = 2

After swapping
a = 2
b = 1

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

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

void swap(int& n1, int& n2)

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

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

#include <iostream>
using namespace std;
// Function prototype
void swap(int*, int*);
int main()
{
    int a = 1, b = 2;
    cout << "Before swapping" << endl;
    cout << "a = " << a << endl;
    cout << "b = " << b << endl;
    swap(&a, &b);
    cout << "\nAfter swapping" << 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 is address of a and &b is address of b

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

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

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

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

==

بر اساس رای ۲ نفر
آیا این مطلب برای شما مفید بود؟
شما قبلا رای داده‌اید!
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.

«میثم لطفی» در رشته‌های ریاضیات کاربردی و مهندسی کامپیوتر به تحصیل پرداخته و شیفته فناوری است. وی در حال حاضر علاوه بر پیگیری علاقه‌مندی‌هایش در رشته‌های برنامه‌نویسی، کپی‌رایتینگ و محتوای چندرسانه‌ای، در زمینه نگارش مقالاتی با محوریت نرم‌افزار با مجله فرادرس همکاری دارد.

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

نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد.

مشاهده بیشتر