2012-07-01 12 views
7

मैं की एक सटीक डुप्लिकेट होने की वजह से एक सवाल पहले कि बंद हो गया पढ़ इससरणी तर्क के लिए पॉइंटर को क्षय क्यों दिखता है आकार() पर लागू नहीं होता है?

When a function has a specific-size array parameter, why is it replaced with a pointer?

और

How to find the 'sizeof' (a pointer pointing to an array)?

लेकिन यह पढ़ने के बाद मैं अभी भी कैसे sizeof से उलझन में हूँ() काम करता है। मैं समझता हूँ कि एक समारोह के लिए एक तर्क के रूप में इस तरह के एक सरणी गुजर

void foo(int a[5]) 

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

int a[5] = {1,2,3,4,5}; 
    cout << sizeof(a) << endl; 

तो ऊपर उत्पादन 420 के बजाय चाहिए व्यवहार किया है। क्या मुझे कुछ स्पष्ट याद आया है क्योंकि यह सूचक व्यवहार के क्षय का विरोधाभास है ??? इसे फिर से लाने के लिए खेद है, लेकिन मुझे वास्तव में समझने में कठिनाई हो रही है कि ऐसा क्यों होता है जब तक कि वास्तव में इसके बारे में सोचने के बिना वर्षों तक काम का आनंदपूर्वक उपयोग न किया जाए।

+3

नोट: 'शून्य फू (int (& a) [5]) 'नहीं * * सरणी तर्क क्षय का कारण बनता है। यह लक्ष्य महत्वपूर्ण है, स्रोत नहीं। – Xeo

+3

'शून्य फू (int a [5]) '- मैं वास्तव में चाहता हूं कि पैरामीटर फॉर्म को बहिष्कृत किया जाएगा और केवल' void foo (int * a) 'फ़ॉर्म को अनुमति दी जाएगी, यह भ्रम के अलावा कुछ भी नहीं है। मुझे परवाह नहीं है कि यह कौन सा कोड टूटता है। –

उत्तर

15

मानक इसलिए कहते हैं क्योंकि (जोर मेरा):

(C99, 6.3.2.1p3) "जब यह sizeof ऑपरेटर या एकल & ऑपरेटर के संकार्य है, या एक है सिवाय स्ट्रिंग शाब्दिक एक सरणी को प्रारंभ करने के लिए प्रयोग किया जाता है, एक अभिव्यक्ति जिसमें "प्रकार की सरणी" टाइप होती है, को "पॉइंटर टू टाइप" प्रकार के साथ अभिव्यक्ति में परिवर्तित किया जाता है जो सरणी ऑब्जेक्ट के प्रारंभिक तत्व को इंगित करता है और यह एक लालसा नहीं है। " "[...] पर लागू किए जाने

(सी ++ 11, 5.3.3p2 sizeof):

ध्यान दें कि सी ++ के लिए, मानक स्पष्ट रूप से कहते हैं आकार सरणी के आकार है एक सरणी, परिणाम सरणी में बाइट्स की कुल संख्या है। इसका तात्पर्य है कि एन तत्वों की सरणी का आकार एन तत्व का आकार एन गुणा है। "

+0

धन्यवाद - यह मेरे लिए पूरी तरह से साफ़ करता है। – mathematician1975

+0

सी ++ में नियम थोड़ा अलग है, इसमें एक और मामला है जहां क्षय नहीं होता है: जब सरणी संदर्भ में सरणी अभिव्यक्ति को बाध्यकारी करते हैं। लेकिन वे अजीब चीजें हैं। Http: // stackoverflow भी देखें।com/प्रश्न/3368883/कैसे-करता-इस आकार की सरणी-टेम्पलेट समारोह काम – MSalters

6

sizeof एक ऑपरेटर है, फ़ंक्शन नहीं। यह भी एक विशिष्ट है। कोष्ठक भी आवश्यक हो तो यह एक अभिव्यक्ति है नहीं कर रहे हैं:

int a; 
sizeof (int); //needed because `int` is a type 
sizeof a; //optional because `a` is an expression 
sizeof (a); //^ also works 

आप देख सकते हैं, यह रूप में अच्छी तरह precedence के इस चार्ट पर है। यह गैर-अधिभार योग्य ऑपरेटरों में से एक है।

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

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