تابع زیر رو در نظر میگیریم
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;
}
هیچ پژوهش انسانی نمیتواند ادعای علمی بودن داشته باشد، مگر اینکه از برهان ریاضی برخوردار باشد (لئوناردو داوینچی)