آموزش زبان C | اشارهگرها
خطای دسترسی
برای ثبت پاسخ، ابتدا باید در سایت وارد شوید.
تعریف اشارهگر
اشارهگر (Pointer) یکی از مفاهیم قدرتمند و مهم در زبان C است. به زبان ساده، اشارهگر یک متغیر است که به جای نگهداری یک مقدار معمولی مانند عدد یا حرف، آدرس حافظه یک متغیر دیگر را ذخیره میکند. یعنی اشارهگر به جای خود مقدار، به محل ذخیرهسازی آن مقدار در حافظه کامپیوتر اشاره میکند.
برای درک بهتر، حافظه کامپیوتر را مانند یک خیابان با خانههای شمارهدار تصور کنید. هر خانه (متغیر) یک شماره منحصربهفرد (آدرس) دارد. یک اشارهگر مانند کاغذی است که شماره یک خانه خاص روی آن نوشته شده است. با دیدن آن کاغذ، میدانید کدام خانه را باید پیدا کنید.
مثال تصور ذهنی:
- یک متغیر
xرا در نظر بگیرید که مقدار آن5است. اینxدر یک آدرس خاص در حافظه (مثلاً آدرس1000) ذخیره شده است. - یک اشارهگر به نام
ptrکه بهxاشاره میکند، مقدار آدرس1000را در خود نگه میدارد. خودptrهم در جای دیگری از حافظه (مثلاً آدرس2000) ذخیره میشود.
مزیت اشارهگرها:
- اشتراکگذاری داده: به جای کپی کردن مقادیر بزرگ (مثل آرایهها)، میتوانید فقط آدرس آنها را به تابع بدهید تا سرعت و کارایی افزایش یابد.
- تغییر مقدار خارج از تابع: وقتی یک اشارهگر را به یک تابع میفرستید، تابع میتواند مستقیماً مقدار متغیر اصلی را تغییر دهد (بر خلاف کپی مقدار که فقط درون تابع تغییر میکند).
- مدیریت حافظه پویا: برای تخصیص حافظه در زمان اجرای برنامه (مثل ساختن لیستهای پیوندی)، اشارهگرها ضروری هستند.
نحوه تعریف اشارهگر در کد:
برای تعریف یک اشارهگر، از علامت * (ستاره) قبل از نام متغیر استفاده میکنیم. نوع داده اشارهگر نیز باید با نوع متغیری که به آن اشاره میکند، مطابقت داشته باشد.
int main() {
int number = 10; // یک متغیر معمولی از نوع int
int *p; // تعریف یک اشارهگر از نوع int (هنوز به جایی اشاره نمیکند)
p = &number; // عملگر & آدرس متغیر number را میگیرد و به p میدهد
// در اینجا p حاوی آدرس number است و خود عدد 10 نیست
return 0;
}
توضیح نکات کد بالا:
int number = 10;یک متغیر معمولی به نامnumberبا مقدار 10 ایجاد میکند.int *p;یک اشارهگر به نامpتعریف میکند که میتواند آدرس یک متغیر از نوعintرا ذخیره کند. (علامت*در اینجا برای تعریف اشارهگر است، نه برای دسترسی به مقدار).p = &number;با استفاده از عملگر آدرس (&، که به آن "آدرسِ" گفته میشود)، آدرس متغیرnumberرا در حافظه پیدا کرده و داخلpقرار میدهد. حالاpبهnumberاشاره میکند.
نکته کلیدی:
- فرق بین
int *pوint p: اولی یک اشارهگر است (آدرس را نگه میدارد)، دومی یک متغیر معمولی است (مقدار را نگه میدارد). - اگر اشارهگر به جایی اشاره نکند (مقداردهی اولیه نشده باشد)، ممکن است باعث خطا شود. به همین دلیل بهتر است آن را با
NULLمقداردهی اولیه کنید: `int *p = NULL;
برای ثبت پرسش ابتدا در سایت وارد شوید.