خانه / دوره آموزش مقدماتی C و ++C / قسمت هفدهم آموزش C – کلاسهای حافظه

قسمت هفدهم آموزش C – کلاسهای حافظه

تاکنون برنامه هایی را نوشته ایم که در بعضی از آنها از چند تابع نیز استفاده شده است . در این برنامه ها متغیرهای مورد نیاز هر تابع را در همان تابع تعریف کرده ایم . متغیرهایی که در یک تابع تعریف می شوند در موقع انتقال کنترل اجرای برنامه به آن تابع ایجاد شده ( حافظه به آنها تخصیص داده می شود ) و در موقع برگشت کنترل اجرای برنامه از آن تابع ، حافظه تخصیص یافته به متغیرهای آن تابع از آنها اخذ میشود و به سیستم عامل برگردانده خواهد شد. یعنی این گونه متغیرها فقط در همان تابعی که تعریف یم شوند اعتبار دارند و در تابع دیگر قابل استفاده نیستند . این مساله حتی در مورد متغیرهای همنام نیز صادق است . بدین معنی که اگر به عنوان مثال متغیری به نام I در تابع اصلی ()main وجود داشته باشد ومتغیری تحت همین نام در تابع فرعی دیگری که توسط تابع ()main فراخوانی می شود تعریف گردد این دو متغیر کاملا از یکدیگر مجزا خواهند بود و در حافظه ، دو محل جداگانه برای آنها در نظر گرفته می شود و هرگونه تغییر در یکی از آنها ، در دیگری تاثیری نخواهد داشت .

مثال ۱: برنامه ای که چگونگی استفاده از متغیرهای همنام را در توابع مختلف نشان می دهد .

#include <stdio.h>
#include <conio.h>
void input();
void main()
{
int i ;
printf("enter the value of i:");
scanf("%d",&i );
input();
printf("\nvalue of i in main is:");
printf("%d",i);
getch();
}
void input()
{
int i ;
printf("enter value of i");
printf("(in function:)");
scanf("%d",&i);
printf("\nvalue of i in function is:");
printf("%d",i);
}

به نمونه ای از خروجی حاصل از اجرای برنامه مثال ۱ که درپاسخ به اولین دستور scanf عدد ۱۰ و در پاسخ به دومین دستورscanf عدد ۴۰ وارد شده است توجه نمایید :

enter the value of i:10
enter vale of i(in function:)40
vale of i in function is: 40
value of i in main is : 10

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

۱ مدت حضور آن در برنامه یا طول عمر (life time) متغیر .

۲ محدوده حضور آن در برنامه (scope vvisibility) .
یکی از علل مطالعه کلاس های حافظه این است که با داشتن اطلاعاتی در مورد مدت حضور متغیرها در برنامه و همچنین محدوده حضور آنها ، می توانیم برنامه هایی
بنویسیم که :

۱ از حافظه کامپیوتر به نحو خوبی استفاده گردد .

۲ سرعت اجرای آنها بالا باشد .

۳ برنامه ها کمتر با خطا مواجه شوند و عیب یابی سهل تر گردد .

کلاس های حافظه ای که در زبان C از آنها استفاده می شود عبارتند از :

کلاس حافظه اتوماتیک (automatic) .
کلاس حافظه استاتیک (static) .
کلاس حافظه ثبات (register) .
کلاس حافظه خارجی (extern) .

کلمات کلیدی auto ، static ، register و extern بترتیب مشخص کننده کلاس های حافظه اتوماتیک ، استاتیک ، ثبات و خارجی هستند. این کلمات قبل از کلمات کلیدی
تعیین نوع متغیر بکار می روند .

کلاس حافظه اتوماتیک

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

۱ – وقتی در یک تابع و یا یک بلاک تعریف می شوند فقط درآن تابع و یا بلاک قابل دسترسی اند .

۲ –  در موقع ورود به تابع و یا بلاک به آنها حافظه اختصاص می یابد .

۳ –  در هنگام خروج از تابع و یا بلاک ، حافظه اختصاص یافته به آنها، پس گرفته می شود .

متغیرهای اتوماتیک می توانند مقدار اولیه بگیرند . اگر ارزش اولیه این گونه متغیرها در تابعی صورت گیرد که این تابع چندین بار فراخوانی می گردد ، هر بار اجرای تابع ، مقدار اولیه به آن میگردد ( برخلاف متغیرهای با کلاس حافظه استاتیک که ارزش دهی اولیه فقط یکبار انجام می شود ) .

متغیرهای عمومی و کلاس حافظه خارجی

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

متغیرهای عمومی ، دارای کلاس حافظه خارجی (extern) هستند و دارای دو خصیصه زیر می باشند :۱ – طول عمر این متغیرها ، از بدو اجرای برنامه تا خاتمه اجرای آن است .

۲ – محدوده حضور آنها در سراسر یک برنامه است .

کلاس حافظه استاتیک

متغیرهایی که دارای کلاس حافظه استاتیک هستند می توانند به دو دسته تقسیم شوند :
الف ) متغیرهای استاتیک محلی
ب ) متغیرهای استاتیک عمومی

متغیرهای استاتیک محلی دارای خواص زیر هستند :
۱ – فقط در همان تابعی که تعریف شده اند قابل دسترسی اند ( حضور دارند ) .

۲ – در هنگام خروج از تابع ، مقادیر متغیرها آخرین مقداری خواهد بود که در تابع به آنها اختصاص یافته است .

۳ – می توانند مقدار اولیه بگیرند .

۴ – اگر متغیر استاتیک محلی مقدار اولیه بگیرد ، این ارزش دهی اولیه ، فقط یکبار صورت می گیرد ( این مطلب را از مورد ۲ نیز می توان نتیجه گرفت ) .

کلاس حافظه ثبات

ذخیره هایی که دارای کلاس حافظه هستند در صورت امکان در یکی از ثبات های CPU قرار می گیرند . لذا سرعت انجام عملیات با آنها بسیار بالا است و موجب افزایش
سرعت اجرای برنامه می شود . کلیه متغیرهای اتوماتیک و آرگومان های توابع می توانند دارای کلاس حافظه ثبات باشند . در مورد کلاس حافظه ثبات محدودیتهای زیر را داریم :

۱ – از آنجایی که تعداد ثباتهای CPU محدود است ، تعداد کمی از متغیرها را می توان با کلاس حافظه ثبات تعریف کرد . اگر تعداد متغیرهای با کلاس حافظه ثبات زیاد باشد کامپایلر کلاس حافظه ثبات را از متغیرها حذف می کند .

۲ – انواع متغیرهایی که میتوانند دارای کلاس حافظه ثبات باشند، درکامپیوترهای مختلف متفاوت است و معمولا نوع های int ، char ، pointer می توانند دارای کلاس حافظه ثبات باشند .

۳ – آدرس متغیری که دارای کلاس حافظه ثبات باشد، عملا مفهوم نخواهد داشت و یا به عبارت دیگر، عملگر & را نمیتوان برای متغیرهای با کلاس حافظه ثبات بکار گرفت ( چون این متغیرها در ثبات CPU قرار دارند ) .

نقد و بررسی

User Rating: ۲٫۳۶ ( ۲ votes)

درباره ی آریـان پــور

سلام . آریــان پور هستم . از نویسندگان میکروپـدیا .. علاقه مــند به برنامه نویسی و طراحی وب و شبکه ! دیدگاه ها و نظرات شما دوستان بررسی میشه و باعث دلگرمـی برای نوشتن مطالب بهتر و به روزتر . در تماس باشید با : aryanpour [at] micropedia [dot] ir با مـا همراه باشید ..

همچنین ببینید

قسمت بیست و چهارم آموزش C – عملگرهای اشاره گر

این جلسه بسیار ساده و کوتاه خواهد بود. دو عملگر در مورد اشاره گرها مورد …

یک دیدگاه

  1. سلام – خسته نباشی داش – یکم مطلب رو بی روخ نوشتی – برا زیر عنوان ها از تگ h2 و… استفاده کن – بعضی کلمات رو بولد کن رنگ بده و …
    با آرزوی موفقیت در تمام مراحل

پاسخ دهید

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

پاسخ عبارت زیر را وارد کنید: *