پاسخ : آموزش ( avrstudio5 ( AVRGCC
با سلام مجدد
خوب من در مورد این اشاره گر ها یه مقدار رفتم مطالعه کردم تابتونم تابعی که نوشتید رو برای خودم تفسیر کنم چیزی که اینجا به نظر مهم امد و شما ازون استفاده کرده بودین تقسیم فضای حافظه ای که به اون متغیر از جنس int اختصاص داده میشه به این ترتیب که چون حافظه تخصیص یافته به اون دو بایتی هست و کاری که میخواهیم بکنیم یک عملیات تک بایتی بوده پس میاییم یک اشاره گر تک بایتی تعریف میکنیم و آدرس اون رو برابر با آدرس بایت اول متغیر میکنیم و از طرفی چون نوع اشاره گر unsigned char هست ولی نوع متغیر از نوع int و دوبایتی باید یک تبدیل نوع (type casting) انجام بدیم تا آدرس اولین خانه متغیر n به s منتسب بشه بعدش هم که اگر درست متوجه شده باشم ، محتوایات بایت بالا و پایین از طریق این اشاره گر ومتغیر میانی c جابهجا میشه چیزی که برام روشن نبود این بود که چجوری شد که یک دفعه متغیر اشاره گر به صورت مستقیم بدون (*) به c منتسب شد ولی حالا فهمیدم که درواقع وقتی که میگیم یک متغیر از نوع اشاره گر هست و اون اشاره میکنه به محلی از حافظه میشه اون رو یه آریه فرض کرد که درایه اولش (صفرم) به محتویات اون خونه ای که اشاره گر بهش انتساب شده و درایه بعدی یکی بعلاوه طول آریه مثلا اگه یک متغیر اشاره گر از نوع int تعریف کنیم و مثلا خونه 1000 حافظه به اون اختصاص داده بشه درایه صفرم این اشاره گر میشه محتویات خانه 1000 و 1001 از نوع int درایه یکم این اشاره گر میشه محتویات خانه 1002 و 1003 از نوع int و قص علی هذا !
توجه به مطالبی که خوندم امدم این تابع شما رو به صورت زیر باز نویسی کردم به نظرتون درست متوجه شدم یا نه ؟
شد :
ممنون از توجهتون
با سلام مجدد
دارم بهتون هشدار میدم. ممکنه توی خاکی بزنین و برای خودتون دردسر درست کنین.
خوب من در مورد این اشاره گر ها یه مقدار رفتم مطالعه کردم تابتونم تابعی که نوشتید رو برای خودم تفسیر کنم چیزی که اینجا به نظر مهم امد و شما ازون استفاده کرده بودین تقسیم فضای حافظه ای که به اون متغیر از جنس int اختصاص داده میشه به این ترتیب که چون حافظه تخصیص یافته به اون دو بایتی هست و کاری که میخواهیم بکنیم یک عملیات تک بایتی بوده پس میاییم یک اشاره گر تک بایتی تعریف میکنیم و آدرس اون رو برابر با آدرس بایت اول متغیر میکنیم و از طرفی چون نوع اشاره گر unsigned char هست ولی نوع متغیر از نوع int و دوبایتی باید یک تبدیل نوع (type casting) انجام بدیم تا آدرس اولین خانه متغیر n به s منتسب بشه بعدش هم که اگر درست متوجه شده باشم ، محتوایات بایت بالا و پایین از طریق این اشاره گر ومتغیر میانی c جابهجا میشه چیزی که برام روشن نبود این بود که چجوری شد که یک دفعه متغیر اشاره گر به صورت مستقیم بدون (*) به c منتسب شد ولی حالا فهمیدم که درواقع وقتی که میگیم یک متغیر از نوع اشاره گر هست و اون اشاره میکنه به محلی از حافظه میشه اون رو یه آریه فرض کرد که درایه اولش (صفرم) به محتویات اون خونه ای که اشاره گر بهش انتساب شده و درایه بعدی یکی بعلاوه طول آریه مثلا اگه یک متغیر اشاره گر از نوع int تعریف کنیم و مثلا خونه 1000 حافظه به اون اختصاص داده بشه درایه صفرم این اشاره گر میشه محتویات خانه 1000 و 1001 از نوع int درایه یکم این اشاره گر میشه محتویات خانه 1002 و 1003 از نوع int و قص علی هذا !
توجه به مطالبی که خوندم امدم این تابع شما رو به صورت زیر باز نویسی کردم به نظرتون درست متوجه شدم یا نه ؟
کد:
int swab(int n) { unsigned char *s = (unsigned char *)&n; unsigned char c; c = s[0]; s[0] = s[1]; s[1] = c; return n; }
شد :
کد:
void swab( int n) { unsigned char *s = (unsigned char *)&n; unsigned char c; c=*s; *s=*s++; *++s=c; }
ممنون از توجهتون
دیدگاه