Call by value and Call by reference in C [With Examples – in Hindi]

हेलो फ्रेंड्स आज के इस आर्टिकल में हम Call by value and Call by reference के बारे में बात करने जा रहे है | इससे पिछले आर्टिकल में हमने जाना था कि Function क्या है और फंक्शन का इस्तेमाल कैसे किया जाता है | 

यदि आपने वो आर्टिकल नहीं पढ़ा तो उसे एक बार जरूर पढ़ ले क्योकि Call by value and Call by reference को अच्छे से समझने के लिए आपको Function क्या है के बारे में जानकरी होना जरुरी है | साथ ही आपको ये भी पता होना आवश्यक है कि Arguments क्या होता है और Arguments कितने प्रकार के होते है | 

Arguments के बारे में आप यहाँ से पढ़ सकते है : Arguments in C

चलिए अब हम जानते है कि Call by value और Call by reference क्या है?

Call by value and Call by reference in C
Call by value and Call by reference in C

Call by value and Call by reference in C

जैसे की हम जानते है, कोई भी फंक्शन बिना कॉल किये प्रोग्राम में नहीं आता और execute नहीं होता | यदि हमे किसी फंक्शन का उपयोग अपने प्रोग्राम ने करना है तो सबसे पहले हमे उसे कॉल करना पड़ता है |

जब हम फंक्शन का नाम लिखा कर उस फंक्शन को कॉल करते है तो इसे Function Calling कहते है | 

फंक्शन कॉल करते समय यदि कोई argument या वैल्यू उस फंक्शन को पास करना होता है तो उस argument या वैल्यू को हम फंक्शन कॉल करते समय उसके पैरेंथेसिस () में लिख कर पास करते है | 

सी लैंग्वेज में हम फंक्शन कॉल करते समय फंक्शन के पैरेंथेसिस में दो तरह के वैल्यू पास कर सकते है -: call by value and call by reference.

call by value and call by reference के बारे में बताने से पहले मैं आपको ये बता देना चाहता हु कि Actual parameters और Formal parameters या Actual arguments और Formal arguments क्या होते है |  

Actual parameters or arguments -: फंक्शन कॉल करते समय जब हम कुछ वैल्यू या आर्गुमेंट उसके पैरेंथेसिस में लिखते है इसे Actual parameters or arguments कहते है | 

Formal parameters or arguments -: फंक्शन को डिफाइन करते समय जब हम पैरेंथेसिस में कुछ आर्गुमेंट लिखते या डिफाइन करते है तो इसे Formal parameters or arguments कहते है | 

आइये अब हम एक एक करके Call by value and Call by reference के बारे में जानते है 

Call by value क्या है? (Call by value in C In Hindi )

Function को कॉल करते समय जब आप कोई वैल्यू या किसी वेरिएबल की वैल्यू को उस फंक्शन के पैरेंथेसिस में लिख कर पास करते है तो इसे call by value कहते है |  

इसमें Actual parameters की वैल्यू Formal parameters को पास या असाइन हो जाती है जिससे वो फंक्शन उस वैल्यू का उपयोग अपने कार्य को पूरा करने के लिए कर सकता है | 

Call by value में ओरिजनल वैल्यू में कोई changes नहीं होता क्योंकि दोनों ही वैल्यू अलग अलग लोकेशन में स्टोर होती है |

Example -: Area of rectangle 

#include<stdio.h>
int area(int l, int b)   //Function Declaration
void main()
{
    int var1 =10;
    int var2 = 20;
    int var3 = area(var1, var2);    //Function Call

   /*
   यहाँ पर हम वेरिएबल नाम लिख कर उसके अंदर स्टोर वैल्यू को फंक्शन में पास   कर रहे है | 
   */

    printf("Area of rectangle is : %d", var3);
}

int area(int l, int b)    //Function Definition
{ 
     int A = l*b;
     return A;
}

Output -:

Area of rectangle is : 200

ऊपर दिए उदाहरण को एक बार अच्छे से देखे उसमे हमने फंक्शन कॉल करते समय उसके पैरेंथेसिस में जो वेरिएबल नाम लिखा है उसे Actual Parameter कहते है और फंक्शन डिफाइन करते समय पैरेंथेसिस में जो कुछ लिखा है उसे Formal Parameter कहते है | 

Call by value में Actual Parameter की वैल्यू Formal Parameter में कॉपी या असाइन हो जाती है जिससे फंक्शन उन values का उपयोग अपने कार्य को पूरा करने के लिए कर सकता है | 

Call by value में फंक्शन केवल उन वैल्यू का उपयोग कर सकता है उसमें कोई बदलाव नहीं कर सकता जैसे की इस example में हुवा है | 

फंक्शन कॉल करते समय पास किये गए वैल्यू का उपयोग करके कैलकुलेशन करता है और जो भी रिजल्ट आता है उसको वापस main() फंक्शन के पास जहां से उसे कॉल किया गया होता है लौटा देता है | 

Advantages of Call by value 

  • यह ओरिजनल वेरिएबल की वैल्यू में कोई बदलाव नहीं करता जिससे डेटा सुरक्षित रहता है | 
  • जब फंक्शन को कॉल किया जाता है तो एक्चुअल पैरामीटर के आर्गुमेंट में इसका प्रभाव नहीं पड़ता | 
  • इसमें एक्चुअल पैरामीटर की वैल्यू फॉर्मल पैरामीटर में जाती है जिससे यदि कोई भी बदलवा होता है तो इसका प्रभाव केवल फॉर्मल पैरामीटर पर होता है इसका एक्चुअल पैरामीटर पर कोई प्रभाव नहीं पड़ता | 

Disadvantages of Call by value 

  • इसमें आप ओरिजनल वेरिएबल की वैल्यू को फंक्शन के अंदर नहीं बदल सकते | 
  • एक्चुअल आर्गुमेंट वेरिएबल होना चाहिए | 
  • एक ही वैल्यू दो अलग अलग वेरिएबल में स्टोर हो जाती है जो मेमोरी efficient  नहीं है | 

Call by reference क्या है? ( Call by reference in C In Hindi )

जब हम फंक्शन कॉल करते समय किसी वेरिएबल का एड्रेस उस फंक्शन को पास करते है तो इसे Call by reference or Call by address कहते है |

इसमें Actual parameters में किसी वेरिएबल के एड्रेस को Formal parameters में रखे पॉइंटर वेरिएबल (जो की किसी भी वेरिएबल के एड्रेस को स्टोर कर सकता है) को पास  किया जाता है | ऐसा करने से फंक्शन उस एड्रेस में रखे वैल्यू को भी चेंज कर सकते है |

Call by reference में ओरिजनल वैल्यू में भी changes हो जाते है क्योंकि दोनों ही वैल्यू एक ही लोकेशन में स्टोर होती है |

इसमें Actual parameters में रखे वेरिएबल का एड्रेस Formal parameters में रखे पॉइंटर वेरिएबल में स्टोर हो जाती है |

Example -: Swapping the values of the two variables

#include <stdio.h>
void swap(int *a, int *b);   //function declaration
void main () 
{
  // variable definition
   int x = 100;
   int y = 200;
 
   printf("Before swap, value of x : %d\n", x );
   printf("Before swap, value of y : %d\n", y );

   swap(&x, &y);     // calling a function to swap the values

   printf("After swap, value of x : %d\n", x );
   printf("After swap, value of y : %d\n", y );
 
}
void swap(int *a, int *b)   //Function Definition
 {
   int temp;

   temp = *a;   //save the value of a 
   *a = *b;     //put b into a 
   *b = temp;   /* put temp into b */
  
}

Output -:

Before swap, value of x : 100
Before swap, value of y : 200
After swap, value of x : 200
After swap, value of y : 100

ऊपर दिए गए example को एक बार अच्छे से देख उसमे हमने swap नाम का एक फंक्शन बनाया है जिसके पैरेंथेसिस ( ) में पॉइंटर वेरिएबल है जो दूसरे वेरिएबल के एड्रेस को होल्ड करता है या यू कहे की पॉइंटर वेरिएबल में जिस वेरिएबल का अड्रेस होता है वो उस वेरिएबल को पॉइंट करता है |

जब हमने main() फंक्शन में swap फंक्शन को कॉल किया तब हमने उसके पैरेंथेसिस में x और y वेरिएबल के एड्रेस को &x, और &y करके swap फंक्शन को पास किया | 

हमारे ऐसा करने से x और y वेरिएबल का एड्रेस a और b नाम के पॉइंटर में स्टोर हो गया | 

इन पॉइंटर वेरिएबल (जो की x और y वेरिएबल को पॉइंट कर रहे है ) की मदद से हम  x और y वेरिएबल की वैल्यू में बदलाव कर सकते है | जैसे की इस example में हुवा है |

इस example में हमने पॉइंटर वेरिएबल a और b के द्वारा x और y वेरिएबल की वैल्यू में बदलाव किया है जिसे आप आउटपुट में देख सकते है | 

यदि आपको पॉइंटर क्या होता है के बारे में जानना है तो आप इसके बारे में यहाँ से डिटेल्ड में पढ़ सकते है – Pointer in C |

Call by reference में ओरिजनल वैल्यू में भी changes हो जाते है क्योंकि दोनों ही वैल्यू एक ही लोकेशन में स्टोर होती है |

इसमें Actual parameters में रखे वेरिएबल का एड्रेस Formal parameters में रखे पॉइंटर वेरिएबल में स्टोर हो जाती है |

Advantages of Call by reference 

  • इसमें एक ही वैल्यू को स्टोर करने के लिए डुप्लीकेट वेरिएबल बनाना नहीं पड़ता
  • इससे मेमोरी हानि नहीं होती | 
  • इसमें हम ओरिजनल वेरिएबल की वैल्यू को फंक्शन के अंदर बदल सकते | 
  • एड्रेस पास करके हम उस वेरिएबल की वैल्यू में बदलाव करने में सक्षम हो जाते है | 

Disadvantages of Call by reference 

  • फंक्शन के अंदर वेरिएबल में होने वाले बदलाव ओरिजनल वेरिएबल को प्रभावित करते है | 
  • call by reference से कभी कभी प्रोग्राम में प्रॉब्लम आ सकता है और प्रोग्राम Complex हो सकता है | 

Call by value and Call by reference का उपयोग कब करें?

Call by value and Call by reference का उपयोग कब करना है ये अलग अलग परिस्थितियों पर निर्भर करता है नीचे मैंने कुछ परिस्थितियां बताई है जिसके हिसाब से आप Call by value and Call by reference का उपयोग कर सकते है |

Call by value का उपयोग कब करें ?

  • जब हम वेरिएबल की ओरिजनल वैल्यू में कोई बदलाव नहीं करना चाहते तब हम call by value का उपयोग करते है | 
  • जब हमे एक्चुअल पैरामीटर के वैल्यू में किसी भी प्रकार का साइड इफ़ेक्ट नहीं चाहते तब हम इसका उपयोग करते है | 
  • जब फंक्शन को उसका काम करने के लिए हमे सिर्फ वैल्यू ही पास करना हो तब हम call by value का उपयोग करते है | 

Call by reference का उपयोग कब करें ?

  1. जब हम वेरिएबल की ओरिजनल वैल्यू में कोई बदलाव करना चाहते तब हम call by reference का उपयोग करते है | 
  2. जब हमे एक्चुअल पैरामीटर के वैल्यू में बदलाव करना चाहते है तब हम इसका उपयोग करते है | 
  3. जब फंक्शन को उसका काम करने के लिए हमे उस वेरिएबल का reference पास करना हो तब हम call by reference का उपयोग करते है | 

Difference Between Call by value and Call by reference In C In Hindi

Call by value and Call by reference में निम्नलिखित अंतर है -:

Call by valueCall by reference
वेरिएबल के वैल्यू की कॉपी फंक्शन को पास होती है |वेरिएबल का एड्रेस फंक्शन को पास होता है |
फंक्शन के अंदर वैल्यू में होने वाला बदलाव केवल उस फंक्शन तक सिमित होता है | फॉर्मल पैरामीटर में होने वाला बदलाव एक्चुअल पैरामीटर को इफ़ेक्ट नहीं करता | फंक्शन के अंदर वैल्यू में होने वाला बदलाव उस फंक्शन तक सिमित नहीं होता है | फॉर्मल परमेटर में होने वाला बदलाव एक्चुअल पैरामीटर को इफ़ेक्ट करता है | 
Actual और formal arguments मेमोरी में अलग अलग लोकेशन में स्थित होता है जिससे एक में होने वाला बदलाव दूसरे को प्रभावित नहीं करता | Actual और formal arguments मेमोरी में एक ही लोकेशन में स्थित होता है जिससे एक में होने वाला बदलाव दूसरे को प्रभावित करता है |
ओरिजनल वैल्यू में कोई बदलाव नहीं होता |ओरिजनल वैल्यू में भी बदलाव हो जाता है | 
फंक्शन को पास किये जाने वैल्यू को स्टोर करने के लिए नार्मल वेरिएबल उपयोग होता है | फंक्शन को पास किये जाने वाले वेरिएबल के एड्रेस को स्टोर करने के लिए पॉइंटर वेरिएबल की जरुरत होती है | 

निष्कर्ष 

दोस्तों आशा करता हु कि आज के इस आर्टिकल को पढ़ने के बाद आपको Call by value and Call by reference in C Language से संबंधित सभी जानकारी मिल गई होगी और आपको और कही इसके बारे में सर्च करना नहीं पड़ेगा |

अगर आप सी लैंग्वेज का Complete Tutorial चाहते है तो मेरे इस पोस्ट C Language Tutorial In Hindi को देखे यहाँ आपको C Programming Language के सभी टॉपिक्स step by step मिल जाएगी |

दोस्तों आशा करता हु कि आपको ये पोस्ट पसंद आई होगी और आपको Call by value and Call by reference के बारे में काफी जानकरी हुई होगी |

अगर आपको ये पोस्ट पसंद आया है तो इस पोस्ट को अपने अपने दोस्तों को शेयर करना न भूलिएगा ताकि उनको भी ये जानकारी प्राप्त हो सके |

अगर आपको अभी भी Call by value and Call by reference in C से संबंधित कोई भी प्रश्न या Doubt है तो आप जरूर बताये मैं आपके सभी सवालों का जवाब दूँगा और ज्यादा जानकारी के लिए आप हमसे संपर्क कर सकते है |

एसी ही नया टेक्नोलॉजी ,Programming Language, Coding , C Language, C++, Python Course , Java Tutorial से रिलेटेड जानकारियाँ पाने के लिए हमारे इस वेबसाइट को सब्सक्राइब कर दीजिए | जिससे हमारी आने वाली नई पोस्ट की सूचनाएं जल्दी प्राप्त होगी |

Thank you ! आपका दिन मंगलमय हो

पढ़ते रहिए और बढ़ते रहिए | Keep Reading and Keep Growing

Jeetu Sahu is A Web Developer | Computer Engineer | Passionate about Coding, Competitive Programming and Blogging