सी में संदर्भ द्वारा पासिंग


204

यदि C किसी चर को संदर्भ द्वारा पारित करने का समर्थन नहीं करता है, तो यह काम क्यों करता है?

#include <stdio.h>

void f(int *j) {
  (*j)++;
}

int main() {
  int i = 20;
  int *p = &i;
  f(p);
  printf("i = %d\n", i);

  return 0;
}

आउटपुट:

$ gcc -std=c99 test.c
$ a.exe
i = 21 

22
इस कोड में आप संदर्भ कहाँ दे रहे हैं ?
अतुल

15
यह ध्यान दिया जाना चाहिए कि सी संदर्भ से पारित नहीं है, यह केवल संकेत का उपयोग करके अनुकरण किया जा सकता है ।
कुछ प्रोग्रामर ने

6
सही कथन है, "C संदर्भ से परिवर्तनशील रूप से गुजरने का समर्थन नहीं करता है " - आपको &फ़ंक्शन को कॉल करने से पहले स्पष्ट रूप से एक संदर्भ (के साथ ) बनाने की आवश्यकता है और फ़ंक्शन में स्पष्ट रूप से इसे (साथ *)।
क्रिस डोड

2
आपका कोड आउटपुट बिलकुल बराबर है जब कॉल करता है f(&i);यह संदर्भ द्वारा पास का कार्यान्वयन है, जो कि विशुद्ध रूप से C. में मौजूद नहीं है। संदर्भ से पास करें
EsmaeelE

@Someprogrammerdude एक पॉइंटर पास करना-पास-संदर्भ है। यह उन तथ्यों में से एक लगता है जो "प्रेमी" सी प्रोग्रामर खुद पर गर्व करते हैं। जैसे उन्हें इसमें से एक किक मिलती है। "ओह, आप सोच सकते हैं कि सी-पास-संदर्भ है, लेकिन नहीं, यह वास्तव में एक स्मृति पते का मूल्य है जो हरिहर को पारित किया जा रहा है"। संदर्भ से गुजरने का शाब्दिक अर्थ है केवल उस स्मृति पते को पास करना जहां चर के मूल्य के बजाय एक चर संग्रहीत किया जाता है। यह वही है जो C अनुमति देता है, और यह हर बार जब आप पॉइंटर पास करते हैं तो पास-रेफरेंस होता है, क्योंकि पॉइंटर एक चर मेमोरी लोकेशन का संदर्भ होता है।
युंगगुन

जवाबों:


315

क्योंकि आप पॉइंटर के मान को विधि में पास कर रहे हैं और फिर उस पूर्णांक को प्राप्त करने के लिए इसे संदर्भित कर रहे हैं जिसे इंगित किया गया है।


4
च (पी); -> क्या इसका मतलब मूल्य से गुजरना है? तब यह पूर्णांक प्राप्त करने के लिए इसे संदर्भित करता है जो इंगित किया गया है। -> क्या आप अधिक स्पष्टीकरण दे सकते हैं।
बापी

4
@ बीपीआई, एक पॉइंटर को डीफ्रेंसिंग करने का अर्थ है "वह मान प्राप्त करें जो यह पॉइंटर संदर्भित कर रहा है"।
रौनी लिलेमेट्स

हम फ़ंक्शन को कॉल करने की विधि के लिए क्या कहते हैं जो सूचक को पारित करने के बजाय चर का पता लेता है। उदाहरण: func1 (int & a)। क्या यह संदर्भ से आह्वान नहीं है? इस मामले में संदर्भ वास्तव में लिया गया है और सूचक के मामले में, हम अभी भी मूल्य से गुजर रहे हैं क्योंकि हम केवल मूल्य से सूचक पारित कर रहे हैं।
जॉन व्हीलॉक

1
पॉइंटर्स का उपयोग करते समय मुख्य तथ्य यह है कि पॉइंटर की कॉपी फ़ंक्शन में पारित हो जाती है। फ़ंक्शन तब उस पॉइंटर का उपयोग करता है, मूल नहीं। यह अभी भी पास-बाय-वैल्यू है, लेकिन यह काम करता है।
डेनिजेल

1
@Danijel एक पॉइंटर पास करना संभव है जो फ़ंक्शन कॉल के लिए किसी भी चीज़ की प्रतिलिपि नहीं है। उदाहरण के लिए, फ़ंक्शन को कॉल करना func: func(&A);यह किसी भी चीज़ को कॉपी किए बिना फ़ंक्शन के ए से पॉइंटर को पास करेगा। यह पास-बाय-वैल्यू है, लेकिन यह वैल्यू एक संदर्भ है, इसलिए आप 'ए-पास-रेफरेंस' वेरिएबल हैं। ए कॉपी की आवश्यकता नहीं है। यह पास-बाय-रेफरेंस कहने के लिए मान्य है।
यंगगुन

124

वह पास-बाय-रेफरेंस नहीं है, जो कि पास-बाय-वैल्यू है जैसा कि दूसरों ने कहा है।

C भाषा बिना किसी अपवाद के पास-बाय-वैल्यू है। एक पॉइंटर को एक पैरामीटर के रूप में पास करने का मतलब पास-पास-संदर्भ नहीं है।

नियम निम्नलिखित है:

एक फ़ंक्शन वास्तविक पैरामीटर मान को बदलने में सक्षम नहीं है।


आइए किसी फ़ंक्शन के स्केलर और पॉइंटर मापदंडों के बीच के अंतर को देखने का प्रयास करें।

स्केलर चर

यह लघु कार्यक्रम स्केलर वैरिएबल का उपयोग करके पास-दर-मूल्य दिखाता है। paramको औपचारिक पैरामीटर कहा जाता है और variableफ़ंक्शन मंगलाचरण को वास्तविक पैरामीटर कहा जाता है। ध्यान दें paramकि फ़ंक्शन में वृद्धि नहीं बदलती है variable

#include <stdio.h>

void function(int param) {
    printf("I've received value %d\n", param);
    param++;
}

int main(void) {
    int variable = 111;

    function(variable);
    printf("variable %d\m", variable);
    return 0;
}

परिणाम है

I've received value 111
variable=111

पास-दर-संदर्भ का भ्रम

हम कोड के टुकड़े को थोड़ा बदलते हैं। paramअब एक सूचक है

#include <stdio.h>

void function2(int *param) {
    printf("I've received value %d\n", *param);
    (*param)++;
}

int main(void) {
    int variable = 111;

    function2(&variable);
    printf("variable %d\n", variable);
    return 0;
}

परिणाम है

I've received value 111
variable=112

यह आपको विश्वास दिलाता है कि पैरामीटर संदर्भ द्वारा पारित किया गया था। यह नहीं था। यह मान से पारित किया गया था, एक मान एक पता होने के नाते। इंट प्रकार के मूल्य में वृद्धि की गई थी, और यह दुष्प्रभाव है जो हमें लगता है कि यह एक पास-बाय-संदर्भ फ़ंक्शन कॉल था।

संकेत - पास-दर-मूल्य

हम उस तथ्य को कैसे दिखा / साबित कर सकते हैं? ठीक है, हो सकता है कि हम स्केलर चर के पहले उदाहरण की कोशिश करें, लेकिन स्केलर के बजाय हम पते (पॉइंटर्स) का उपयोग करते हैं। चलो देखते हैं कि मदद कर सकते हैं।

#include <stdio.h>

void function2(int *param) {
    printf("param's address %d\n", param);
    param = NULL;
}

int main(void) {
    int variable = 111;
    int *ptr = &variable;

    function2(ptr);
    printf("ptr's address %d\n", ptr);
    return 0;
}

इसका परिणाम यह होगा कि दो पते बराबर हैं (सटीक मूल्य के बारे में चिंता न करें)।

उदाहरण परिणाम:

param's address -1846583468
ptr's address -1846583468

मेरी राय में यह स्पष्ट रूप से साबित करता है कि संकेत पास-दर-मूल्य हैं। अन्यथा समारोह आह्वान के बाद ptrहोगा NULL


69

C में, Pass-by-reference को एक चर (एक पॉइंटर) के पते को पास करने और वास्तविक वेरिएबल को पढ़ने या लिखने के लिए फ़ंक्शन के भीतर पते को डीरफ्रेंसिंग द्वारा सिम्युलेटेड किया जाता है। इसे "C स्टाइल पास-बाय-रेफरेंस" कहा जाएगा।

स्रोत: www-cs-students.stanford.edu


50

क्योंकि उपरोक्त कोड में कोई पास-बाय-रेफरेंस नहीं है। पॉइंटर्स का उपयोग करना (जैसे कि void func(int* p)) पास-बाय-एड्रेस है। यह C ++ में पास-बाय-संदर्भ है (C में काम नहीं करेगा):

void func(int& ref) {ref = 4;}

...
int a;
func(a);
// a is 4 now

1
मुझे पास-बाय-एड्रेस का जवाब पसंद है। अधिक मायने रखता है।
अफ़ज़ल अहमद जीशान

पता और संदर्भ इस संदर्भ में पर्यायवाची हैं। लेकिन आप उन शब्दों को दोनों में अंतर करने के लिए उपयोग कर सकते हैं, यह सिर्फ उनके मूल अर्थ के लिए ईमानदार नहीं है।
युंगगुन

27

आपका उदाहरण काम करता है क्योंकि आप अपने चर के पते को एक समारोह में पारित कर रहे हैं जो कि dereference संचालक के साथ इसके मूल्य में हेरफेर करता है ।

हालांकि सी , संदर्भ डेटा प्रकारों का समर्थन नहीं करता है , फिर भी आप अपने उदाहरण के अनुसार, स्पष्ट रूप से पॉइंटर मानों को पास करके संदर्भ को दरकिनार कर सकते हैं।

सी ++ संदर्भ डेटा प्रकार सी से विरासत में दिए गए सूचक प्रकार की तुलना में कम शक्तिशाली लेकिन सुरक्षित माना जाता है। यह आपका उदाहरण होगा, सी ++ संदर्भों का उपयोग करने के लिए अनुकूलित :

void f(int &j) {
  j++;
}

int main() {
  int i = 20;
  f(i);
  printf("i = %d\n", i);

  return 0;
}

3
यह विकिपीडिया लेख C ++ के बारे में है, C ++ से पहले मौजूद नहीं है। C ++ मौजूद नहीं है और मौजूद रहने के लिए विशेष C ++ सिंटैक्स पर निर्भर नहीं है।

1
@रोगर: अच्छी बात है ... मैंने अपने जवाब से C ++ का स्पष्ट संदर्भ हटा दिया।
डैनियल वेसलो

1
और वह नया लेख कहता है "एक संदर्भ को अक्सर एक पॉइंटर कहा जाता है" जो कि आपके उत्तर में काफी कुछ नहीं है।

12

आप मान द्वारा एक पॉइंटर (पता स्थान) पास कर रहे हैं ।

यह कहने जैसा है कि "यहां वह स्थान है जिसके डेटा मैं आपको अपडेट करना चाहता हूं।"


6

p एक पॉइंटर वैरिएबल है। इसका मान i का पता है। जब आप f कॉल करते हैं, तो आप p का मान पास करते हैं , जो कि i का पता है।



5

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

void add_number(int *a) {
    *a = *a + 2;
}

int main(int argc, char *argv[]) {
   int a = 2;

   printf("before pass by reference, a == %i\n", a);
   add_number(&a);
   printf("after  pass by reference, a == %i\n", a);

   printf("before pass by reference, a == %p\n", &a);
   add_number(&a);
   printf("after  pass by reference, a == %p\n", &a);

}

before pass by reference, a == 2
after  pass by reference, a == 4
before pass by reference, a == 0x7fff5cf417ec
after  pass by reference, a == 0x7fff5cf417ec

4

चूँकि आप वेरिएबल p में फंक्शन में एक पॉइंटर (मेमोरी एड्रेस) पास कर रहे हैं। दूसरे शब्दों में आप एक पॉइंटर पास कर रहे हैं न कि रेफरेंस।


4

संक्षिप्त उत्तर: हां, C पॉइंटर्स का उपयोग करके संदर्भ से गुजरने वाले पैरामीटर को लागू करता है।

पैरामीटर पासिंग को लागू करते समय, प्रोग्रामिंग भाषाओं के डिजाइनर तीन अलग-अलग रणनीतियों (या अर्थ मॉडल) का उपयोग करते हैं: डेटा को उपप्रोग्राम में स्थानांतरित करते हैं, उपप्रोग्राम से डेटा प्राप्त करते हैं, या दोनों करते हैं। इन मॉडलों को आमतौर पर मोड, आउट मोड और इनआउट मोड के रूप में जाना जाता है।

इन तीन प्राथमिक पैरामीटर पासिंग रणनीतियों को लागू करने के लिए भाषा डिजाइनरों द्वारा कई मॉडल तैयार किए गए हैं:

Pass-by-Value (मोड सेमेंटिक्स में) Pass-by-Result (आउट मोड शब्दार्थ) Pass-by-Value-Result (इन-मोड मोड शब्दार्थ) Pass-by-Reference (इन-मोड मोड शब्दार्थ) Pass-by-Name (inout मोड) अर्थ विज्ञान)

पास-दर-संदर्भ इन-मोड-पैरामीटर पैरामीटर के लिए दूसरी तकनीक है। मुख्य दिनचर्या और उपप्रोग्राम के बीच डेटा को आगे और पीछे कॉपी करने के बजाय, रनटाइम सिस्टम उपप्रोग्राम के लिए डेटा तक एक सीधी पहुंच पथ भेजता है। इस रणनीति में उपप्रोग्राम में मुख्य दिनचर्या के साथ डेटा को प्रभावी ढंग से साझा करने के लिए डेटा तक सीधी पहुंच है। इस तकनीक के साथ मुख्य लाभ यह है कि समय और स्थान में इसकी पूर्ण दक्षता है क्योंकि अंतरिक्ष की नकल करने की कोई आवश्यकता नहीं है और डेटा की प्रतिलिपि बनाने वाले संचालन नहीं हैं।

C: C में पैरामीटर पासिंग इम्प्लीमेंटेशन, पास-बाय-वैल्यू लागू करता है और पास-बाय-रेफरेंस (इनऑट मोड) शब्दार्थ का उपयोग करते हुए पॉइंटर्स को पैरामीटर के रूप में उपयोग करता है। पॉइंटर को उपप्रोग्राम में भेजा जाता है और कोई भी वास्तविक डेटा कॉपी नहीं किया जाता है। हालाँकि, क्योंकि एक पॉइंटर मुख्य रूटीन के डेटा तक पहुँच मार्ग है, इसलिए सबप्रोग्राम मुख्य रूटीन में डेटा को बदल सकता है। C ने ALGOL68 से यह तरीका अपनाया।

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

इसलिए यहां मुख्य अवधारणा यह है कि पास-बाय-रेफरेंस डेटा को उपप्रोग्राम में कॉपी करने के बजाय डेटा तक पहुंच मार्ग को लागू करता है। डेटा एक्सेस पथ स्पष्ट रूप से आरेखित किए गए बिंदु या ऑटो अनुमेय बिंदु (संदर्भ प्रकार) हो सकते हैं।

अधिक जानकारी के लिए रॉबर्ट सेबेस्टा, 10 वीं एड।, चैप्टर 9 द्वारा प्रोग्रामिंग कॉन्सेप्ट्स ऑफ प्रोग्रामिंग लैंग्वेजेज देखें।


3

आप संदर्भ द्वारा एक इंट पास नहीं कर रहे हैं, आप एक पॉइंटर-टू-ए-इंट को मान से पास कर रहे हैं। अलग वाक्यविन्यास, वही अर्थ।


1
+1 "अलग वाक्यविन्यास, वही अर्थ।" .. तो वही बात, जैसे अर्थ वाक्य रचना से ज्यादा मायने रखता है।

सच नहीं। के void func(int* ptr){ *ptr=111; int newValue=500; ptr = &newvalue }साथ कॉल करके int main(){ int value=0; func(&value); printf("%i\n",value); return 0; }, यह 500 के बजाय 111 प्रिंट करता है। यदि आप संदर्भ से गुजर रहे हैं, तो इसे 500 प्रिंट करना चाहिए। C संदर्भ द्वारा पासिंग पैरामीटर का समर्थन नहीं करता है।
कोनफ्ले डोलेक्स

@ कॉन्फ्ले, यदि आप संदर्भ से वाक्यगत रूप से गुजर रहे हैं, ptr = &newvalueतो उसे अस्वीकृत कर दिया जाएगा। अंतर के बावजूद, मुझे लगता है कि आप इंगित कर रहे हैं कि "समान अर्थ" बिल्कुल सही नहीं है क्योंकि आपके पास सी में अतिरिक्त कार्यक्षमता भी है ("संदर्भ" को फिर से असाइन करने की क्षमता)।
xan

हम कभी भी ऐसा कुछ नहीं लिखते हैं जैसे ptr=&newvalueकि यह संदर्भ द्वारा पारित किया गया हो। इसके बजाय, हम ptr=newvalueयहां लिखते हैं कि C ++ में एक उदाहरण है: void func(int& ptr){ ptr=111; int newValue=500; ptr = newValue; }पैरामीटर फंक () में पारित हो जाएगा 500
कोनफल डोलेक्स

ऊपर मेरी टिप्पणी के मामले में, संदर्भ द्वारा परम को पारित करना व्यर्थ है। हालाँकि, यदि परम POD के बजाय एक ऑब्जेक्ट है, तो यह एक महत्वपूर्ण अंतर होगा क्योंकि किसी param = new Class()फ़ंक्शन के अंदर किसी भी परिवर्तन के बाद कॉल करने वाले के लिए कोई प्रभाव नहीं होगा यदि वह मान (पॉइंटर) द्वारा पारित हो जाता है। यदि paramसंदर्भ द्वारा पारित किया जाता है, तो कॉल करने वाले के लिए परिवर्तन दिखाई देंगे।
कॉनफ्लेक्स डलेक्स

3

C में, संदर्भ द्वारा पास करने के लिए आप उस ऑपरेटर के पते का उपयोग करते हैं &जिसका उपयोग किसी चर के खिलाफ किया जाना चाहिए, लेकिन आपके मामले में, चूंकि आपने सूचक चर का उपयोग किया है, इसलिए आपको pइसे ऑपरेटर के पते के साथ उपसर्ग करने की आवश्यकता नहीं है। यह सच होता अगर आप &iपैरामीटर के रूप में उपयोग करते हैं f(&i):।

आप इसे भी जोड़ सकते हैं, डीरेफेरेंस कर सकते हैं pऔर देख सकते हैं कि वैल्यू कैसे मेल खाती है i:

printf("p=%d \n",*p);

आपको यह बताने के लिए कि उसे एक प्रिंटफ़ जोड़ने की आवश्यकता है, कोड (उस टिप्पणी ब्लॉक सहित) को दोहराने की आवश्यकता क्यों महसूस की?

@ नील: यह त्रुटि @ विलियम के संपादन द्वारा शुरू की गई थी, अब मैं इसे उल्टा करूंगा। और अब यह स्पष्ट है कि tommieb केवल सही है: आप किसी भी ऑब्जेक्ट पर लागू कर सकते हैं, न कि केवल चर।

2

पॉइंटर्स और रेफरेंस दो अलग-अलग थिगन्स हैं।

कुछ चीजों का उल्लेख मैंने नहीं देखा है।

एक सूचक कुछ का पता है। एक पॉइंटर को किसी अन्य वैरिएबल की तरह स्टोर और कॉपी किया जा सकता है। इस प्रकार इसका आकार होता है।

एक संदर्भ को किसी चीज के ALIAS के रूप में देखा जाना चाहिए। इसका आकार नहीं है और इसे संग्रहीत नहीं किया जा सकता है। यह कुछ संदर्भ होना चाहिए, अर्थात। यह शून्य या परिवर्तित नहीं किया जा सकता है। खैर, कभी-कभी कंपाइलर को पॉइंटर के रूप में संदर्भ को स्टोर करने की आवश्यकता होती है, लेकिन यह एक कार्यान्वयन विवरण है।

संदर्भ के साथ आपके पास इश्यू के साथ समस्याएँ नहीं हैं, जैसे ओनरशिप हैंडलिंग, नल चेकिंग, उपयोग पर डी-रेफ़रेंसिंग।


1

'संदर्भ द्वारा पास' (संकेत का उपयोग करके) सी में शुरू से रहा है। आपको क्यों लगता है कि यह नहीं है?


7
क्योंकि यह तकनीकी रूप से संदर्भ से नहीं गुजर रहा है।
मेहरदाद अफशरी

7
एक पॉइंटर मान पास करना संदर्भ के समान नहीं है। j( नहीं *j ) के मूल्य को अद्यतन करने f()पर कोई प्रभाव नहीं पड़ता iहै main()
जॉन बोडे

6
यह शब्दशः संदर्भ से गुजरने के समान है , और यह कहने के लिए पर्याप्त है कि यह संदर्भ से गुजर रहा है। सच है, सी स्टैंडर्ड "संदर्भ" शब्द का उपयोग नहीं करता है, लेकिन यह न तो मुझे आश्चर्यचकित करता है और न ही एक समस्या है। हम एसओ पर मानक भी नहीं बोल रहे हैं, भले ही हम मानक का उल्लेख कर सकते हैं, अन्यथा हम किसी को भी rvalues ​​(सी मानक शब्द का उपयोग नहीं करते) के बारे में बात करते हुए देखेंगे।

4
@ जय: हमें यह बताने के लिए धन्यवाद कि जॉन की टिप्पणी को आपने गलत ठहराया था।

1

मुझे लगता है कि C वास्तव में संदर्भ द्वारा पास का समर्थन करता है।

अधिकांश भाषाओं को मूल्य के बजाय संदर्भ से गुजरने के लिए सिंटैक्टिक चीनी की आवश्यकता होती है। (C ++ उदाहरण के लिए और पैरामीटर घोषणा में आवश्यक है)।

सी को इसके लिए सिंटैक्टिक शुगर की भी आवश्यकता होती है। यह पैरामीटर प्रकार की घोषणा और तर्क पर * है। तो * और / या संदर्भ द्वारा पास के लिए C वाक्यविन्यास है।

अब कोई यह तर्क दे सकता है कि संदर्भ द्वारा वास्तविक पास को केवल पैरामीटर घोषणा पर वाक्यविन्यास की आवश्यकता होनी चाहिए, न कि तर्क की ओर।

लेकिन अब C # आता है जो संदर्भ पासिंग का समर्थन करता है और इसके लिए पैरामीटर और तर्क दोनों पक्षों पर वाक्यविन्यास चीनी की आवश्यकता होती है ।

यह तर्क कि C का कोई बाय-री पास नहीं है, सिंटैक्टिक तत्वों को व्यक्त करने के लिए इसे व्यक्त करता है अंतर्निहित तकनीकी कार्यान्वयन बिल्कुल भी एक तर्क नहीं है, क्योंकि यह सभी कार्यान्वयनों के लिए कम या ज्यादा लागू होता है।

केवल शेष तर्क यह है कि सी में रेफरी द्वारा पारित करना एक अखंड विशेषता नहीं है, बल्कि दो मौजूदा विशेषताओं को जोड़ती है। (द्वारा तर्क का संदर्भ लें और, * द्वारा टाइप करने के लिए रेफरी की अपेक्षा करें।) उदाहरण के लिए C # के लिए दो सिंटैक्टिक तत्वों की आवश्यकता होती है, लेकिन उन्हें एक दूसरे के बिना उपयोग नहीं किया जा सकता है।

यह स्पष्ट रूप से एक खतरनाक तर्क है, क्योंकि भाषाओं में बहुत सारी अन्य विशेषताएं अन्य विशेषताओं से बनी हैं। (C ++ में स्ट्रिंग सपोर्ट की तरह)


1

आप जो कर रहे हैं वह संदर्भ द्वारा पारित मूल्य से नहीं है। क्योंकि आप एक चर 'p' के मान को 'f' (मुख्य रूप f (p);) के रूप में भेज रहे हैं);

C के संदर्भ में पास के साथ एक ही प्रोग्राम दिखेगा, (!!! यह प्रोग्राम 2 त्रुटियां देता है क्योंकि संदर्भ द्वारा पास C में समर्थित नहीं है)

#include <stdio.h>

void f(int &j) {    //j is reference variable to i same as int &j = i
  j++;
}

int main() {
  int i = 20;
  f(i);
  printf("i = %d\n", i);

  return 0;
}

आउटपुट: -

3:12: त्रुटि: अपेक्षित ';', ',' या ')' से पहले 'और' टोकन
             शून्य च (इंट & जे);
                        ^
9: 3: चेतावनी: फ़ंक्शन 'एफ' की निहित घोषणा
               च (क);
               ^
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.