C में स्टोरेज क्लासेस: ऑटो, एक्सटर्न, स्टेटिक, रजिस्टर (उदाहरण)

⚡ स्मार्ट सारांश

सी भाषा में स्टोरेज क्लास प्रत्येक वेरिएबल के स्कोप, लाइफटाइम, डिफॉल्ट वैल्यू और मेमोरी लोकेशन को परिभाषित करती हैं, जिसमें चार स्पेसिफायर - ऑटो, रजिस्टर, स्टैटिक और एक्सटर्न - का उपयोग करके यह नियंत्रित किया जाता है कि डेटा कहां रहता है और निष्पादन के दौरान यह कितने समय तक बना रहता है।

  • भंडारण की चार श्रेणियां: C भाषा प्रत्येक वेरिएबल का वर्णन करने के लिए ऑटो, रजिस्टर, स्टैटिक और एक्सटर्न स्पेसिफायर प्रदान करती है।
  • 🏠 ऑटो: डिफ़ॉल्ट स्थानीय क्लास, जो अपने ब्लॉक तक सीमित है और असाइन किए जाने तक एक गार्बेज वैल्यू रखती है।
  • रजिस्टर: काउंटर जैसे बार-बार उपयोग किए जाने वाले वेरिएबल्स तक तेजी से पहुंच के लिए सीपीयू-रजिस्टर स्टोरेज का अनुरोध करता है।
  • ♻️ स्थैतिक: यह फ़ंक्शन कॉल के बीच एक वेरिएबल मान को संरक्षित करता है और पहले उपयोग पर डिफ़ॉल्ट रूप से शून्य होता है।
  • 🌐 बाहरी: किसी वैश्विक चर या फ़ंक्शन को पुनर्परिभाषित किए बिना कई स्रोत फ़ाइलों में साझा करता है।
  • 📊 दायरा और अवधि: प्रत्येक क्लास यह निर्धारित करती है कि कोई वेरिएबल कहाँ दिखाई देगा और वह कितने समय तक मौजूद रहेगा।

सी . में भंडारण कक्षाएं

सी भाषा में स्टोरेज क्लास क्या है?

स्टोरेज क्लास किसी वैरिएबल की दृश्यता और स्थान को दर्शाता है। यह बताता है कि कोड के किस भाग से हम वैरिएबल तक पहुँच सकते हैं। C में स्टोरेज क्लास का उपयोग निम्नलिखित चीज़ों का वर्णन करने के लिए किया जाता है:

  • परिवर्तनशील दायरा.
  • वह स्थान जहाँ चर संग्रहीत किया जाएगा.
  • किसी चर का आरंभिक मान.
  • एक चर का जीवनकाल.
  • किसी चर तक कौन पहुंच सकता है?

इस प्रकार एक भंडारण वर्ग का उपयोग किसी चर के बारे में जानकारी का प्रतिनिधित्व करने के लिए किया जाता है।

नोट: एक चर केवल इससे संबद्ध नहीं होता है डाटा प्रकार, इसका मूल्य लेकिन यह भी एक भंडारण वर्ग है।

सी में स्टोरेज क्लासेस के प्रकार क्या हैं?

मानक स्टोरेज क्लास के कुल चार प्रकार हैं। नीचे दी गई तालिका C में स्टोरेज क्लास को दर्शाती है।

भंडारण वर्ग उद्देश्य
स्वत: यह एक डिफ़ॉल्ट भंडारण वर्ग है.
बाहरी यह एक वैश्विक चर है.
स्थिर यह एक स्थानीय चर है जो फ़ंक्शन कॉल पर नियंत्रण स्थानांतरित होने पर भी मान लौटाने में सक्षम है।
रजिस्टर यह एक वेरिएबल है जो रजिस्टर के अंदर संग्रहीत होता है।

C में ऑटो स्टोरेज क्लास

ऑटो स्टोरेज क्लास का उपयोग करके परिभाषित किए गए वेरिएबल को स्थानीय वेरिएबल कहा जाता है। ऑटो का मतलब है स्वचालित स्टोरेज क्लास। यदि कोई वेरिएबल स्पष्ट रूप से निर्दिष्ट नहीं है, तो वह डिफ़ॉल्ट रूप से ऑटो स्टोरेज क्लास में होता है।

ऑटो वैरिएबल का दायरा सिर्फ़ उस विशेष ब्लॉक तक ही सीमित होता है। एक बार जब नियंत्रण ब्लॉक से बाहर चला जाता है, तो एक्सेस नष्ट हो जाता है। इसका मतलब है कि सिर्फ़ वही ब्लॉक इसे एक्सेस कर सकता है जिसमें ऑटो वैरिएबल घोषित किया गया है।

ऑटो स्टोरेज क्लास को परिभाषित करने के लिए ऑटो कीवर्ड का उपयोग किया जाता है। डिफ़ॉल्ट रूप से, ऑटो वैरिएबल में एक कचरा मान होता है।

Example, auto int age;

नीचे दिया गया प्रोग्राम एक फ़ंक्शन को परिभाषित करता है जिसमें दो स्थानीय चर हैं

int add(void) {
   int a=13;
   auto int b=48;
return a+b;}

हम एक और प्रोग्राम लेते हैं जो प्रत्येक ब्लॉक कोड में ऑटो वेरिएबल्स के लिए स्कोप स्तर "दृश्यता स्तर" दिखाता है जो एक दूसरे से स्वतंत्र हैं:

#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

C में एक्सटर्नल स्टोरेज क्लास

एक्सटर्न का मतलब है एक्सटर्नल स्टोरेज क्लास। एक्सटर्न स्टोरेज क्लास का उपयोग तब किया जाता है जब हमारे पास ग्लोबल फ़ंक्शन या वैरिएबल होते हैं जिन्हें दो या अधिक फ़ाइलों के बीच साझा किया जाता है।

कीवर्ड extern का उपयोग किसी अन्य फ़ाइल में वैश्विक चर या फ़ंक्शन घोषित करने के लिए किया जाता है ताकि मूल फ़ाइल में पहले से परिभाषित चर या फ़ंक्शन का संदर्भ प्रदान किया जा सके।

एक्सटर्न कीवर्ड का उपयोग करके परिभाषित किए गए वेरिएबल को ग्लोबल वेरिएबल कहा जाता है। ये वेरिएबल पूरे प्रोग्राम में एक्सेस किए जा सकते हैं। ध्यान दें कि एक्सटर्न वेरिएबल को इनिशियलाइज़ नहीं किया जा सकता है, यह पहले से ही मूल फ़ाइल में परिभाषित किया गया है।

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 ब्लॉक

चरण 2) C का चयन करें और अगला पर क्लिक करें

सी भाषा का चयन करें

चरण 3) अगला क्लिक करें

अगला पर क्लिक करें

चरण 4) विवरण दर्ज करें और अगला पर क्लिक करें

प्रोजेक्ट का विवरण दर्ज करें

चरण 5) फिनिश पर क्लिक करें

समाप्त क्लिक करें

चरण 6) पिछले प्रोग्राम में दिखाए गए मुख्य कोड को main.c फ़ाइल में डालें और उसे सेव करें।

main.c में कोड जोड़ें

चरण 7) एक नई सी फ़ाइल बनाएँ [फ़ाइल -> नया -> खाली फ़ाइल], इसे सहेजें (मूल.सी के रूप में) और संवाद बॉक्स में "ओके" पर क्लिक करके इसे वर्तमान प्रोजेक्ट में जोड़ें।

original.c फ़ाइल बनाएँ

चरण 8) पिछले उदाहरण में दिखाई गई मूल .c फ़ाइल के C कोड को main() फ़ंक्शन के बिना डालें और सहेजें।

मूल.c फ़ाइल में कोड जोड़ें

चरण 9) अपने प्रोजेक्ट को बिल्ड और रन करें। परिणाम अगली आकृति में दिखाया गया है।

प्रोग्राम आउटपुट

C में स्थैतिक भंडारण वर्ग

स्टैटिक वैरिएबल का उपयोग फ़ंक्शन/फ़ाइल के भीतर स्थानीय स्टैटिक वैरिएबल के रूप में किया जाता है। इन्हें एक के रूप में भी इस्तेमाल किया जा सकता है वैश्विक चर

  • स्थैतिक स्थानीय चर एक स्थानीय चर है जो फ़ंक्शन कॉल या ब्लॉक के बीच अपने मान को बनाए रखता है और संग्रहीत करता है और केवल उस फ़ंक्शन या ब्लॉक के लिए दृश्यमान रहता है जिसमें इसे परिभाषित किया गया है।
  • स्थैतिक वैश्विक चर वे वैश्विक चर होते हैं जो केवल उसी फ़ाइल में दिखाई देते हैं जिसमें उन्हें घोषित किया जाता है।
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

वैश्विक चर संपूर्ण फ़ाइल में सुलभ होते हैं, जबकि स्थैतिक चर केवल कोड के विशेष भाग तक ही सुलभ होते हैं।

स्टैटिक वैरिएबल का जीवनकाल पूरे प्रोग्राम कोड में होता है। स्टैटिक कीवर्ड का उपयोग करके घोषित या आरंभ किया गया वैरिएबल हमेशा डिफ़ॉल्ट मान के रूप में शून्य रखता है।

C में स्टोरेज क्लास पंजीकृत करें

जब आप फ़ंक्शन या ब्लॉक के भीतर स्थानीय चर को स्टोर करना चाहते हैं तो आप रजिस्टर स्टोरेज क्लास का उपयोग कर सकते हैं, बजाय इसके कि आप सीपीयू रजिस्टर में स्थानीय चर को स्टोर करें। रैम इन चरों तक त्वरित पहुँच प्राप्त करने के लिए। उदाहरण के लिए, "काउंटर" रजिस्टर में संग्रहीत किए जाने के लिए एक अच्छा विकल्प हैं।

Example: register int age;

रजिस्टर शब्द का प्रयोग रजिस्टर स्टोरेज क्लास घोषित करने के लिए किया जाता है। रजिस्टर स्टोरेज क्लास का उपयोग करके घोषित किए गए वेरिएबल्स का जीवनकाल पूरे प्रोग्राम में बना रहता है।

यह ऑटो स्टोरेज क्लास के समान है। चर विशेष ब्लॉक तक सीमित है। एकमात्र अंतर यह है कि रजिस्टर स्टोरेज क्लास का उपयोग करके घोषित किए गए चर मेमोरी के बजाय CPU रजिस्टर के अंदर संग्रहीत किए जाते हैं। रजिस्टर की मुख्य मेमोरी की तुलना में तेज़ पहुँच होती है।

रजिस्टर स्टोरेज क्लास का उपयोग करके घोषित किए गए वेरिएबल का कोई डिफ़ॉल्ट मान नहीं होता है। इन वेरिएबल को अक्सर प्रोग्राम की शुरुआत में घोषित किया जाता है।

#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 प्रोग्रामिंग में उपयोग की जाती हैं

भंडारण कक्षा घोषणा भंडारण डिफ़ॉल्ट आरंभिक मान विस्तार जीवनकाल
स्वत: किसी फ़ंक्शन/ब्लॉक के अंदर याद अप्रत्याशित फ़ंक्शन/ब्लॉक के भीतर फ़ंक्शन/ब्लॉक के भीतर
रजिस्टर किसी फ़ंक्शन/ब्लॉक के अंदर सीपीयू रजिस्टर कचरा फ़ंक्शन/ब्लॉक के भीतर फ़ंक्शन/ब्लॉक के भीतर
बाहरी सभी कार्यों से बाहर याद शून्य संपूर्ण फ़ाइल और अन्य फ़ाइलें जहाँ चर को extern के रूप में घोषित किया गया है प्रोग्राम रनटाइम
स्थैतिक (स्थानीय) किसी फ़ंक्शन/ब्लॉक के अंदर याद शून्य फ़ंक्शन/ब्लॉक के भीतर प्रोग्राम रनटाइम
स्थैतिक (वैश्विक) सभी कार्यों से बाहर याद शून्य वैश्विक प्रोग्राम रनटाइम

अक्सर पूछे जाने वाले प्रश्न

स्कोप यह निर्धारित करता है कि कोड में कोई वेरिएबल कहाँ दिखाई देगा, जबकि लाइफटाइम यह निर्धारित करता है कि वह मेमोरी में कितने समय तक रहेगा। एक वेरिएबल का स्कोप ब्लॉक हो सकता है, लेकिन लाइफटाइम पूरे प्रोग्राम के बराबर हो सकता है।

दोनों ब्लॉक-स्कोप वाले स्थानीय चर बनाते हैं, लेकिन ऑटो उन्हें एक गार्बेज डिफ़ॉल्ट के साथ मेमोरी में रखता है, जबकि रजिस्टर तेज़ सीपीयू-रजिस्टर स्टोरेज का अनुरोध करता है और चर पते को लेने से रोकता है।

नहीं। रजिस्टर केवल एक अनुरोध है; जब कोई रजिस्टर खाली न हो तो कंपाइलर इसे अनदेखा कर सकता है। आधुनिक कंपाइलर रजिस्टर के उपयोग को स्वचालित रूप से अनुकूलित करते हैं, इसलिए अब इस कीवर्ड की शायद ही कभी आवश्यकता होती है।

स्टैटिक और एक्सटर्न वैरिएबल पूरे प्रोग्राम के लिए शून्य-आरंभिक मेमोरी सेगमेंट में रहते हैं, इसलिए वे शून्य से शुरू होते हैं। ऑटो वैरिएबल स्टैक मेमोरी का पुन: उपयोग करते हैं,ping जो भी मूल्य शेष रह गया।

एक्सटर्न डिक्लेरेशन केवल किसी अन्य स्थान पर परिभाषित वेरिएबल की घोषणा करता है और इसे इनिशियलाइज़ नहीं किया जा सकता। वास्तविक परिभाषा, जो एक ही फ़ाइल में होती है, स्टोरेज आवंटित करती है, और लिंकिंग इसके सभी संदर्भों को जोड़ती है।

लगभग, लेकिन पूरी तरह से नहीं। C++ रजिस्टर कीवर्ड को अप्रचलित कर दिया गया है और टाइप इन्फरेंस के लिए ऑटो का पुनः उपयोग किया गया है। हालांकि, स्टैटिक और एक्सटर्न का व्यवहार समान है। C++ यह thread_local और class-member स्टोरेज नियम जोड़ता है।

जी हां। एआई सहायक ऑटो, रजिस्टर, स्टैटिक और एक्सटर्न का वर्णन करते हैं, प्रत्येक वेरिएबल के लिए सही स्पेसिफायर का सुझाव देते हैं और रजिस्टर वेरिएबल का पता लेने जैसे दुरुपयोग को चिह्नित करते हैं।

गिटहब कोपिलॉट यह स्वचालित रूप से स्टैटिक काउंटर, फाइलों में एक्सटर्नल घोषणाओं और रजिस्टर संकेतों को पूरा करता है, फिर टाइप करते समय ही स्कोप और लाइफटाइम की व्याख्या करता है।

इस पोस्ट को संक्षेप में इस प्रकार लिखें: