सी ++ में, सी में, एक पैरामीटर जिसे सरणी प्रकार के रूप में घोषित किया गया है, (संकलन समय पर) सूचक प्रकार के होने के लिए समायोजित किया गया है, विशेष रूप से सरणी के तत्व प्रकार के लिए एक सूचक।
ऐसा होता है कि सरणी प्रकार सीधे या टाइपिफ़ के माध्यम से निर्दिष्ट किया गया है (याद रखें कि टाइपिफ़ एक नया प्रकार नहीं बनाता है, केवल मौजूदा प्रकार के लिए उपनाम)।
तो यह:
typedef char ar[];
typedef char* pr;
void f2(ar x, pr y)
{
// ...
}
वास्तव में मतलब है:
void f2(char* x, char* y)
{
// ...
}
एक और नियम, भी C और C++ द्वारा साझा, कि सरणी प्रकार का एक अभिव्यक्ति सबसे में लेकिन सभी नहीं, है संदर्भ, अंतर्निहित ने को सरणी ऑब्जेक्ट के पहले तत्व के पॉइंटर में परिवर्तित किया। इसका मतलब है कि अगर आप एक सरणी वस्तु को परिभाषित:
char arr[10];
आपको लगता है कि ऑब्जेक्ट का नाम एक तर्क के रूप में एक समारोह है कि एक char*
पैरामीटर (जो सीमा जानकारी खो देता है) लेता है करने के लिए उपयोग कर सकते हैं।
सी में, मामलों में जहां इस अंतर्निहित रूपांतरण नहीं होता हैं:
- जब सरणी अभिव्यक्ति
sizeof
(sizeof arr
के संकार्य है एक के आकार सरणी के आकार, नहीं पैदावार सूचक);
- जब सरणी अभिव्यक्ति यूनरी
&
(&arr
का ऑपरेंड है पॉइंटर-टू-एरे है, पॉइंटर-टू-पॉइंटर नहीं है); और
- जब सरणी अभिव्यक्ति एक स्ट्रिंग शब्दशः है जो सरणी प्रकार (
char s[] = "hello";
) को किसी सरणी के रूप में s
प्रारंभ करने के लिए उपयोग की जाती है, सूचक के रूप में नहीं)।
इन मामलों (या अन्य मामलों है कि सी में होते हैं ++) में से कोई भी अपने कार्यक्रम में दिखाई देते हैं, तो आपकी कॉल तो:
f2(data,ptr);
f2
के प्रकार char*
के दो सूचक मूल्यों से गुजरता है।
f2
अंदर, पैरामीटर वस्तुओं x
और y
प्रकार char*
के दोनों हैं, इसलिए std::is_same<decltype(x), decltype(y)>::value
सच है।
लेकिन ar
और pr
प्रकार अलग हैं। ar
एक अपूर्ण सरणी प्रकार char[]
है, और pr
सूचक प्रकार char*
है।
जो आपके प्रोग्राम के आउटपुट को बताता है। अजीबता होती है क्योंकि पैरामीटर x
, जिसे आपने सरणी प्रकार ar
के साथ परिभाषित किया है, वास्तव में char*
प्रकार है, जो pr
जैसा ही प्रकार है।
क्षय? (फ़ंक्शन पैरामीटर के रूप में) – dyp
(मेरी टिप्पणी पर विस्तारित :) फ़ंक्शन के पैरामीटर प्रकार [dcl.fct]/5 के अनुसार "क्षय" हैं: "प्रत्येक पैरामीटर के प्रकार का निर्धारण करने के बाद, प्रकार के किसी पैरामीटर" सरणी " टी' "या" फंक्शन रिटर्निंग 'टी' "को क्रमशः' टी 'के सूचक" या "लौटने के लिए सूचक" क्रमशः समायोजित किया गया है। इसलिए 'decltype (x) 'है *' char' * के सूचक, * 'char' * के अज्ञात बाध्य की सरणी नहीं (' ar' के विपरीत)। – dyp
@DyP मानक संदर्भ के लिए धन्यवाद, महोदय। – WhozCraig