मुझे पता है कि जब मैं एक समारोह के लिए एक सरणी पास करना चाहते हैं, यह सूचक में है, तो इसके आकार नहीं जाना क्षय होगा और इन दो घोषणाओं के बराबर हैं:सी ++ में संकलक के संदर्भ में संदर्भ द्वारा किसी फ़ंक्शन को पास किए गए सरणी का आकार क्यों है?
void funtion(int *tab, int size);
और
void funtion(int tab[], int size);
और मैं समझता हूं क्यों। हालांकि, मैं जाँच की है कि जब मैं एक संदर्भ के रूप में एक सरणी पारित:
void funtion(int (&tab)[4]);
संकलक सरणी के आकार को पता चल जाएगा और मुझे इस समारोह के एक तर्क के रूप में विभिन्न आकार की एक सरणी पारित नहीं होंगे।
वह क्यों है? मुझे पता है कि जब मैं पते से एक सरणी पास करता हूं, तो ith तत्व की स्थिति की गणना करते समय आकार को ध्यान में नहीं रखा जाता है, इसलिए इसे स्पष्ट रूप से फ़ंक्शन घोषणा में शामिल करने के बावजूद इसे छोड़ दिया जाता है:
void funtion(int tab[4], int size);
लेकिन जब मैं संदर्भ द्वारा सरणी पास करता हूं तो अलग क्या होता है? इसका आकार कंपाइलर के लिए क्यों जाना जाता है?
नोट: मुझे उन सरणी में दिलचस्पी है जिनके आकार संकलन समय पर ज्ञात हैं, इसलिए मैंने किसी भी टेम्पलेट का उपयोग नहीं किया।
मैं स्टैक ओवरफ़्लो पर a similar question पाया, लेकिन यह मेरे सवाल का जवाब नहीं है - यह की व्याख्या नहीं करता क्यों संकलक सरणी के आकार को जानता है, कितना कार्यों के लिए सरणियों पारित करने के लिए पर कुछ जानकारी नहीं है।
धन्यवाद :) यह शायद एक बेवकूफ सवाल है, लेकिन एक संकेतक संदर्भ संदर्भ में एक संकेतक द्वारा पारित क्यों नहीं किया जाता है? और क्यों एक चेक ब्रेक जोड़ना कुछ कोड मानते हुए यह अब अच्छा काम करता है? – user2738748
@ user2738748 सूचक को खस्ताहाल सी का एक भयानक विरासत कोई भी यह पसंद करती है, लेकिन यह यह, सी ++ में इसे बदलने के लिए मुश्किल है के बाद से वहाँ एक निश्चित सी ++ संभव के रूप में संकलक के साथ के रूप में ज्यादा सी कोड compilable करने की इच्छा है। लेकिन चूंकि सी में कोई संदर्भ नहीं है, सी ++ उनके बारे में कोई नियम निर्धारित कर सकता है, अनबाउंड। और सेन नियम निर्धारित किए गए थे। – SergeyA