इस्तेमाल किया गया है, हम दो अलग अलग संदर्भों समझने की जरूरत है।
- मूल्य संदर्भों में, प्रकार
T
की एक सरणी के नाम एक सूचक टाइप करने के लिए करने के लिए T
बराबर है, और सरणी के पहले तत्व के लिए सूचक के बराबर है।
- ऑब्जेक्ट संदर्भों में,
T
प्रकार की एक सरणी का नाम एक सूचक को कम नहीं करता है।
ऑब्जेक्ट संदर्भ क्या है?
a = b;
, a
ऑब्जेक्ट संदर्भ में है। जब आप एक चर का पता लेते हैं, तो इसका उपयोग ऑब्जेक्ट संदर्भ में किया जाता है। अंत में, जब आप एक चर पर sizeof
ऑपरेटर का उपयोग करते हैं, तो इसका उपयोग ऑब्जेक्ट संदर्भ में किया जाता है। अन्य सभी मामलों में, वैरिएबल संदर्भ में एक चर का उपयोग किया जाता है।
अब हम इस ज्ञान है कि, जब हम करते हैं:
void f(int arr[4]);
यह है बिल्कुल बराबर करने के लिए
void f(int *arr);
आप को पता चला रूप में, हम (ऊपर 4) आकार छोड़ सकते हैं समारोह घोषणा से। इसका मतलब है कि आप f()
पर "सरणी" के आकार को नहीं जान सकते हैं।बाद में, जब आप ऐसा करेंगे:
int a[]={1,2,3,4};
f(a);
समारोह कॉल में, नाम a
मूल्य के संदर्भ में है, इसलिए यह int
के लिए सूचक को कम करता है। यह अच्छा है, क्योंकि f
एक सूचक को int
पर अपेक्षा करता है, इसलिए फ़ंक्शन परिभाषा और उपयोग मिलान। f()
को पास किया गया है a
(&a[0]
) के पहले तत्व का सूचक है।
int a[]={1,2,3,4};
int b[4] = a;
नाम b
के मामले में एक वस्तु के संदर्भ में प्रयोग किया जाता है, और एक सूचक को कम नहीं करता। (संयोग से, a
यहाँ एक मूल्य के संदर्भ में है, और एक सूचक को कम करता है।)
अब, रों के भंडारण के लायक प्रदान करती है और इसे करने के लिए नाम b
देता है। a
को भी इसी तरह का भंडारण सौंपा गया था। तो, असल में, उपर्युक्त असाइनमेंट का अर्थ है, "मैं भंडारण स्थान को पिछले स्थान जैसा ही बनाना चाहता हूं"। यह समझ में नहीं आता है।
आप प्रतिलिपिb
में a
की सामग्री चाहते हैं, तो आप कर सकता है:
#include <string.h>
int b[4];
memcpy(b, a, sizeof b);
या, यदि आप एक सूचक b
कि a
की ओर इशारा करना चाहता था:
int *b = a;
यहां, a
मूल्य संदर्भ में है, और int
पर एक सूचक को कम कर देता है, इसलिए हम a
को असाइन कर सकते हैं एक int *
।
अंत में, जब एक सरणी आरंभ, आप इसे स्पष्ट मान को असाइन कर सकते हैं:
int a[] = {1, 2, 3, 4};
यहाँ, एक 4 तत्वों, प्रारंभ हो जाता है 1, 2, 3, और 4 के लिए आप भी कर सकता है :
int a[4] = {1, 2, 3, 4};
यदि सरणी में तत्वों की संख्या की तुलना में सूची में कम तत्व हैं, तो शेष मान 0 होने के लिए लिया जाता है:
int a[4] = {1, 2};
सेट a[2]
और 0.
प्रश्न के शीर्षक को फिर से लिखना होगा, वर्तमान में अत्यधिक सामान्य और लोअरकेस है। –