کلاس‌های ذخیره سازی در C همراه با مثال auto، extern، static، register

در این جلسه کلاس‌های ذخیره سازی در C را بررسی میکنیم. اما قبل از آن اجازه دهید یک سوال مهم را جواب دهیم. کلاس ذخیره سازی(Storage Class) چیست؟ کلاس ذخیره سازی بیانگر مکان و قابلیت رویت یک متغیر است. کلاس به ما می گوید که از کدام بخش کد می توان به متغیر دسترسی داشت. کلاس ذخیره سازی برای توصیف موارد زیر بکار می رود:

  • دامنه متغیر (variable scope)
  • مکانی که متغیر در آن ذخیره می شود.
  • مقدار اولیه ی یک متغیر
  • طول عمر متغیر
  • چه کسی می تواند به متغیر دسترسی داشته باشد؟

بنابراین کلاس ذخیره سازی برای بیان اطلاعات یک متغیر استفاده می شود.

نکته: یک متغیر نه تنها به نوع داده و محتوایش وابسته است بلکه به کلاس ذخیره سازی هم وابستگی دارد.

در کل چهار نوع کلاس ذخیره سازی استاندارد وجود دارد. جدول زیر کلاس‌های ذخیره سازی در C را نشان می دهد.

کلاس ذخیره سازی هدف

auto

کلاس ذخیره سازی پیش فرض می باشد.

extern

متغیر سراسری است.

static

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

register

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

در این مبحث خواهیم آموخت:

  • کلاس ذخیره سازی Auto
  • کلاس ذخیره سازی Extern
    • فایل اول: c
    • فایل دوم: c
  • کلاس ذخیره سازی Static
  • کلاس ذخیره سازی Register

کلاس ذخیره سازی Auto

متغیر تعریف شده با کلاس auto مانند متغیرهای محلی هستند.auto مخفف automatic است. متغیری که کلاس ذخیره سازی آن به صورت صریح مشخص نباشد به صورت پیش فرض auto است. دامنه یک متغیر auto محدود به بلوک خود است. وقتی که کنترل به خارج از بلوک منتقل شود، دسترسی به متغیر از بین می رود. این بدان معنا است که تنها بلوکی که متغیر auto در آن اعلان می شود به آن دسترسی دارد.

کلیدواژه auto برای تعریف کلاس ذخیره سازی auto استفاده می شود. به صورت پیش فرض، متغیر auto حاوی یک مقدار زائد می باشد.

Example, auto int age;

برنامه زیر یک تابع با دو متغیر محلی تعریف می کند

int add(void) {

   int a=13;

   auto int b=48;

return a+b;}

برنامه دیگری در زیر آمده که “سطح رویت”(visibility level) سطح دامنه را برای یک متغیر auto در هر بلوک مستقل نشان می دهد:

#include <stdio.h>

int main( )

{

  auto int j = 1;

  {

    auto int j= 2;

    {

      auto int j = 3;

      printf ( " %d ", j);

    }

    printf ( "\t %d ",j);

  }

  printf( "%d\n", j);}

خروجی

3 2 1

کلاس ذخیره سازی Extern

Extern مخفف external می باشد. کلاس ذخیره سازی extern برای تعریف توابع و یا متغیرهای سراسری بکار می رود که بین دو یا چند فایل به اشتراک گذاشته می شوند. کلیدواژه extern برای اعلان یک متغیر یا تابع سراسری درون فایل دومی بکار می رود تا به تابع یا متغیری که در درون فایل اصلی(original) تعریف شده است ارجاع داده شود.

مطلب پیشنهادی:  حلقه ها در زبان C

متغیرهای تعریف شده با کلیدواژه extern متغیرهای سراسری نامیده می شوند. این متغیرها در همه جای برنامه قابل دسترسی هستند. دقت کنید که متغیر extern را نمی توان مقداردهی اولیه کرد زیرا این متغیرها قبلاً در فایل اصلی(original) تعریف شده اند.

Example, extern void display();

فایل اول: main.c

#include <stdio.h>

extern i;

main() {

   printf("value of the external integer is = %d\n", i);

   return 0;}

فایل دوم: original.c

#include <stdio.h>

i=48;

نتیجه:

value of the external integer is = 48

برای کامپایل و اجرای کد بالا، مراحل زیر را دنبال کنید:

گام 1) یک پروژه جدید در Code::Block ایجاد کنید

  1. Console Application را انتخاب کنید.
  2. روی Go کلیک کنید.

کلاس‌های ذخیره سازی در C

گام دوم) C را انتخاب کرده و Next بزنید.

کلاس‌های ذخیره سازی در C

گام سوم) روی Next کلیک کنید.

کلاس‌های ذخیره سازی در C

گام چهارم)  جزئیات را وارد کرده و Next بزنید.

کلاس‌های ذخیره سازی در C

گام پنجم) روی finish کلیک کنید.

کلاس‌های ذخیره سازی در C

گام ششم) کد اصلی را همانند برنامه قبلی در فایل main.c قرار داده و ذخیره کنید.

کلاس‌های ذخیره سازی در C

گام هفتم) یک فایل C جدید ایجاد کنید   File -> new -> Empty File، آن را ذخیره کنید(با نام original.c) و با زدن گزینه “OK” در پنجره محاوره ای آن را به پروژه اضافه کنید.

کلاس‌های ذخیره سازی در C

گام هشتم) کد C فایل original.c نشان داده شده در مثال قبلی را بدون تابع ()main ذخیره کنید.

کلاس‌های ذخیره سازی در C

گام نهم) پروزه را Build کرده و اجرا کنید. نتیجه در شکل بعد آمده است.

مطلب پیشنهادی:  تفاوت بین C و ++C

کلاس‌های ذخیره سازی در C

 کلاس ذخیره سازی Static

متغیرهای static درون تابع/فایل به صورت متغیرهای محلی ایستا استفاده می شوند. همچنین می توان از آنها به عنوان متغیر سراسری استفاده کرد.

  • متیغر محلی ایستا متغیری است که مقدار خود را در میان فراخوانی توابع و بلوک ها حفظ کرده و تنها قابل مشاهده برای تابع یا بلوکی است که در آن تعریف شده است.
  • متغرهای سراسری ایستا متغیرهایی هستند که تنها قابل مشاهده برای فایلی است که در آن اعلان شده است.
Example: static int count = 10;

به یاد داشته باشید که متغیرهای ایستا مقدار اولیه پیش فرض صفر دارند و تنها یکبار در طول عمرشان مقداردهی اولیه می شوند.

#include <stdio.h> /* function declaration */

void next(void);

static int counter = 7; /* global variable */

main() {

 while(counter<10) {

      next();

      counter++;   }

return 0;}

void next( void ) {    /* function definition */

   static int iteration = 13; /* local static variable */

   iteration ++;

   printf("iteration=%d and counter= %d\n", iteration, counter);}

نتیجه:

iteration=14 and counter= 7

iteration=15 and counter= 8

iteration=16 and counter= 9

متغیرهای سراسری در همه جای فایل قابل دسترسی هستند حال آن که متغیرهای ایستا تنها در بخش خاصی از کد قابل دسترسی هستند.

طول عمر متغیر ایستا برابر کل زمان برنامه است. متغیری که با کلیدواژه static اعلان یا مقداردهی اولیه می شود همیشه مقدار صفر را به عنوان مقدار پیش فرض دارد.

کلاس ذخیره سازی Register

اگر  بخواهیم برای دسترسی سریع تر به متغیرهای محلی درون توابع یا بلوک ها، آنها را به جای ذخیره در حافظه RAM در رجیسترهای CPU ذخیره کنیم، از کلاس ذخیره سازی register استفاده می کنیم. برای مثال “شمارنده ها”  کاندیدای خوبی برای ذخیره سازی در رجیستر هستند.

Example: register int age;

کلیدواژه register برای اعلان کلاس ذخیره سازی register استفاده می شود. متغیرهای اعلان شده با کلاس ذخیره سازی register طول عمری برابر کل زمان برنامه دارند.

این کلاس شبیه کلاس ذخیره سازی auto است. متغیر محدود به یک بلوک خاص است. تنها تفاوتی که وجود دارد این است که متغیرهای اعلان شده با کلاس register بجای ذخیره شدن در حافظه RAM در رجیسترهای CPU ذخیره می شوند. رجیسترها دسترسی سریعتری نسبت به حافظه اصلی دارند.

مطلب پیشنهادی:  دستورات شرطی در زبان C

متغیرهای اعلان شده با کلاس register مقدار پیش فرضی ندارند. این متغیرها معمولاً در ابتدای برنامه اعلان می شوند.

#include <stdio.h> /* function declaration */

main() {

{register int  weight;

int *ptr=&weight ;/*it produces an error when the compilation occurs ,we cannot get a memory location when dealing with CPU register*/}

}

خروجی

error: address of register variable 'weight' requested

جدول زیر خلاصه ای از کلاس ها ذخیره سازی و ویژگی های اصلی آن ها که در برنامه نویسی C پرکاربرد هستند را آورده است.

کلاس ذیخره سازی اعلان محل ذخیره مقدار اولیه پیش فرض دامنه طول عمر

auto

درون تابع/بلوک حافظه غیر قابل پیش بینی درون تابع/بلوک درون تابع/بلوک

register

درون تابع/بلوک رجیسترهای CPU زائد درون تابع/بلوک درون تابع/بلوک

extern

خارج از تابع حافظه صفر سرتاسر فایل یا فایل های دیگری که به صورت extern اعلان شده باشد هنگام اجرای برنامه

Static (local)

درون تابع/بلوک حافظه صفر درون تابع/بلوک هنگام اجرای برنامه

Static (global)

خارج از تابع حافظه صفر سراسری هنگام اجرای برنامه

خلاصه کلاس‌های ذخیره سازی در C

در این مبحث، درباره کلاس‌های ذخیره سازی در C صحبت کردیم، به صورت خلاصه:

  • کلاس ذخیره سازی برای بیان اطلاعات اضافی یک متغیر استفاده می شود.
  • کلاس هاذخیره سازی دامنه و طول عمر یک متیغر را مشخص می کند.
  • همچنین بیان کننده این است که چه کسی به متغیر دسترسی داشته باشد
  • Auto، extern، register، static چهار کلاس ذخیره سازی در C هستند.
  • Auto برای تعریف یک متغیر محلی درون یک بلوک یا تابع به کار می رود.
  • Register برای ذخیره متغیر درون رجیسترهای CPU بجای حافظه ،جهت دسترسی سریعتر استفاده می شود.
  • Static هم برای متغیر سرتاسری و هم متغیر محلی استفاده می شود. هر کدام کاربرد خود را در زبان C دارند.
  • Extern برای اشتراک داده بین پروژه های زبان C استفاده می شود.

اگر این نوشته‌ برایتان مفید بود لطفا کامنت بنویسید.

مطالعه دیگر جلسات این آموزش<< جلسه قبلی                    جلسه بعدی >>

دیدگاهتان را بنویسید

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