PDA

View Full Version : سوال: ارجاع به تابع یک متغیر، چرا؟



saworld
چهارشنبه 30 اردیبهشت 1388, 16:29 عصر
سلام به همگي...


يه سوال تخصصي داشتم . اونم اينكه :

چرا وقتي قرار نيست مقدار يك پارامتر كه از نوع آرايه است تغيير كند ، باز هم ممكن است

ترجيح دهيم آن را با ارجاع به تابع ارسال كنيم؟


***********

ممنون از همتون :لبخندساده:

mortezamsp
چهارشنبه 30 اردیبهشت 1388, 16:49 عصر
با سلام.

بیبن دوست گرام وقتی شما متغیری رو بدون مرجع ارسال میکنی اون تابع که داره صدا زده میشه بایدیه کپی از اون متغیر رودر خودش قراربده.تابع این طوریه.ولی وقتی با رجع ارسال میکنی ، فقط آدرس شروع رو میفرستی.این طوری در حافه صرفه جویی میشه.

درمورد آرایه این نکته رو هم بدون که اسم آرایه فقط اشاره گر به خونه ابتدای آرایه هست و فقط آدرس خونهاول رو در خودش نگه میداره . و برای دسترسی به خونه های دگیه آدرس اونا لازم نیست فقط آدرس خون شروع لازمه.

Yasersadegh
چهارشنبه 30 اردیبهشت 1388, 16:54 عصر
البته اين جواب فقط نظر خودمه و از چيزي كه گفتيد اين رو ميگم:
فكر مي كنم كه منظورتون علامت & هست كه پشت اسم آرايه ميذاريد!
اين علامت را زماني استفاده مي كنند كه بخوان آدرس يك متغير رو به يه تابع ارسال كنند كه معني همون فراخواني با ارجاع رو ميده!
در مورد آرايه ها هم چون آرايه در سي++ به صورت اشاره گر ذخيره مي شود براي ارسال آن به يك تابع بايد آدرس خانه اول اون رو به تابع ارسال كنيد!! به همين دليل هميشه براي آرايه ها بايد از علامت & استفاده كنيد تا آدرس خانه اول آن به تابع ارسال شود!!
اميدوارم كه خوب و درست توضيح داده باشم!!:لبخندساده:

saworld
چهارشنبه 30 اردیبهشت 1388, 16:54 عصر
خوب بود ولي ميشه يه خورده كامل تر توضيح بدين

قله بلند
سه شنبه 12 آبان 1388, 17:13 عصر
با سلام. دوست عزیز من هم پاسخی به سوال شما می دهم. امیدوارم در فهم بهتر کمک کند.اول یک نگاهی به لینک زیر بیاندازید. راجع به اشاره گر و مرجع توضیح داده.http://cpplearning.blogfa.com/8605.aspx دوم: در ادامه توضیح دوستان و ضمن تایید فرمایشات ایشان باید عرض کنم که هرگاه خواستید متغییری در حین استفاده در توابع دیگر تغییر نکند باید آن را از نوع ثوابت یا const تعریف کنید. به یک مثال راجع به اشاره گر توجه کنید:
void funct(int *);int main{int x[5]={1,2,3,4,5};funct(&x[2]);return 0;}void funct(int *px){*px=*px+1;}در این مثال با وجود داشتن یک آرایه از آدرس آن استفاده شد چون نمی خواستیم که از ابتدای آدرس آرایه شروع کنیم. اگر می خواستیم از آدرس ابتدا شروع کنیم دیگر احتیاجی به استفاده از * و & نیست بلکه اسم آرایه خودش همه کارها را می کند.

قله بلند
سه شنبه 12 آبان 1388, 17:18 عصر
حالا مثالی از ارجاع:
int vfunct(int);void rfunct(int &);int main(){int x=5,y=10;rfunct(y);return 0;}int vfunct(int a){return a*a;}void rfunct(int &b){b=b*b;}در ابتدا مقادیر 5، 25 و 5 برای متغیر a نمایش داده می شود. با اجرای vfunct(x) مقدار 25 بر می گردد ولی x=5 در تابع اصلی قرار دارد و به صورت مقدار فرستاده شده است پس تغییری در آن حاصل نمی شود. با اجرای rfunct(y) مقدار y به 100 تغییر می کند و چون این متغییر به صورت ارجاع فرستاده شده است در برنامه اصلی نیز تغییر می کند.وقتی پارامتری به صورت ارجاع اعلان می گردد این بدان معنی است که با تغییر مقدار این پارامتر در تابع احضار شده مقدار آرگومان متناظر نیز تغییر می نماید.