संदर्भ द्वारा एक सरणी पासिंग


184

संदर्भ कार्य द्वारा सांख्यिकीय रूप से आवंटित सरणी को कैसे पास किया जाता है?

void foo(int (&myArray)[100])
{
}

int main()
{
    int a[100];
    foo(a);
}

है (&myArray)[100]कोई अर्थ या उसके सिर्फ एक वाक्य रचना संदर्भ द्वारा किसी भी सरणी पारित करने के लिए है? मैं अलग कोष्ठक के बाद बड़े कोष्ठक के बारे में नहीं समझता। धन्यवाद।


क्या फंक्शन पैरामीटर्स के साथ रिवल्यू टू लेवल्यू रिलेशन है?
जॉन डीबी


जवाबों:


228

यह सरणी संदर्भों के लिए एक वाक्यविन्यास है - आपको (&array)संकलक को स्पष्ट करने के लिए उपयोग करने की आवश्यकता है कि आप संदर्भों के अमान्य (अमान्य) सरणी के बजाय किसी सरणी का संदर्भ चाहते हैं int & array[100];

संपादित करें: कुछ स्पष्टीकरण।

void foo(int * x);
void foo(int x[100]);
void foo(int x[]);

ये तीनों एक ही कार्य को घोषित करने के विभिन्न तरीके हैं। वे सब एक लेने के रूप में इलाज कर रहे हैं int *पैरामीटर, तो आप उन्हें किसी भी आकार सरणी पारित कर सकते हैं।

void foo(int (&x)[100]);

यह केवल 100 पूर्णांकों के सरणियों को स्वीकार करता है। आप सुरक्षित रूप से उपयोग कर सकते हैं sizeofपरx

void foo(int & x[100]); // error

इसे "संदर्भों की सरणी" के रूप में रखा गया है - जो कानूनी नहीं है।


हमारे पास संदर्भों की एक सरणी क्यों नहीं हो सकती है int a, b, c; int arr[3] = {a, b, c};?
वोराक

4
अहा, पता चला क्यों
वोरैक

2
क्या कोई समझा सकता है कि void foo(int & x[100]);कृपया "संदर्भों की सरणी" के रूप में क्यों जाना जाता है? क्या ऐसा इसलिए है क्योंकि "शासन से दाएं-बाएं" नियम है? यदि हाँ, तो ऐसा प्रतीत नहीं होता है कि कैसे void foo(int (&x)[100]);"एक सरणी का संदर्भ" के रूप में पार्स किया जाता है। अग्रिम में धन्यवाद।
zl9394

3
यह बाएं से दाएं नहीं है, यह अंदर से बाहर है, और [] की तुलना में तंग बांधता है।
दीक्षा

48

यह केवल आवश्यक सिंटैक्स है:

void Func(int (&myArray)[100])

^ intपैरामीटर नाम के संदर्भ में 100 की पास सरणी है myArray;

void Func(int* myArray)

^ एक सरणी पास। एक सूचक के लिए ऐरे का फैसला होता है। इस प्रकार आप आकार की जानकारी खो देते हैं।

void Func(int (*myFunc)(double))

^ एक फ़ंक्शन पॉइंटर पास करें। फ़ंक्शन एक रिटर्न देता है intऔर एक लेता है double। पैरामीटर नाम है myFunc


हम एक संदर्भ के रूप में एक चर आकार सरणी कैसे पास करते हैं?
शिवम अरोड़ा

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

24

यह एक वाक्य रचना है। फ़ंक्शन तर्क में int (&myArray)[100]कोष्ठक जो तर्क देते &myArrayहैं, आवश्यक हैं। यदि आप उनका उपयोग नहीं करते हैं, तो आप एक गुजर रहे होंगे array of referencesऔर ऐसा इसलिए है क्योंकि उस subscript operator []पर उच्च पूर्वता है & operator

उदाहरण के लिए int &myArray[100] // array of references

तो, type construction ()आप का उपयोग करके संकलक को बताएं कि आप 100 पूर्णांक की एक सरणी का संदर्भ चाहते हैं।

उदाहरण के लिए int (&myArray)[100] // reference of an array of 100 ints


"यदि आप उनका उपयोग नहीं करते हैं, तो आप पास होंगे array of references" - जो निश्चित रूप से मौजूद नहीं हो सकता है, इसलिए आपको एक संकलन त्रुटि मिलेगी। यह मेरे लिए मनोरंजक है कि ऑपरेटर पूर्ववर्ती नियम इस पर जोर देते हैं कि वैसे भी डिफ़ॉल्ट रूप से ऐसा होना चाहिए।
अंडरस्कोर_ड

क्या टाइप निर्माण () के बारे में कोई और ट्यूटोरियल है?
चीफ शिफ्टर

धन्यवाद, मुझे एक स्पष्टीकरण की आवश्यकता थी जिसमें ऑपरेटर की पूर्ववर्तीता के बारे में कारण शामिल था, जो यह समझ में आता है कि इसे इस तरह क्यों किया जाना चाहिए।
cram2208

4

ऐरे को डिफ़ॉल्ट रूप से पॉइंटर्स द्वारा पास किया जाता है। आप बेहतर समझ के लिए एक फ़ंक्शन कॉल के अंदर एक सरणी को संशोधित करने का प्रयास कर सकते हैं।


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

@UlrichEckhardt मैं यह कहने की कोशिश कर रहा हूं कि "एरेस को मूल्य द्वारा पारित नहीं किया जा सकता है" जैसा कि आपने पहले कहा था, वे डिफ़ॉल्ट रूप से संदर्भ द्वारा पारित किए गए हैं
एडुआर्डो ए। फर्नांडीज डिआज

8
ऐरे को न तो मान से पारित किया जाता है और न ही संदर्भ। उन्हें संकेत द्वारा पारित किया जाता है। यदि सरणियों को डिफ़ॉल्ट रूप से संदर्भ द्वारा पारित किया जाता है, तो आपको उन पर आकार के उपयोग से कोई समस्या नहीं होगी। लेकिन मामला वह नहीं है। किसी फ़ंक्शन में पास होने पर एरर्स संकेत देता है।
user3437460

2
एरे को संदर्भ द्वारा या एक पॉइंटर को नीचा करके पारित किया जा सकता है। उदाहरण के लिए, char arr[1]; foo(char arr[]).एक सूचक को गिराने का उपयोग करना , गिरफ्तारी करना; उपयोग करते समय char arr[1]; foo(char (&arr)[1]), गिरफ्तारी को संदर्भ के रूप में पारित किया जाता है। यह उल्लेखनीय है कि आयाम खो जाने के बाद से पूर्व रूप को अक्सर बीमार माना जाता है।
zl9394

पुन:, "अर्रेज़ हैं ... पॉइंटर्स द्वारा पारित।" यह विवरण सर्वोत्तम रूप से अपरंपरागत लगता है, और यह newbies को भ्रमित कर सकता है। एक सरणी चर का नाम , एक वैध अभिव्यक्ति है जिसका मान सूचक सरणी के पहले सदस्य है। यदि आपके पास कुछ फ़ंक्शन है foo(T* t), और आपके पास एक सरणी है, T a[N];तो जब आप लिखते हैं foo(a);मुझे लगता है कि यह कहना अधिक सही होगा कि आप एक पॉइंटर पास कर रहे हैं, एक ऐरे पास नहीं कर रहे हैं, और आप पॉइंटर को मान से पास कर रहे हैं।
सोलोमन स्लो

1

निम्नलिखित एक सामान्य कार्य बनाता है, संदर्भ द्वारा किसी भी आकार और किसी भी प्रकार की एक सरणी लेते हुए:

template<typename T, std::size_t S>
void my_func(T (&arr)[S]) {
   // do stuff
}

कोड के साथ खेलते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.