در این آموزش با دامنه و طول عمر متغیرهای محلی و سراسری و همچنین متغیرهای استاتیک و ثبات نیز آشنا خواهید شد.
هر متغیر در برنامه نویسی C دو ویژگی دارد: typeو storage class.
type یا نوع به نوع داده یک متغیر اشاره دارد و storage class یا کلاس حافظه برای تعیین دامنه، میدان دید و طول عمر یک متغیر می باشد.
۴ نوع کلاس حافظه وجود دارد:
- اتوماتیک (automatic)
- خارجی (external)
- استاتیک (external)
- ثبات (register)
متغیر محلی
به متغیرهای تعریف شده در داخل یک بلوک متغیرهای اتوماتیک یا محلی (Local Variable) گفته می شود. متغیرهای محلی فقط در داخل بلوکی که در آن تعریف شده اند، وجود دارند و قابل دسترسی اند. مثال،
#include <stdio.h>
int main(void) {
for (int i = 0; i < 5; ++i) {
printf(“C programming”);
}
// در این نقطه تعریف نشده است i خطا می دهد! متغیر
printf(“%d”, i);
return 0;
}
هنگامی که برنامه بالا را اجرا کنید، با خطای “undeclared identifier i” مواجه خواهید شد. به این دلیل که متغیر i در بلوک حلقه for تعریف شده است و خارج از آن ناموجود و غیرقابل دسترس است. یک مثال دیگر،
int main() {
int n1; // است main() یک متغیر محلی در تابع n1 متغیر
}
void func() {
int n2; // است func() یک متغیر محلی در تابع n2 متغیر
}
در مثال بالا متغیر n1 یک متغیر محلی برای main() و n2 یک متغیر محلی برای تابع func() است. یعنی نمی توانید به متغیر n1 در داخل func() دسترسی پیدا کنید زیرا در داخل main() تعریف شده و فقط در این تابع موجود و قابل دسترس است. به همین ترتیب نمی توانید به متغیر n2 در تابع main() دسترسی پیدا کنید چون فقط در داخل func() وجود دارد.
متغیر سراسری
متغیرهایی که خارج از همه توابع تعریف می شوند به عنوان متغیرهای خارجی یا سراسری (Global) شناخته می شوند. این متغیرها در هر تابعی و در همه جای برنامه قابل دسترس هستند.
مثال ۱: متغیر سراسری
#include <stdio.h>
void display();
int n = 5; // متغیر سراسری
int main()
{
++n;
display();
return 0;
}
void display()
{
++n;
printf(“n = %d”, n);
}
خروجی
n = 7
متغیر n خارج و بالای همه توابع تعریف شده است. دستور ++n در تابع main() یک واحد به این متغیر اضافه می کند. در ادامه در تابع display نیز با دستور ++n دوباره به متغیر سراسری n دسترسی شده و یک واحد دیگر به آن اضافه شده است، اکنون مقدار این متغیر برابر با ۷ است که در خروجی چاپ شده است.
فرض کنید یک متغیر سراسری در file1 تعریف کرده اید اگر سعی کنید از این متغیر در یک فایل دیگر مثل file2 استفاده کنید، کامپایلر ایراد می گیرد. برای حل این مشکل از کلمه کلیدی extern در file2 استفاده می شود که نشان می دهد ایت یک متغیر خارجی است و در فایل دیگری تعریف شده است.
متغیر ثبات
از کلمه کلیدی register برای تعریف متغیرهای ثبات استفاده می شود. تصور می شد که متغیرهای register سریعتر از متغیرهای محلی باشند. کامپایلرهای مدرن در بهینه سازی کد بسیار خوب عمل می کنند و احتمال خیلی کمی وجود دارد که با استفاده از متغیرهای ثبات برنامه سریعتر شود.
متغیر استاتیک
static int i;
طول عمر یک متغیر استاتیک تا پایان برنامه ادامه دارد.
مثال ۲: متغیر استاتیک
include <stdio.h>
void display();
int main()
{
display();
display();
}
void display()
{
static int c = 1;
c += 5;
printf(“%d “,c);
}
خروجی
۶ ۱۱
در اولین فراخوانی تابع متغیر c با ۱ مقداردهی اولیه شده سپس مقدار آن با عدد ۵ جمع می شود. اکنون مقدار متغیر c برابر با ۶ است که روی صفحه چاپ می شود.
در طی فراخوانی دوم تابع، متغیر c دوباره مقداردهی اولیه نمی شود چون یک متغیر استاتیک است بلکه مقدار قبلی آن ۵ واحد افزایش یافته و به ۱۱ می رسد و دوباره چاپ می شود.