اولین بار است که به این وب‌سایت می‌آیید. راهنما را مطالعه کنید!
x
موسسه خیریه محک

شهر ریاضی بازی-ریاضی

تاریخچه‌ی ویرایش برای ارسال #1664

شنبه ۱۸ خرداد ۱۳۹۲ ارسال شده توسط prodo

تابع زیر رو در نظر می‌گیریم

void f(int x)
{
x = 5;
}
وقتی تابع رو به صورت زیر فراخوانی کنیم

int i = 10;
f(i);
cout< انتظار داریم چه مقداری چاپ بشه؟ مسلماً ۵ نیست. چون متغیر `i` به صورت مقداری و کپی داخل تابع قرار گرفته. بنابراین مقدارش در داخل تابع تغییر نمی‌کنه. بلکه مقدار یه کپی از اون هست که تغییر می‌کنه.

به طور کلی اگه `T` یه نوع داده باشه تابعی به صورت `f(T)` نمی‌تونه مقدار متغیر ارسالی به تابع رو تغییر بده. همیشه یه کپی ساخته می‌شه.

این از اطلاعاتی که به عنوان یه برنامه‌نویس آشنا به `C++` داریم.

اما در مورد سوال. یه تابعی داریم که یه `int*` رو به عنوان آرگومان می‌گیره.

اگه `T` رو `int*` در نظر بگیریم پس `f(T)` یه تابع با ارجاع مقداری هست. بنابراین مقدار متغیر ارسال شده یعنی `int*` در داخل تابع نغییر نمی‌کنه. مقدار متغیر ارسالی همون آدرس داخل اشاره‌گر ارسالی هست.

در صورتی که `T` رو `int` در نظر بگیریم پس `f(T*)` di تابع با ارجاع اشاره‌گری هست. بنابراین مقدارش داخل تابع تغییر می‌کنه. یعنی مقدار داخل متغیر ارسال شده به تابع نه اشاره‌گر! یعنی آدرس عوض نمی‌شه ولی مقدار داخل اشاره‌گر عوض می‌شه.
شنبه ۱۸ خرداد ۱۳۹۲ ویرایش شده توسط prodo

تابع زیر رو در نظر می‌گیریم

void f(int x)
{
x = 5;
}
وقتی تابع رو به صورت زیر فراخوانی کنیم

int i = 10;
f(i);
cout<<i;
انتظار داریم چه مقداری چاپ بشه؟ مسلماً ۵ نیست. چون متغیر `i` به صورت مقداری و کپی داخل تابع قرار گرفته. بنابراین مقدارش در داخل تابع تغییر نمی‌کنه. بلکه مقدار یه کپی از اون هست که تغییر می‌کنه.

به طور کلی اگه `T` یه نوع داده باشه تابعی به صورت `f(T)` نمی‌تونه مقدار متغیر ارسالی به تابع رو تغییر بده. همیشه یه کپی ساخته می‌شه.

این از اطلاعاتی که به عنوان یه برنامه‌نویس آشنا به `C++` داریم.

اما در مورد سوال. یه تابعی داریم که یه `int*` رو به عنوان آرگومان می‌گیره.

اگه `T` رو `int*` در نظر بگیریم پس `f(T)` یه تابع با ارجاع مقداری هست. بنابراین مقدار متغیر ارسال شده یعنی `int*` در داخل تابع نغییر نمی‌کنه. مقدار متغیر ارسالی همون آدرس داخل اشاره‌گر ارسالی هست.

در صورتی که `T` رو `int` در نظر بگیریم پس `f(T*)` di تابع با ارجاع اشاره‌گری هست. بنابراین مقدارش داخل تابع تغییر می‌کنه. یعنی مقدار داخل متغیر ارسال شده به تابع نه اشاره‌گر! یعنی آدرس عوض نمی‌شه ولی مقدار داخل اشاره‌گر عوض می‌شه.

برای عوض کردن مقدار آدرس اشاره‌گر مثل زیر می‌شه عمل کرد

void f(int **p)
{
*p = new int(4);
}

int main()
{
int *p = new int();
cout<<"p = "<<p<<endl;
f(&p);
cout<<"p = "<<p<<endl;
return 0;
}
یا

void f(int *&p)
{
p = new int(4);
}

int main()
{
int *p = new int();
cout<<"p = "<<p<<endl;
f(p);
cout<<"p = "<<p<<endl;
return 0;
}