2016-02-24 7 views
5

के सरणी संदर्भ पास करना सामान्य है, Arrays को किसी फ़ंक्शन या संदर्भ के रूप में पॉइंटर के रूप में पास किया जा सकता है। इसे संदर्भ के रूप में पास करने से उपनाम दिया जाता है जिस पर आकार और गिनती ऑपरेटर भी काम करेंगे। यह संदर्भ से बेहतर दिखता है।सी ++: क्या फंक्शन

हालांकि, पॉइंटर द्वारा पास पुस्तकें में आदर्श मानते हैं। क्यूं कर? क्या कुछ ऐसा है जो मुझे विशेष रूप से सरणी के संदर्भ में पास करने के बारे में जानने की ज़रूरत है?

उत्तर

5

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

+1

! संदर्भ के अनुसार पास करने के लिए गतिशील रूप से आवंटित सरणी को पैरामीटर के रूप में स्वीकार नहीं किया जाएगा? कैसे? एक संदर्भ सभी उपनाम के बाद है। – quantum231

+0

@ quantum231 गतिशील रूप से एक सरणी आवंटित करने से पहले ही एक सूचक लौटाता है, इसलिए नहीं। –

+1

कोई ऑटो-आवंटन आवश्यकता नहीं है, लेकिन एक प्रकार का मुद्दा है। उदाहरण: 'शून्य एफ (int (और तर्क) [5]);' 'शून्य जी() {एफ (* नया int [1] [5]);}' –

1

मैं आमतौर पर std::vector का उपयोग करता हूं और कॉन्स संदर्भ द्वारा पास करना चाहता हूं। उस ने कहा, अगर मेरे एपीआई को किसी बिंदु पर सी कोड द्वारा बुलाया जा सकता है, तो कॉन्स्ट पॉइंटर द्वारा पास का उपयोग करने से समझ हो सकती है, हालांकि आपको आकार को भी भेजना होगा। यदि फ़ंक्शन को std::array या std::vector के साथ बुलाया जा सकता है, तो आप एक पॉइंटर (और आकार), या इटरेटर्स (प्रारंभ/समाप्ति) सेट करने का निर्णय ले सकते हैं।

यदि हम std :: array का उपयोग करने के बारे में बात कर रहे हैं, तो टेम्पलेट तर्क को सरणी के आकार की आवश्यकता होती है। इसका मतलब यह होगा एक सामान्य समारोह में, आप एक निश्चित आकार आवश्यकता होगी:

void myfunc(const std::array<int, 5>& mydata){...} 

हालांकि, अगर हम आकार पर एक टेम्प्लेटेड समारोह, templating करते हैं, कि अब कोई समस्या नहीं है।

template<unsigned int SZ> 
void myfunc(const std::array<int, SZ>& mydata) {...} 

हम ढेर आवंटित सी शैली सरणियों बारे में बात कर रहे हैं, तो ... अच्छा C++ शैली std :: सरणी/std :: सी शैली सरणियों के लिए वेक्टर पसंद करते है। मैं पेज 152 पर C++ Coding Standard by Herb Sutter अध्याय 77 पढ़ने की सलाह दूंगा। सी-स्टाइल सरणी का उपयोग करते समय, पॉइंटर और आकार को भेजना मानक तरीका है।

संबंधित मुद्दे