ورود

View Full Version : سوال: سوال درباره ی اشاره گرها و ادرس ها



mohammaddx
جمعه 22 خرداد 1394, 00:16 صبح
با سلام به همه ی دوستان.لطفا به عکس زیر نگاه کنید.(فردا امتحان دارم لطفا زودتر کمکم کنید)
132156
متاسفانه امکان کپی شدن به دلیل فونت خاصش برام نبود.
مشکل اینجاست که در خط سه
(fa+1)* به نظر هیچ کدوم از سه مقدار را در نظر نمیگیره.ولی با منطق سوال میگه که حتما باید یکی از متغیرها باشه.fa+1 باید به 0406 را دربربگیره.درسته ؟

pbm_soy
جمعه 22 خرداد 1394, 03:52 صبح
بله fa+1 دقیقا به آدرس 0406 اشاره میکند که اشاره گر از نوع float است و 4بایتی پس هربار افزایش هم 4 خانه در حافظه جلو میرود
با همین توضیح میتوانید دیگر آدرسها را محاسبه کنید (البته میتوانستید برنامه را تایپ کنید و در c/c++ نتیجه اجراش را ببینید)
*توجه کنید که تمام اعداد آدرسها در مبنای 16 هستند
دستور محاسباتی اول عدد 8.5 را در خانه 0406 ذخیره میکند
دستور بعدی مقدار 12.6 را در b ذخیره میکند
دستور بعدی مقدار 3.5 را در c ذخیره خواهد کرد چون *fc به خانه c اشاره دارد
دستور بعدی fa++ یک واحد به fa اضافه میکند و چون fa از نوع اشاره گر است و در آن آدرس خانه های حافظه ذخیره میشود پس به مقدار فعلی آن یک واحد اضافه میکند مقدارش میشود 0406 دیگر fa به خانه a اشاره ندارد توجه داشته باشید که در دستور اول در خانه 0406 قبلا مقدار 8.5 ذخیره شده بود
دستور بعدی ++fb هم مقدار fb را 040E خواهد کرد
دستور *fb=b هم مقدار 12.6 را در خانه 040E ذخیره میکند
دستور *fb++ مقدار fb که در آدرس 040E قرار دارد را یک واحد اضافه میکند پس مقدار fb میشود 0412 یعنی به خانه c اشاره خواهد کرد (اولویت عملگر ++ بالاتر از * است پس به آدرس اضافه میکند نه به مقدار جائی که بهش اشاره میکند)
دستور fc-=3 هم از آدرس 0412 به اندازه 3 واحد کم میکند پس fc مقدار 0406 را میگیرد (3واحد منظور 3تا4بایتی است که میشود 12 یا همان عدد E در مبنای 16 و عدد E را از 0412 کم میکند)
دستور آخر هم جائی که fc به آن اشاره دارد را مقدار دهی میکند fa به خانه 0406 اشاره دارد که در آن عدد 8.5 که ازش 2تا کم کنیم میشه 6.5 که آنرا در محلی که fcبه آن اشاره دارد(0406 طبق دستور قبل) ذخیره میکند

a=2.5
b=12.6
c=3.5
توجه کنید که آدرسهای متغییرهای a,b.,c در اینجا تغییر نکردند و البته تغییر پذیر هم نیستندپس همان آدرسهایی که صورت مسئله داده است را دارند
&a=0402
&b=040A
&c=0412
دیگه فرصت نیست جمع بندیها را خودتان انجام بدید

pbm_soy
جمعه 22 خرداد 1394, 04:01 صبح
من در پست بالا گفتم برنامه را تایپ میکردید و نتیجه اجرا را میدید برای اینکار هم باید به چند نکته توجه داشته باشید

اولا آدرس متغییرهای a,b,c در مقادیر دیگری خواهند داشت و محاسباتتان را براساس آنها باید انجام بدید و مثال سوال باید مقایسه کنید
دوما معمولا آدرسها در هربار اجرا تغییر کنند و اعداد دیگری به شما بدهند
سوما این برنامه در بیشتر سیستم عاملها خطا خواهد گرفت مخصوصا در سیستم عاملهای جدیدتر بخاطر اینکه برنامه به خانه های حافظه ای دسترسی پیدا میکند که قبلا توسط برنامه رزرو نشده اند مانند خانه 0406 توسط هیچ متغییر گرفته نشده است و شاید از آن خانه حافظه برنامه دیگری در حال استفاده باشد برای همین سیستم عاملهای جدیدتر برای محافظت از برنامه های دیگر اجازه دسترسی به آن خانه را نمیدهند و برنامه احتمالا وسط کار قطع میشود و خطا میدهد شاید در سیستم عاملهای قدیمیتر مانند داس اجرا شود(در داس اجرا میشود یادم میاد!) در برخی نسخه های داس هم کامپیوتر را ریست میکرد یا حتی قفل میکرد (بسته به اینکه به کجای حافظه دسترسی داشتید و مقدار ریخنید)

* توجه کنید که این مورد سوم به کامپایلر زیاد ربطی ندارد چون بیشتر کامپایلرهای خانواده C این برنامه را ترجمه کرده و زبان ماشین (exe) آن را میدهند اجرا کردن آن به عهده سیستم عامل است که چطوری اجرا کند و چه خانه های حافظه را در اختیار شما قرار دهد و کدام را قرار ندهد