यदि अभिव्यक्ति type name[count]
किसी फ़ंक्शन में लिखी गई है, तो आप सी कंपाइलर को स्टैक फ्रेम sizeof(type)*count
बाइट्स पर आवंटित करने और सरणी में पहले तत्व के पते की गणना करने के लिए कहते हैं।
यदि अभिव्यक्ति type name[count]
सभी कार्यों और संरचना परिभाषाओं के बाहर लिखी गई है, तो आप सी कंपाइलर को डेटा खंड sizeof(type)*count
बाइट्स पर आवंटित करने और सरणी में पहले तत्व के पते की गणना करने के लिए कहते हैं।
name
वास्तव में निरंतर ऑब्जेक्ट है जो सरणी में पहले तत्व के पते को संग्रहीत करता है और प्रत्येक ऑब्जेक्ट जो किसी मेमोरी के पते को संग्रहीत करता है, उसे पॉइंटर कहा जाता है, इसलिए यही कारण है कि आप name
एक सरणी के बजाय एक पॉइंटर के रूप में व्यवहार करते हैं । ध्यान दें कि सी में सरणियों को केवल पॉइंटर्स के माध्यम से एक्सेस किया जा सकता है।
यदि count
एक स्थिर अभिव्यक्ति है जो शून्य का मूल्यांकन करती है तो आप सी संकलक को शून्य बाइट्स को स्टैक फ्रेम या डेटा सेगमेंट पर आवंटित करने के लिए कहते हैं और सरणी में पहले तत्व का पता वापस करते हैं, लेकिन ऐसा करने में समस्या यह है कि पहला तत्व शून्य-लंबाई सरणी मौजूद नहीं है और आप किसी ऐसी चीज़ के पते की गणना नहीं कर सकते जो मौजूद नहीं है।
यह तर्कसंगत है कि तत्व नं। -length सरणी count+1
में मौजूद नहीं है count
, तो यही कारण है कि सी कंपाइलर शून्य-लंबाई सरणी को एक फ़ंक्शन के अंदर और बाहर चर के रूप में परिभाषित करने से मना करता है, क्योंकि name
तब की सामग्री क्या है ? क्या पते name
वास्तव में संग्रहीत करता है?
यदि p
एक सूचक है तो अभिव्यक्ति p[n]
के बराबर है*(p + n)
जहाँ सही अभिव्यक्ति में तारांकन * पॉइंटर का डीपरेशन ऑपरेशन होता है, जिसका अर्थ है कि पॉइंट द्वारा मेमोरी को एक्सेस करना p + n
या उस एक्सेस को एक्सेस करना जिसके एड्रेस में स्टोर किया गया है p + n
, जहां p + n
पॉइंटर एक्सप्रेशन है, यह एड्रेस को लेता है p
और इस एड्रेस पर नंबर को n
गुणा करता है पॉइंटर के प्रकार का आकार p
।
क्या पता और नंबर जोड़ना संभव है?
हाँ यह संभव है, क्योंकि पता अहस्ताक्षरित पूर्णांक है जिसे सामान्यतः हेक्साडेसिमल नोटेशन में दर्शाया गया है।