آشنایی با مفهوم اشاره‌گرها به زبان ساده

به کجا اشاره کنم؟

مفهوم اشاره‌گرها یکی از اساسی‌‌ترین مفاهیم در دنیای برنامه‌نویسی است که به‌مرور زمان با به‌وجود آمدن زبان‌های مدرن برنامه‌نویسی مفهوم کاربردی‌اش را از دست داد یا کاربرد آن کم‌رنگتر از قدیم شد. اما در هر صورت دانستن آن برای یک برنامه‌نویس الزامی است.
کد خبر: ۳۴۵۴۸۸

در این مقاله سعی شده که این مفهوم جذاب بسادگی بیان و شرح داده شود.

برای این‌که با مفهوم اشاره‌گرها آشنا شوید ابتدا مقدمه‌ای از تعریف متغیرها و نحوه حافظه اشغالی توسط آنها را بیان می‌کنیم.

در برنامه‌های ما دو نوع داده وجود دارد: نوع اول داده‌های پایه هر زبان هستند ( که معمولا انواع مختلفی از اعداد و کاراکترها هستند )، چیزی که نوع متغیر را مشخص می‌کند حافظه‌ای است که متغیر از حافظه اشغال می‌کند. مثلا وقتی ما در زبان C یک داده از نوع int تعریف می‌کنیم، 2 بایت در سیستم‌های 16 بیت و 4 بایت در سیستم‌های 32بیت حافظه اشغال می‌کند. بگذارید این مفهوم را بیشتر باز کنیم.

حافظه را یکسری خانه مرتب پشت سرهم در نظر می‌گیریم که هر کدام نشان دهنده یک بایت هستند. وقتی می‌گوییم متغیر ما 2 بایت حافظه اشغال می‌کند یعنی دو خانه پشت سر هم از حافظه اشغال می‌کند. هر خانه از حافظه دارای یک عدد صحیح است که نشان ‌دهنده آدرس آن است و معمولا آن‌را با یک عدد در مبنای 16 نمایش می‌دهند. آدرس از ابتدای حافظه محاسبه می‌شود مثلا خانه صفرم حافظه آدرسش برابر 0x00000000 است و همین‌طور خانه 1 برابر 0x00000001 و این عدد به‌صورت صعودی رشد می‌کند. مقداری از این حافظه در اختیار سیستم‌عامل است و بقیه توسط برنامه‌هایی که اجرا می‌شوند اختیار می‌شود (مبحث بخش‌بندی حافظه از حوصله این مقاله خارج است).

هر متغیری که تعریف می‌کنیم در یکسری خانه حافظه قرار می‌گیرد پس هر متغیر یک آدرس دارد و همیشه بایت اول آدرس متغیر است. مثلا اگر نوشتیم؛ int x یعنی یک متغیر از نوع x داریم که مثلا آدرس آن 0x2243FFE1 است و آدرس خانه بعدی یعنی بایت دوم آن برابر 0x2243FFE2 است. وقتی شما یک مقدار را به یک متغیر نسبت می‌دهید کامپایلر آدرس متغیر را پیدا کرده و مقدار مورد نظر را بایت به بایت در حافظه مورد نظر قرار می‌دهد.

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

اشاره‌گرها دقیقا مثل متغیرهای معمولی تعریف می‌شوند با این تفاوت که قبل از اسم آنها یک * قرار می‌گیرد. البته بعضی از کامپایلرها علامت * را بعد از نوع می‌گذارند که در باطن با روش قبلی تفاوتی ندارد مثلا int *x و int* x هیچ فرقی با هم نمی‌کنند.

قواعد نامگذاری اشاره‌گرها مثل متغیرهای معمولی است و مانند آنها انواعی دارند مثلا اشاره‌گری از نوع int داریم.

تفاوت اشاره‌گر نوع int با نوع float

پیش از اشاره به این تفاوت باید بگوییم که اشاره‌گر دقیقا به چه دردی می‌خورد و چرا از آن استفاده می‌شود.

اشاره‌گر برخلاف متغیر معمولی یک آدرس را در خود ذخیره می‌کند و نوع اشاره‌گر مشخص می‌کند آدرس مورد نظر چند بایت است، مثلا int *ptrX آدرس یک شروع ? خانه از حافظه را در خود ذخیره می‌کند. برای سادگی بیان می‌گوییم که ptrX به یک int اشاره می‌کند. وقتی ptrX تعریف می‌شود به خانه‌ای اشاره نمی‌کند برای این‌که به ptrX بگوییم به کجا اشاره بکن باید آدرس یک متغیر را به آن بدهیم، آدرس را با & نشان می‌دهند. مثلا x&یعنی آدرس متغیر x.

حال ما می‌خواهیم یک مقدار اشاره‌گر تعریف کنیم که به یک float اشاره می‌کند و آدرس متغیری از نوع float را در آن قرار دهیم:

Float x,*ptrx;

Ptrx = &x;

بسیار خب از اینجا به بعد هر جا که مقدار ptrx تغییر کرد مقدارx هم تغییر می‌کند، چون هر دو یک فضا از حافظه را نشان می‌دهند. در واقع ما یک کپی از متغیر x داریم که هر وقت مقدار آن‌را تغییر دادیم مقدار اصلی x نیز تغییر می‌یابد.

برای این‌که یک مقدار عددی را به اشاره‌گر بدهیم و در واقع به آن بگوییم که این مقدار را در آن خانه از حافظه که به آن اشاره می‌کنی قرار بده از عملوند * استفاده می‌کنیم. می‌خواهیم مقدار 10 را به متغیر x نسبت دهیم و این کار را هم از طریق ptrx انجام دهیم. این کار به‌صورت زیر انجام می‌شود.

*ptrx = 10;

کاربرد اشاره‌گرها

ـ یکی از پرکاربردترین موارد استفاده از اشاره‌گرها آرایه‌ها هستند. می‌توان گفت اساس کار آرایه‌ها اشاره‌گرها هستند.

ـ کاربرد دیگر اشاره‌گرها فراخوانی تابع به‌صورت ارجاع است. فرض کنید یک تابع دارید و یکسری متغیر به آن می‌دهید و می‌خواهید درون تابع روی آن متغیر‌ها تغییراتی ایجاد شود و این تغییرات بیرون تابع نیز دیده شوند. مثلا اگر متغیر x در تابع یکی زیاد شد مقدار آن در فراخوانی بعدی یا استفاده‌های دیگر از x برابرx+1 شود. برای این کار یک اشاره‌گر از x را به آن تابع پاس می‌دهید.

هفته بعد کاربرد‌های اشاره‌گرها را بیشتر توضیح خواهیم داد.

امیر بهاالدین سبط‌الشیخ

newsQrCode
ارسال نظرات در انتظار بررسی: ۰ انتشار یافته: ۰

نیازمندی ها