سلام رفقای برنامه‌نویس! توی این مقاله قراره با یه مفهوم مهم آشنا بشیم: Storage Class یا کلاس حافظه در زبان برنامه‌نویسی C. هر متغیر نه‌تنها یه نوع داده داره، بلکه یه کلاس حافظه هم داره که مشخص می‌کنه متغیر تا کجا قابل دسترسه و چقدر عمر می‌کنه.

چهار کلاس حافظه در C

  • auto یا اتوماتیک
  • extern یا خارجی (سراسری)
  • static یا ایستا
  • register یا ثبات

🔸 متغیر محلی (Automatic)

متغیرهایی که داخل یک بلوک مثل حلقه یا تابع تعریف می‌شن، کلاس حافظه‌شون اتوماتیکه و فقط داخل همون محدوده قابل استفاده‌ن.

#include <stdio.h>

int main(void) {
    for (int counter = 0; counter < 3; ++counter) {
        printf("Looping\n");
    }

    // printf("%d", counter);  // خطا: متغیر خارج از محدوده‌اش استفاده شده
    return 0;
}

تو این مثال، متغیر counter داخل بلوک حلقه تعریف شده و بیرون از اون قابل دسترس نیست.

🔹 متغیر سراسری (External)

اگه متغیر خارج از همه توابع تعریف بشه، بهش می‌گن متغیر سراسری و در کل برنامه قابل استفاده‌ست.

#include <stdio.h>

int data = 10;  // متغیر سراسری

void show();

int main() {
    ++data;
    show();
    return 0;
}

void show() {
    ++data;
    printf("data = %d\n", data);
}

خروجی: data = 12

اگه بخوای یه متغیر سراسری رو از فایل دیگه‌ای استفاده کنی، از کلمه کلیدی extern استفاده می‌کنی. اینطوری کامپایلر می‌فهمه که متغیر تو یه فایل دیگه تعریف شده.

🔸 متغیر ثبات (Register)

با کلمه کلیدی register می‌تونی به کامپایلر پیشنهاد بدی که متغیر رو توی ثبات CPU ذخیره کنه، برای دسترسی سریع‌تر. مثلاً:

register int speedCounter;

البته کامپایلرهای امروزی خودشون خیلی خوب بهینه‌سازی انجام می‌دن و این دستور اغلب نادیده گرفته می‌شه.

🔹 متغیر استاتیک (Static)

با static متغیر طوری تعریف می‌شه که عمرش تا پایان اجرای برنامه باقی می‌مونه، حتی اگه داخل تابع باشه.

مثال: متغیر استاتیک در تابع

#include <stdio.h>

void counterUp();

int main() {
    counterUp();
    counterUp();
    return 0;
}

void counterUp() {
    static int level = 2;  // فقط بار اول مقداردهی میشه
    level += 4;
    printf("level = %d\n", level);
}

خروجی:

level = 6
level = 10

همون‌طور که می‌بینی، مقدار متغیر level بعد از اولین فراخوانی تابع حفظ می‌شه و تغییرات توی فراخوانی‌های بعدی ادامه پیدا می‌کنن.

👀 جمع‌بندی

کلاس حافظه دامنه طول عمر
auto بلوک فعلی تا پایان بلوک
extern همه فایل‌ها کل برنامه
static فایل / بلوک تا پایان برنامه
register بلوک فعلی تا پایان بلوک

امیدواریم این آموزش براتون مفید بوده باشه! این مقاله توسط سایت علمی رایشمند برای شما آماده شده است.