"क्षय" एक सरणी प्रकार से सूचक प्रकार के लिए अभिव्यक्ति के निहित रूपांतरण को संदर्भित करता है। अधिकांश संदर्भों में, जब संकलक एक सरणी अभिव्यक्ति देखता है, तो यह अभिव्यक्ति के प्रकार को "एन-एलिमेंट सरणी ऑफ़ टी" से "पॉइंटर टू टी" में परिवर्तित करता है और एक्सप्रेशन के मूल्य को एरे के पहले तत्व के पते पर सेट करता है। । इस नियम के अपवाद तब होते हैं जब एक सरणी sizeof
या तो &
ऑपरेटर या ऑपरेटरों का एक ऑपरेंड होता है , या सरणी एक स्ट्रिंग शाब्दिक है जिसे घोषणा में इनिशियलाइज़र के रूप में उपयोग किया जा रहा है।
निम्नलिखित कोड मान लें:
char a[80];
strcpy(a, "This is a test");
अभिव्यक्ति a
प्रकार "80-एलीमेंट ऑफ़ चार" और एक्सप्रेशन "दिस इज़ ए टेस्ट" टाइप ऑफ़ "16-एलीमेंट अरेंज ऑफ़ चार" है (सी में; सी ++ स्ट्रिंग लिटरल में कॉन्स्ट चार्ज के एरेज़ हैं)। हालांकि, कॉल में strcpy()
, न तो अभिव्यक्ति का एक ऑपरेंड है sizeof
या नहीं &
, इसलिए उनके प्रकारों को संक्षेप में "पॉइंटर टू चार" में बदल दिया जाता है, और उनके मूल्यों को प्रत्येक में पहले तत्व के पते पर सेट किया जाता है। जो strcpy()
प्राप्त होता है वह सरणियाँ नहीं है, लेकिन संकेत हैं, जैसा कि इसके प्रोटोटाइप में देखा गया है:
char *strcpy(char *dest, const char *src);
यह एक सरणी पॉइंटर के समान नहीं है। उदाहरण के लिए:
char a[80];
char *ptr_to_first_element = a;
char (*ptr_to_array)[80] = &a;
दोनों ptr_to_first_element
और ptr_to_array
एक ही मूल्य है ; आधार का पता हालांकि, वे अलग-अलग प्रकार के होते हैं और अलग तरह से व्यवहार किए जाते हैं, जैसा कि नीचे दिखाया गया है:
a[i] == ptr_to_first_element[i] == (*ptr_to_array)[i] != *ptr_to_array[i] != ptr_to_array[i]
याद रखें कि अभिव्यक्ति a[i]
की व्याख्या की जाती है *(a+i)
(जो कि केवल तभी काम करता है जब सरणी प्रकार एक सूचक प्रकार में परिवर्तित हो जाता है), इसलिए दोनों a[i]
और ptr_to_first_element[i]
एक ही काम करते हैं। अभिव्यक्ति के (*ptr_to_array)[i]
रूप में व्याख्या की है *(*a+i)
। अभिव्यक्तियों *ptr_to_array[i]
और ptr_to_array[i]
संदर्भ के आधार पर संकलक चेतावनी या त्रुटियां हो सकती हैं; यदि आप उनसे मूल्यांकन करने की अपेक्षा कर रहे हैं तो वे निश्चित रूप से गलत काम करेंगे a[i]
।
sizeof a == sizeof *ptr_to_array == 80
फिर, जब एक सरणी का एक ऑपरेंड होता है sizeof
, तो यह एक पॉइंटर प्रकार में परिवर्तित नहीं होता है।
sizeof *ptr_to_first_element == sizeof (char) == 1
sizeof ptr_to_first_element == sizeof (char *) == whatever the pointer size
is on your platform
ptr_to_first_element
चार करने के लिए एक सरल सूचक है।
int a[10]; int b(void);
, फिर+a
एक इंट्री पॉइंटर है और+b
एक फ़ंक्शन पॉइंटर है। यदि आप किसी संदर्भ को स्वीकार करने वाले टेम्पलेट में इसे पास करना चाहते हैं तो उपयोगी है।