इस हैक को समझने के लिए, पहले आपको सूचक अंतर को समझने की आवश्यकता है, अर्थात, तब क्या होता है जब एक ही सरणी के तत्वों को इंगित करने वाले दो संकेत घटाए जाते हैं?
जब एक सूचक दूसरे से घटाया जाता है, तो परिणाम बिंदुओं के बीच की दूरी (सरणी तत्वों में मापा जाता है) होता है। तो, अगर p
इंगित करता है a[i]
और q
करने के लिए इंगित करता है a[j]
, तो p - q
बराबर हैi - j
।
C11: 6.5.6 एडिटिव ऑपरेटर (p9):
जब दो बिंदुओं को घटाया जाता है , तो दोनों एक ही एरे ऑब्जेक्ट के तत्वों को इंगित करेंगे, या एरे ऑब्जेक्ट के अंतिम तत्व को एक अतीत; परिणाम दो सरणी तत्वों की सदस्यता का अंतर है । [...]।
दूसरे शब्दों में, यदि एरे ऑब्जेक्ट के क्रमशः, -थ और -थ एलिमेंट्स , एक्सप्रेशन P
और Q
पॉइंट टू, एक्सप्रेशन में वैल्यू है , तो यह वैल्यू टाइप के ऑब्जेक्ट में फिट बैठता है ।i
j
(P)-(Q)
i−j
ptrdiff_t
अब मैं उम्मीद कर रहा हूं कि आप सूचक को सरणी नाम रूपांतरण के बारे में जानते हैं, a
सूचक को सरणी के पहले तत्व में कनवर्ट करता है a
।&a
पूरे मेमोरी ब्लॉक का पता है, अर्थात यह सरणी का एक पता है a
। नीचे दिया गया आंकड़ा आपको समझने में मदद करेगा ( विस्तृत विवरण के लिए इस उत्तर को पढ़ें ):
इससे आपको यह समझने में मदद मिलेगी कि क्यों a
और &a
एक ही पता है और कैसे (&a)[i]
पता है कि i th अरेंज (उसी के आकार का a
)।
तो, बयान
return (&a)[n] - a;
के बराबर है
return (&a)[n] - (&a)[0];
और यह अंतर संकेत करने (&a)[n]
वालों के बीच तत्वों की संख्या देगा (&a)[0]
, और जो n
प्रत्येक n
int
तत्व के सरणियाँ हैं। इसलिए, कुल सरणी तत्व हैंn*n
= n
2 हैं ।
ध्यान दें:
C11: 6.5.6 एडिटिव ऑपरेटर (p9):
जब दो बिंदुओं को घटाया जाता है, तो दोनों एक ही एरे ऑब्जेक्ट के तत्वों को इंगित करेंगे, या एरे ऑब्जेक्ट के अंतिम तत्व को एक अतीत ; परिणाम दो सरणी तत्वों की सदस्यता का अंतर है। परिणाम का आकार कार्यान्वयन-परिभाषित है , और इसका प्रकार (एक हस्ताक्षरित पूर्णांक प्रकार) हेडर ptrdiff_t
में परिभाषित किया गया है <stddef.h>
। यदि परिणाम उस प्रकार के ऑब्जेक्ट में प्रतिनिधित्व करने योग्य नहीं है, तो व्यवहार अपरिभाषित है।
चूँकि (&a)[n]
न तो एक ही एरे ऑब्जेक्ट के तत्वों को इंगित करता है और न ही एरे ऑब्जेक्ट के अंतिम तत्व को अतीत में, अपरिभाषित व्यवहार(&a)[n] - a
को आमंत्रित करेगा ।
यह भी ध्यान दें कि, फ़ंक्शन के रिटर्न प्रकार को बदलने के लिए बेहतर p
है ptrdiff_t
।