خانه > برنامه نویسی C > اشاره گرها (Pointers) در زبان C

اشاره گرها (Pointers) در زبان C

در برنامه نویسی حرفه ای به زبان C اشاره گرها(pointer) جایگاه ویژه ای دارند. اشاره گرها ابزاری قدرتمند و قابل انعطاف برای کار با داده ها به برنامه نویس می دهند.

قبل از تعریف اشاره گر در زبان C بهتر است با تعریف آدرس آشنا شویم. در زبان C هر متغیر بسته به نوع خود در یک یا چند خانه حافظه ذخیره می شود. هر خانه از حافظه هم با یک آدرس منحصر به فرد مشخص می شود.  اگر یک متغیر به نام a داشته باشیم، &a به ما آدرس خانه ای از حافظه که متغیر a در آن ذخیره شده است را می دهد. برای مثال فرض کنید متغیر a را به صورت زیر تعریف و مقداردهی کرده باشیم:

با این دستور  کامپایلر یک خانه از حافظه را به متغیر a اختصاص داده و مقدار 20 را در داخل آن خانه قرار می دهد. حال برای مثال فرض کنید که کامپایلر خانه با آدرس 100 از حافظه را برای این کار اختصاص می دهد:

pointer-in-c-1

مزیت استفاده از متغیرها در زبان C این است که بدون درگیر شدن با جزئیات خانه های حافظه مقادیر خود را ذخیره و در مواقع لزوم فراخوانی می کنیم. در این مثال با استفاده از متغیر a مقدار 20 را در خانه 100 از حافظه ذخیره نمودیم. اما هرگاه لازم باشد تا بدانیم که متغیر a در کدام خانه حافظه ذخیره شده است می توانیم از عملگر & استفاده نماییم. در این مثال &a یعنی آدرس خانه ای از حافظه که متغیر a در آن ذخیره شده است یعنی همان 100. حال آیا می توان این آدرس را ذخیره نمود و یا روی آن تغییراتی ایجاد نمود؟ جواب این سوال را باید در اشاره گر جستجو نمود.

اشاره گر چیست؟

به متغیری که آدرس متغیر دیگر را در خود ذخیره می کند اشاره گر می گوییم.

در زبان C اشاره گرها را با اپراتور* مشخص می کنند. اشاره گر ها خود نوعی متغیر هستند پس باید قبل از هر کاری آن ها را تعریف کرد. در زیر تعریف چند اشاره گر به عنوان نمونه آورده شده است:

کامپایلر برای هر کدام از متغیرها فضایی در حافظه اختصاص می دهد. فرض کنید متغیر a در خانه 100  و متغیر a_ptr که اشاره گر می باشد در خانه 200 از حافظه قرار دارند. با دستور اول محتویات خانه 100 از حافظه که به متغیر a اختصاص داده شده است برابر 20 قرار می گیرد. با دستور دوم اشاره گر a_ptr تعریف شده و آدرس 200 حافظه به آن اختصاص داده می شود. دقت کنید چون اشاره گر a_ptr قرار است به متغیرa که  از نوع کاراکتر می باشد اشاره کند باید خودش هم کاراکتر تعریف شود.

 با دستور سوم آدرس متغیر a که همان 100 می باشد در متغیر a_ptr یا همان آدرس 200 ذخیره می شود. بنابراین با دستورات فوق محتویات این دو خانه از حافظه به صورت زیر می شوند:

pointer-in-c-2

خواندن از حافظه و نوشتن از حافظه با استفاده از اشاره گرها

با استفاده از یک اشاره گر می توان داده را از حافظه خواند و یا آن را در آدرسی از حافظه نوشت. به مثال زیر توجه کنید.

مثال1: خروجی برنامه زیر چیست؟

حل: چهار خط اول تابع main مربوط به تعریف متغیرهاست. با این کار کامپایلر برای هر یک از متغیرها بستگی به نوع آن ها خانه های حافظه به میزان مناسب اختصاص می دهد. بدون اینکه در پاسخ مسئله تاثیری داشته باشد فرض می کنیم کامپایلر برای متغیرهای var1 و var2 به صورت زیر خانه های حافظه را اختصاص داده باشد:

pointer-in-c-3

توجه نمایید که چون متغیر var1 از نوع int تعریف شده است کامپایلر برای آن 2 خانه از حافظه را اختصاص می دهد و چون این متغیر مقداردهی اولیه نشده است خانه های مربوط به آن را با x نمایش داده ایم یعنی فرقی نمی کند چه چیزی در این خانه ها ذخیره شده باشند. دستور ptr1=&var1; به این معنی است که آدرس متغیر var1 داخل اشاره گر ptr1 ذخیره شود. برای متغیرهایی که بیش از یک خانه از حافظه را اشغال می کنند اولین خانه از حافظه به عنوان آدرس آن متغیر شناخته می شود. بنابراین مقدار 1000 در اشاره گر ptr1 ذخیره می شود. به همین ترتیب ;[ptr2=&var2[2باعث می شود آدرس [var2[2 یعنی 1004 در داخل ptr2 ذخیره می شود. 

دستور *ptr1=50; مقدار 50 را در آدرسی که ptr1 به آن اشاره می کند ذخیره می نماید. یعنی 50 را در داخل متغیر var1 ذخیره می نماید. همچنین *ptr2=10; مقدار 10 را در داخل [var2[2 یعنی خانه 1004 ذخیره می کند. بنابراین دستور *ptr1=50; را می توان این گونه خواند: “محتویات آدرسی که اشاره گر ptr1 به آن اشاره می کند را برابر 50 قرار بده”.

بنابراین:

وقتی یک اشاره گر به صورت ptr* در سمت چپ یک تساوی به کار می رود، داده در آدرسی که اشاره گر به آن اشاره می کند نوشته می شود.

دستور var2[1]=*ptr1; به این معنی است که [var2[1  را برابر محتویات آدرسی که ptr1 به آن  اشاره می کند (یعنی مقدار 50) قرار بده.

وقتی یک اشاره گر به صورت ptr* در سمت راست یک تساوی به کار می رود، داده از آدرسی که اشاره گر به آن اشاره می کند خوانده می شود.

بنابراین در پایان اجرای دستورات محتویات خانه های 1000 تا 1005 به صورت زیر می باشد:

pointer-in-c-4

بنابراین خروجی برنامه به صورت زیر می باشد:

 

درباره ی مدیر سایت

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *