سلام

این جلسه قرار است به مبحث اشاره گر (pointer) بپردازیم.

تعریف: اشاره گر یا pointer نوعی از متغیر است که در آن یک آدرس ذخیره شده است. این آدرس می تواند آدرس هر کجای حافظه باشد (همان طور که قبلا گفته ایم، دو نوع حافظه وجود دارد).

برای تعریف یک اشاره گر که قرار است به آدرس یک متغیر از نوع int اشاره کند، به صورت زیر عمل می کنیم:

int *NAME;

الآن این جا یک متغیر وجود دارد که می تواند در خود یک آدرس ذخیره کند. برای این که آدرس یک متغیر معمولی را در این متغیر ذخیره کنیم، می توانیم به صورت زیر عمل کنیم:

NAME = &NAME2;

operator یا عمل گر «&» آدرس یک متغیر را برمی گرداند (با عمل گرها در جلسات آینده به طور کامل آشنا خواهیم شد). خطی که نوشتیم آدرس متغیری به نام NAME2 را در NAME می ریزد (توجه داشته باشید که هر دو متغیر باید از یک نوع باشند، یعنی مثلا NAME باید *int و NAME2 هم باید int باشد). حالا فرض کنید که می خواهیم مقدار متغیر NAME2 را عوض کنیم و به NAME2 دسترسی نداریم اما به اشاره گر آن (NAME) دسترسی داریم. برای تغییر مقدار موجود در NAME2 به صورت زیر عمل می کنیم:

*NAME = 5;

عمل گر «*» به ما خانه ای را که اشاره گر مورد نظر به آن اشاره می کند، برمی گرداند. کدی که نوشتیم یعنی برو به جایی که NAME به آن اشاره می کند و مقدار آن را برابر با ۵ قرار بده.

کارهای دیگری هم می توان با اشاره گر ها انجام داد. می توانیم آدرس یک اشاره گر را در یک اشاره گر دیگر بریزیم با استفاده از این دستور:

NAME1 = NAME2;

که در این جا هر دو متغیر، اشاره گر هستند.

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

۱. برنامه ای بنویسید و در آن یک اشاره گر از نوع char تعریف کنید. سپس یک متغیر معمولی تعریف کنید و آدرسش را در اشاره گر بریزید. مقدار متغیر را با استفاده از اشاره گر چاپ کنید.

۲. برنامه ای بنویسید و در آن یک اشاره گر تعریف کنید. سپس با کمک این اشاره گر مقدار یک متغیر معمولی را تغییر دهید. مقدار جدید را در خروجی چاپ کنید.

۳. برنامه ای بنویسید و در آن با کمک اشاره گرها مقدار دو متغیر را عوض کنید (با کمک تابعی به نام swap)

۴. برنامه ای بنویسید و در آن یک متغیر معمولی تعریف کنید. سپس آدرس آن را چاپ کنید.

اگر با تمرین ها مشکلی داشتید، به پاسخ های آن ها در پست بعدی نگاهی بیندازید (پیشنهاد می شود که حتی اگر تمامی تمرین ها را بلد هستید، حتما به پاسخ ها هم نگاهی بیندازید، گاهی اوقات در پاسخ تمارین نکاتی ذکر می شود که در طرح درس معمولی مطرح نمی شوند).

موفق باشید!