मैं सी में एक अंतिम कल के लिए अध्ययन कर रहा हूँ, और sizeof ऑपरेटर से संबंधित प्रश्न है।sizeof सरणी स्पष्टीकरण
मान लें कि int
का आकार 32
बिट्स है और एक सूचक 64
बिट्स है।
अगर वहाँ एक समारोह थे:
int
foo (int zap[])
{
int a = sizeof(zap);
return a;
}
क्योंकि zap
एक सूचक है, foo
8
वापसी होगी, के रूप में है कि कितने बाइट्स इस विशेष सूचक स्टोर करने के लिए आवश्यक हैं। हालांकि, निम्न कोड के साथ:
int zip[] = { 0, 1, 2, 3, 4, 5 };
int i = sizeof(zip);
i
होगा 6 * sizeof(int)
= 6 * 4
= 24
क्यों है यह है कि sizeof(zip)
रिटर्न तत्वों की संख्या बार प्रत्येक तत्व के आकार, जबकि sizeof(zap)
एक के आकार देता है सूचक? क्या यह zap
का आकार निर्दिष्ट नहीं है, और zip
नहीं है? संकलक जानता कि zip
है 6
तत्वों, लेकिन कितनी बड़ी zap
हो सकता है के रूप में एक सुराग नहीं है।
संकलक द्वारा int को अनदेखा नहीं किया गया है, int x [4] फ़ंक्शन पैरामीटर के रूप में इसका अर्थ है कि आपको _exactly_ 4 तत्वों का सरणी पॉइंटर पास करना होगा। यह कोड में 'int (* x) [4]' कहीं और लिखने जैसा ही है। इसके अलावा, यह उत्तर समस्या को इंगित करता है: पैरामीटर के लिए सरणी वाक्यविन्यास का प्रोग्राम में कहीं और घोषित एरे के लिए एक अलग अर्थ है। यह सी भाषा की डंबर "विशेषताओं" में से एक है। भ्रम से बचने के लिए, पैरामीटर के लिए हमेशा 'int * x' नोटेशन का उपयोग करें। – Lundin
क्या आप इंगित कर सकते हैं कि मानक में लिखा गया है कि ब्रैकेट के बीच की संख्या पास सरणी के आकार के बराबर होनी चाहिए? संकेत: यह एक अजीब आवश्यकता होगी कि आप एक सरणी पारित नहीं कर सकते हैं और कार्य वास्तव में केवल एक सूचक प्राप्त करता है। 'Foo (bar)' के साथ फ़ंक्शन को कॉल करते समय, जहां 'बार' एक सरणी है जिसे सरणी पहले से ही एक सूचक में परिवर्तित कर दिया गया है ** यहां तक कि कंपाइलर के लिए ** फ़ंक्शन कॉल माना जाता है। किसी आकार की जानकारी पर सीमा लागू करने का कोई मतलब नहीं होगा जो रूपांतरण में पहले से ही गिरा दिया गया है। – 6502
@ लंदन, सरणी पैरामीटर के पहले आयाम के लिए नहीं, 4 को अनिवार्य रूप से अनदेखा किया जाता है। सी 99 में कीवर्ड के 'स्थिर' की संभावना है, यह निर्दिष्ट करने के लिए कि कार्य * कम से कम * वस्तुओं के लिए अपेक्षित है। लेकिन अभी भी पैरामीटर का प्रकार 'int *' है। –