همانطور که می دانید زبان C دارای 4 نوع کلاس های حافظه می باشد که عبارتند از :
STATIC
REGISTER
EXTERN
AUTO
.................................................. ..
از اساتید خواهشمندم اگر امکانش هست این 4 نوع حافظه رو به صورت کامل توضیح بدهند
با تشکر![]()
همانطور که می دانید زبان C دارای 4 نوع کلاس های حافظه می باشد که عبارتند از :
STATIC
REGISTER
EXTERN
AUTO
.................................................. ..
از اساتید خواهشمندم اگر امکانش هست این 4 نوع حافظه رو به صورت کامل توضیح بدهند
با تشکر![]()
در واقع کلاس های حافظه C به دو بخش static و automatic تقسیم می شن که auto و register برا تعریف متغیرهای automatic و static و extern برا تعریف متغیرهای static هستن .
متغیرهای اتوماتیک وقتی ایجاد می شن که برنامه وارد بلاکی بشه که این متغیرها تعریف شدن . با خروج از اون بلاک این متغیرها هم نابود می شن .
متغیرهای محلی همان متغیرهای اتوماتیک هستن . شما معمولا همه متغیرهایی که تعریف می کنین auto هستن که این کلمه رو نمی نویسین . یعنی وقتی داخل حلقه for می نویسین int i = 0 . این همون auto int i = 0 هستش که auto به ندرت تایپ می شه .
اگه قبل از اعلان متغیری از register استفاده بشه این باعث میشه که این متغیر داخل یکی از ثبات های سی پی یو قرار می گیره تا سرعت پردازش بالایی داشته باشه . از این کلاس حافظه اصلا استفاده نمی شه . چون کامپایلر خودش تشخیص می ده که چه متغیری نیاز هست تا داخل ثبات قرار بگیره و چی نیاز نیست . چون حافظه ثبات خیلی خیلی محدود هست .
اما static .
فرض کنین داخل یه تابع یه متغیر معرفی کردین که با مقدار 1 مقداردهی اولیه میشه و بعد داخل تابع عملیاتی روش انجام میشه و مقدارش تغییر پیدا می کنه .
حالا هزار بارم ما این تابع رو فراخوانی کنیم همون اول مقدار 1 می گیره . حالا اگه بخوایم مقدار قبلیشو(یعنی مقداری که قبل از فراخوانی قبلی تو متغیر ذخیره شده ) نگه داره اونو در ابتدای تابع static اعلان می کنیم . متغیرهای static یک بار و فقط یک بار در ابتدا یعنی هنگام اعلان مقدار دهی می شن .
از متغیرهای extern هم برای اعلام متغیرهای سراسری و متغیرهایی که قراره تو چند فایل استفاده بشه استفاده میشه .
خیلی ممنون از اطلاعات خوبی که ارائه کردید.
اگر می شه کمی بیشتر مطلب رو توضیح بدهید!
ممنون![]()
هر کجاش رو میگین من اونجا رو بیشتر توضیح بدم .![]()
من متوجه نشدم الان به چند دسته تقسیم شد?در واقع کلاس های حافظه C به دو بخش static و automatic تقسیم می شن که auto و register برا تعریف متغیرهای automatic و static و extern برا تعریف متغیرهای static هستن
auto با automatic فرق می کنه?
این رو هم به طور کل متوجه نشدماما static .
فرض کنین داخل یه تابع یه متغیر معرفی کردین که با مقدار 1 مقداردهی اولیه میشه و بعد داخل تابع عملیاتی روش انجام میشه و مقدارش تغییر پیدا می کنه .
حالا هزار بارم ما این تابع رو فراخوانی کنیم همون اول مقدار 1 می گیره . حالا اگه بخوایم مقدار قبلیشو(یعنی مقداری که قبل از فراخوانی قبلی تو متغیر ذخیره شده ) نگه داره اونو در ابتدای تابع static اعلان می کنیم . متغیرهای static یک بار و فقط یک بار در ابتدا یعنی هنگام اعلان مقدار دهی می شن .
مابقی اطلاعات خیلی عالی بود.دست گل شما درد نکنه
---------- Post added at 11:01 AM ---------- Previous post was at 10:58 AM ----------
تنها چیز مفیدی که تونستم توی نت پیدا کنم البته بعداز این انجمن
کد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
بله . auto یه کلمه کلیدی تو ++C هست که باهاش میشه متغیرهای اتوماتیک تعریف کرد ولی automatic نوع این کلاس حافظه هست . یعنی با auto میشه یه متغیر از نوع کلاس حافظه automatic تعریف کرد . اصلا این automatic رو بی خیال شین .auto با automatic فرق می کنه?
کد زیر رو در نظر بگیرین :این رو هم به طور کل متوجه نشدم
یه تابع foo داریم که توش یه متغیر از نوع static تعریف کردیم . این متغیر در ابتدا مقدار 4 می گیره . بعد یدونه بهش اضافه می شه و همونو برمیگردونیم که میشه 5 . بعد اونو تو تابع main تو متغیر c ذخیره می کنیم و چاپ می کنیم . که 5 چاپ میشه .کد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
حالا دوباره میایم تابع foo رو فراخوانی می کنیم . این بار دیگه دوباره مقدار 4 بهش اختصاص داده نمیشه . مقدار قبلی که تو آخرین فراخوانی توش مونده بود رو الان داره . یعنی 5 . حالا یدونه اضافه میشه که میشه 6 و 6 برگشت داده میشه .
حالا تو main عدد 6 چاپ میشه . در حالی که اگه همون متغیر w رو تو تابع foo از نوع auto یا همون int خالی تعریف می کردیم هر دفعه مقدار 4 می گرفت و یدونه اضافه می شد و 5 چاپ می شد تا آخر .
توی کتاب برنامه نویسی شی گرا به ترجمه یا تالیف(دقیق یادم نمیاد) ابراهیم زاده ی قلزم هم توضیحات خوبی در این مورد داده شده.
ترجمه از کتاب دیتل هستش .
هم اکنون 1 کاربر در حال مشاهده این تاپیک میباشد. (0 کاربر عضو شده و 1 مهمان)