আমরা যখন কোন ভেরিয়েবল ডিক্লেয়ার করি তখন তা ডিফল্টভাবে র্যামে (মেইন মেমোরী) -তে জমা হয়। আমরা ইচ্ছা করলে ভেরিয়েবল কোথায় জমা হবে তা নির্ধারণ করে দিতে পারি এবং ভেরিয়েবলটি কতক্ষন র্যামে জমা থাকবে তাও নিধারন করতে পারি। সাধারন Storage Class Specifier এর সাহায্যে এগুলো করা হয়। সি তো মোট চারটি Storage Class Specifier আছে। এগুলো হলোঃ
১। auto
২। extern
৩। static
৪। register
auto:
আমরা সাধারণত নিচের মতো করে ভেরিয়েবল ডিক্লেয়ার করে থাকি।
int var1;
char var2;
float var3;
double var4;
এখন এই ভেরিয়েবলগুলো মেইন মেমোরিতে জমা হয়ে থাকে। এই ভেরিয়েবলগুলোর সামনে যদি auto specifier ব্যাবহার করা হয় তাহলেও এগুলো মেইন মেমোরিতে জমা হবে। কারণ, যেকোন ভেরিয়েবল ডিক্লেয়ার করার সময়ই auto দেওয়া হয়ে যায়। অর্থাৎ,
auto int var1; এবং int var1; এই দুটি ডিক্লেয়ারেশন একই অর্থ বহন করে থাকে।
extern
ধরো তুমি একটি গেম বানানোর জন্য প্রোগ্রাম করছো। তোমার গেমের জন্য তুমি দুটো সি ফাইল তৈরী করেছো। একটি হলো main.c এবং আরেকটি game_play.c । এখন main.c তে তুমি একটি ভেরিয়েবল ডিক্লেয়ার করেছো
int startPlay;
এখন এই ভেরিয়েবলটি তুমি game_play.c তে ব্যাবহার করতে চাচ্ছো। এক্ষেত্রে তোমাকে extern storage specifier ব্যাবহার করতে হবে। অর্থাৎ storage specifier দিয়ে তুমি অন্য একটি ফাইলের ভেরিয়েবলকে ব্যাবহার করতে পারবা। এক্ষেত্রে game_play.c ফাইলে startPlay ভেরিয়েবলটি ব্যাবহার করতে চাইলে তোমাকে লিখতে হবেঃ
extern int startPlay;
static
static storage specifier মূলত দুপ্রকারঃ
১। static local variables: সাধারনত লোকাল ভেরিয়েবলসমূহ তার কোড ব্লক থেকে বের হলেই মেমোরি থেকে মুছে যায়। কিন্তু যদি কোন লোকাল ভেরিয়েবল ডিক্লেয়ার করার পূর্বে static স্পেসিফায়ার ব্যাবহার করা হয় তাহলে ঐ ভেরিয়বলটি প্রোগ্রাম শেষ না হওয়া পর্যন্ত মেমোরিতে জমা থাকে। অর্থাৎ তখন তার উৎপত্তি কে global variable এর ন্যায় কাজ করতে পারে। উদাহরনঃ
int main()
{
int a;
if(a==5){
static int b = 6;
int c = a + b;
}
}
উপরোক্ত প্রোগ্রামের অংশবিশেষে b ভেরিয়েবলটি if কোড ব্লকে তৈরী হলেও তা static হওয়ায় প্রোগ্রামের শেষ পর্যন্ত থাকবে।
২। static global variables: static Global Variable ঠিক সাধারন global ভেরিয়েবলের মতনই। কিন্তু মূল পার্থক্য হলো যখন কোন global variable এর পূর্বে static দেওয়া হয় তখন তা শুধুমাত্র ঐ ফাইলেই ব্যাবহার করা যায়। অন্য কোন ফাইলে ঐ variable টিকে আর ব্যাবহার করা যায় না।
register
সাধারণত কোন variable মেইন মেমোরিতে জমা হয়। কিন্তু মেইন মেমোরি কিছুটা ধীরগতির। যখন তোমার প্রোগ্রামে খুব গতির প্রয়োজন হবে তখন তুমি register storage specifier ব্যাবহার করে ভেরিয়েবলকে তোমার প্রসেসরের register এ জমা রাখতে পারো। আর প্রসেসরের (CPU) এর রেজিস্টার একটির্যামের তুলনায় কয়েক গুণ বেশি স্পীডি। শুধুমাত্র local variable কে register এ রাখা যায় এবং char ও int টাইপের ডাটাকে বৈধভাবে register এ রাখা যায়।
উদাহরনঃ register int x;