View Full Version : سوال: ارسال اشاره گر به تابع
storm_saeed
پنج شنبه 19 دی 1392, 21:58 عصر
سلام
یه سوالی داشتم اینکه وقتی ما به یه تابع مثلا بصورت
void(int *)
هست
یه int a=2 مثلا رو میفرستیم تابع میاد یه ادرس دیگه شبیه کاری که با pass by value انجام میده رو اون پیاده میکنه .
میخواستم بدونم الان این با void(int a چقدر فرق داره و چقدر از نظر مصرف حافظه بهینه تره
ممنون
کامبیز اسدزاده
پنج شنبه 19 دی 1392, 22:30 عصر
سلام
یه سوالی داشتم اینکه وقتی ما به یه تابع مثلا بصورت
void(int *)
هست
یه int a=2 مثلا رو میفرستیم تابع میاد یه ادرس دیگه شبیه کاری که با pass by value انجام میده رو اون پیاده میکنه .
میخواستم بدونم الان این با void(int a چقدر فرق داره و چقدر از نظر مصرف حافظه بهینه تره
ممنون
اگه سوالتون رو درست متوجه شده باشم به صورت زیر :
فرض کنید شما در کدتون یه متغیری تعریف میکنید و مقادیر رو هم بهش میدین و این رو از نوع مثلا int میگیرین.
حالا در حالت عادی در ابتدای کد حافظه همین که به متغیر شما برسه اشغال خواهد شد ولی اگر شما از اون به صورت یک تابع استفاده کنید تا زمانی که تابع رو صدا نزنید هیچ حافظه ای اشغال نخواهد شد.
storm_saeed
پنج شنبه 19 دی 1392, 22:38 عصر
یعنی اگه من به شکل
void (int a)
تعریف کنم قبل اجرا موقعی که داره کامپایل میشه میاد یه حافظه ای رو اشغال میکنه
ولی اگه بطور
void (int * a)
موقع کامپایل فضایی رو نمیگیره فقط تو زمان اجرا بهش میرسه یه حافظه ای رو اشغال میکنه
درسته ؟
sr2m72
پنج شنبه 19 دی 1392, 22:56 عصر
یعنی اگه من به شکل
void (int a)
تعریف کنم قبل اجرا موقعی که داره کامپایل میشه میاد یه حافظه ای رو اشغال میکنه
ولی اگه بطور
void (int * a)
موقع کامپایل فضایی رو نمیگیره فقط تو زمان اجرا بهش میرسه یه حافظه ای رو اشغال میکنه
درسته ؟
سلام
خیر درست نیست.
در هر دو حالت تا زمانی که تابع فراخوانی نشود متغیر، حافظه ای اشغال نمیکند.
اما سوال بالا:
شما وقتی یک تابع با پارامتر اشاره گر تعریف میکنید هنگام فراخوانی تابع قبل از آرگومان کاراکتر & رو قرار میدهید. و به این صورت آدرس رو به تابع می فرستید و هرگونه بلایی سر متغیر بیارید مقدار اصلی نیز تغییر می کند.
اما بدون اشاره گر:
وقتی تابع فراخوانی می شود یک کپی از متغیری که به تابع فرستاده شده گرفته میشه و در یک مکان دیگر از حافظه نگه داری می شود و هر گونه بلا بر سر این متغیر بیارید مقدار اصلی تغییر نمیکند.
پس وقتی از اشاره گرها استفاده کنید فضای جدیدی از حافظه گرفته نمیشه. و این یعنی صرفه جویی در حافظه
موفق باشید//
storm_saeed
پنج شنبه 19 دی 1392, 23:02 عصر
ولی وقتی ما به تابع رفرنس ندیم یعنی prototype تابع به شکل int * باشه وقتی که تو تابع cout<<a و cout<<&a 2 مقدار مختلف که اولی ادرس متغیری هست که بهش پاس داده شده دومی هم ادرس خودشه که اینطوری نمیتونیم هر بلایی سر متغیر اولیمون بیاریم
کامبیز اسدزاده
پنج شنبه 19 دی 1392, 23:07 عصر
یعنی اگه من به شکل
void (int a)
تعریف کنم قبل اجرا موقعی که داره کامپایل میشه میاد یه حافظه ای رو اشغال میکنه
ولی اگه بطور
void (int * a)
موقع کامپایل فضایی رو نمیگیره فقط تو زمان اجرا بهش میرسه یه حافظه ای رو اشغال میکنه
درسته ؟
خیر منظور من اشغال نشدن حافظه در حالت تابع نویسی است در غیر این صورت به صورت زیر اگر بنویسید هنگام کامپایل حافظه اشغال خواهد شد.
مثلا :
int a;
ولی در صورتی که به صورت زیر باشد تا زمانی که صدا نزنید در حافظه وارد نخواهد شد.
void (int a)
storm_saeed
پنج شنبه 19 دی 1392, 23:07 عصر
من منظورم این بود
void (int a
void (int *a
فرقشون از نظر گرفتن حافظه و اینا چیه برتری حالت دوم چیه
کامبیز اسدزاده
پنج شنبه 19 دی 1392, 23:21 عصر
من منظورم این بود
void (int a
void (int *a
فرقشون از نظر گرفتن حافظه و اینا چیه برتری حالت دوم چیه
در این صورت فرمایشات دوستمون sr2m72 درست بود.
sr2m72
پنج شنبه 19 دی 1392, 23:33 عصر
در تکمیل فرمایشات دوست عزیزمون باید عرض کنم که شما توی تابع باید به این صورت به مقدار متغیر دسترسی پیدا کنید:
cout<<*a;
نه اینطوری:
cout<<a;
OR
cout<<&a;
موفق باشید//
Ananas
جمعه 20 دی 1392, 10:28 صبح
با اشاره گر میتونید اطلاعاتی بزرگتر از اندازه ی یک int به تابع بفرستیم. ولی یک int که سایزش با یک اشاره گر یکی هست چه نیازی به اشاره گر هست! مگر اینکه بخواید مقدار اصلی متغیر، توسط تابع دستکاری شه.
وقتی مینویسیم int * می تونیم یک آرایه یا یک struct رو به تابع بفرستیم که در مقایسه با کپی شدن کل struct سریع تر و بهینه تر هست.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.