آموزش زبان 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;
}

توضیح نکات کد بالا:

  1. int number = 10; یک متغیر معمولی به نام number با مقدار 10 ایجاد می‌کند.
  2. int *p; یک اشاره‌گر به نام p تعریف می‌کند که می‌تواند آدرس یک متغیر از نوع int را ذخیره کند. (علامت * در اینجا برای تعریف اشاره‌گر است، نه برای دسترسی به مقدار).
  3. p = &number; با استفاده از عملگر آدرس (&، که به آن "آدرسِ" گفته می‌شود)، آدرس متغیر number را در حافظه پیدا کرده و داخل p قرار می‌دهد. حالا p به number اشاره می‌کند.

نکته کلیدی:

  • فرق بین int *p و int p: اولی یک اشاره‌گر است (آدرس را نگه می‌دارد)، دومی یک متغیر معمولی است (مقدار را نگه می‌دارد).
  • اگر اشاره‌گر به جایی اشاره نکند (مقداردهی اولیه نشده باشد)، ممکن است باعث خطا شود. به همین دلیل بهتر است آن را با NULL مقداردهی اولیه کنید: `int *p = NULL;
پرسش و پاسخ این درس

برای ثبت پرسش ابتدا در سایت وارد شوید.

  • 1
  • 2
  • 3
  • 4
  • 5