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 पर कोई असर नहीं होता।
#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;
}a = 5
भले ही change ने x = 100 किया, original a 5 ही रहा — क्योंकि x बस एक copy था जो function खत्म होते ही मिट गया।
Call by reference: original पर काम
अब हम a का address भेजते हैं। Function उसे pointer के रूप में लेता है और उस address की value बदलता है।
#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;
}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:
#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;
}a = 5, b = 9
कुछ swap नहीं हुआ — function ने सिर्फ़ अपनी local copies हिलाईं। अब call by reference वाला चलता हुआ version:
#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;
}a = 9, b = 5
Addresses भेजकर function असली a और b तक पहुँचता है और उन्हें सचमुच swap कर देता है। यही एक तुलना इस topic का दिल है।
Call by value बनाम reference
| बिंदु | Call by value | Call by reference |
|---|---|---|
| क्या भेजा जाता है | Value की copy | Address (pointer) |
| Original variable | बदल नहीं सकता | बदल सकता है |
| Call ऐसे | change(a) | change(&a) |
| लिया ऐसे | int x | int *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 में क्या अंतर है?
क्या C में सच में call by reference होता है?
Swap function call by value से क्यों नहीं चलता?
C में variable को reference से कैसे pass करें?
& से उसका address भेजें, और function में * से pointer के रूप में लें। जैसे change(&a) call करें और void change(int *x){ *x = 100; } define करें। अंदर *x original variable को पढ़ता और लिखता है।