📘 Lesson  ·  Lesson 55

Call by Value vs Reference

Arguments भेजने के दो तरीके

जब आप किसी function को कुछ data देते हैं, तो C को तय करना होता है कि वह data function तक कैसे पहुँचे। इसके दो मानसिक मॉडल हैं, और इनका अंतर तय करता है कि function आपके original variable को बदल सकता है या नहीं:

  • Call by value — function को data की एक copy मिलती है। आपका original सुरक्षित और अपरिवर्तित रहता है।
  • Call by reference — function को data का address मिलता है, इसलिए वह original तक पहुँचकर उसे बदल सकता है।

C डिफ़ॉल्ट रूप से call by value इस्तेमाल करता है। Call by reference pointers से होता है। दोनों देखते हैं।

Call by value: copy पर काम

यहाँ function को a की एक copy मिलती है। उस copy को बदलने से original पर कोई असर नहीं होता।

C Language
#include <stdio.h>
void change(int x) {
    x = 100;        // सिर्फ़ local copy बदलती है
}
int main() {
    int a = 5;
    change(a);
    printf("a = %d\n", a);   // अब भी 5
    return 0;
}
Output:
a = 5

भले ही change ने x = 100 किया, original a 5 ही रहा — क्योंकि x बस एक copy था जो function खत्म होते ही मिट गया।

Call by reference: original पर काम

अब हम a का address भेजते हैं। Function उसे pointer के रूप में लेता है और उस address की value बदलता है।

C Language
#include <stdio.h>
void change(int *x) {
    *x = 100;       // address से original बदलता है
}
int main() {
    int a = 5;
    change(&a);      // a का address भेजें
    printf("a = %d\n", a);   // अब 100
    return 0;
}
Output:
a = 100

इस बार a 100 हो गया। &a ने a का address दिया, और *x = 100 ने सीधे a की memory में लिखा।

💡 महत्वपूर्ण सच

C हमेशा call by value है। "Call by reference" का मतलब बस यह है कि हम एक pointer (address) को value के रूप में भेजते हैं — और चूँकि वह address अब भी original की ओर इशारा करता है, function उसे बदल सकता है।

असली सबूत: दो numbers swap

यह वह example है जो हर interviewer को पसंद है, क्योंकि यह अंतर बिल्कुल साफ़ दिखाता है। पहले call by value वाला टूटा हुआ version:

C Language
#include <stdio.h>
void swap(int x, int y) {   // सिर्फ़ copies
    int t = x; x = y; y = t;
}
int main() {
    int a = 5, b = 9;
    swap(a, b);
    printf("a = %d, b = %d\n", a, b);   // नहीं बदला!
    return 0;
}
Output:
a = 5, b = 9

कुछ swap नहीं हुआ — function ने सिर्फ़ अपनी local copies हिलाईं। अब call by reference वाला चलता हुआ version:

C Language
#include <stdio.h>
void swap(int *x, int *y) {   // addresses
    int t = *x; *x = *y; *y = t;
}
int main() {
    int a = 5, b = 9;
    swap(&a, &b);
    printf("a = %d, b = %d\n", a, b);   // swap हो गया!
    return 0;
}
Output:
a = 9, b = 5

Addresses भेजकर function असली a और b तक पहुँचता है और उन्हें सचमुच swap कर देता है। यही एक तुलना इस topic का दिल है।

Call by value बनाम reference

बिंदुCall by valueCall by reference
क्या भेजा जाता हैValue की copyAddress (pointer)
Original variableबदल नहीं सकताबदल सकता है
Call ऐसेchange(a)change(&a)
लिया ऐसेint xint *x
बड़ी data की लागतसब copy करता हैसिर्फ़ address copy

कब कौन सा इस्तेमाल करें

  • Call by value तब जब function को सिर्फ़ data पढ़ना हो और original को न छूना हो।
  • Call by reference तब जब function को caller का variable बदलना हो, एक से ज़्यादा result लौटाने हों, या बड़ी data efficiently संभालनी हो।

आम गलतियाँ

  • यह उम्मीद करना कि call-by-value function original बदल देगा — यह कभी नहीं कर सकता।
  • Reference function call करते समय & भूल जाना (address की जगह value भेजना)।
  • Function के अंदर * भूल जाना, जिससे आप value की जगह pointer बदल देते हैं।
  • किसी local variable का address भेजना और उस function के return के बाद उसे इस्तेमाल करना।
🏋️ अभ्यास

एक function void addTax(float *price, float rate) लिखें जो price को tax rate से जगह पर ही बढ़ाए। इसे एक price variable के address के साथ call करें और पुष्टि करें कि original value बदल गई।

सारांश

  • Call by value copy भेजता है — original variable कभी नहीं बदलता।
  • Call by reference address भेजता है — function original बदल सकता है।
  • C तकनीकी रूप से हमेशा call by value है; reference pointer भेजकर होता है।
  • दो numbers swap करना सिर्फ़ call by reference से चलता है।
  • Caller की data बदलने या बड़ी data efficiently भेजने के लिए reference इस्तेमाल करें।

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

C में call by value और call by reference में क्या अंतर है?
Call by value में function को argument की एक copy मिलती है, इसलिए function के अंदर बदलाव original variable को प्रभावित नहीं करते। Call by reference में function को variable का address (pointer के ज़रिए) मिलता है, इसलिए वह original को सीधे बदल सकता है।
क्या C में सच में call by reference होता है?
सख़्ती से कहें तो C में केवल call by value होता है — यह हमेशा argument copy करता है। C में "call by reference" pointer (address) को value के रूप में भेजकर नकल किया जाता है। चूँकि copy किया गया pointer भी original address रखता है, function original variable तक पहुँचकर उसे बदल सकता है, जिससे call by reference का असर मिलता है।
Swap function call by value से क्यों नहीं चलता?
क्योंकि swap function सिर्फ़ अपनी local copies बदलता है। Caller में मौजूद originals अछूते रहते हैं, इसलिए function return के बाद वे बिल्कुल वैसे ही दिखते हैं। Caller के variables को सचमुच swap करने के लिए उनके addresses भेजने होंगे और pointers से swap करना होगा।
C में variable को reference से कैसे pass करें?
Call करते समय & से उसका address भेजें, और function में * से pointer के रूप में लें। जैसे change(&a) call करें और void change(int *x){ *x = 100; } define करें। अंदर *x original variable को पढ़ता और लिखता है।
क्या call by reference call by value से तेज़ है?
एक single int जैसी छोटी value के लिए अंतर नगण्य है। पर बड़ी data (जैसे बड़े structures) के लिए address (reference) भेजना पूरी चीज़ copy करने से बचाता है, इसलिए तेज़ है और कम memory लेता है। यही pointer से pass करने का आम असली कारण है।
← Back to C Tutorial
🔗

Share this topic with a friend

यह topic किसी दोस्त को भेजें

Found it useful? Send it to a classmate learning the same thing.

अच्छा लगा? जो दोस्त यही सीख रहा है, उसे भेज दीजिए।

💻 लाइव कोड एडिटर

इस पेज के प्रोग्राम यहीं तैयार हैं — चलाएँ, बदलें और सीखें। कुछ भी इंस्टॉल किए बिना।
OneCompiler द्वारा संचालित। कोड एडिटर में अपने आप आ जाता है — Run दबाकर आउटपुट देखें। अगर एडिटर न खुले तो नए टैब में खोलें.