मैं हमेशा मानता था कि सी में:
int a[5][3]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
सरणियों की एक सरणी को संदर्भित करता है और स्मृति में पंद्रह सन्निहित ब्लॉक संग्रहीत हैं लेकिन a[0]
के लिए सूचक है a[0][0]
तथा a[1]
के लिए सूचक है a[1][0]
और इसी तरह। इसलिए मैंने सोचा कि यह व्यूअर की एक सरणी के समान है। उनके बीच क्या अंतर है?
उत्तर:
जवाब के लिए 2 № 1Arrays और संकेत एक बहुत ही उत्सुक और हैC (और C ++) में अंतरंग संबंध। अधिकांश संदर्भों में, यदि आपके पास कुछ ऐसा है जो "एक्स का सरणी" है, तो यह चुपचाप एक "पॉइंटर से एक्स" में परिवर्तित हो जाएगा जो सरणी के पहले तत्व पर इंगित करता है।
आपका विश्वास है कि
int a[5][3];
सरणियों की एक सरणी बनाता है पूरी तरह से सही है। घोषणा के अनुसार, यह एक है array of 5 arrays of 3 ints
और यह 15 सन्निहित पूर्णांकों को स्मृति में रखता है।
जहां आप गलत करते हैं, वह विश्वास करने में है a[0]
एक सूचक होने के लिए। असल में, a[0]
का पहला उप-सरणी है a
और खुद ए array of 3 ints
। हालांकि, संकेत और सरणियों के बीच जिज्ञासु संबंध के कारण, अभिव्यक्ति a[0]
लगभग हमेशा एक सूचक में परिवर्तित हो जाता है।
की एक सरणी के बीच प्रमुख अंतरों में से एकएरे और पॉइंटर्स का एक सरणी है, जहां एरे तत्व रहते हैं। सरणी का एक सरणी हमेशा स्मृति के एक सन्निहित ब्लॉक पर कब्जा कर लेगा, लेकिन संकेत की एक सरणी में संकेत प्रत्येक अपने स्वयं के (अक्सर असंतुष्ट) स्मृति के ब्लॉकों को संदर्भित करेगा।
जवाब के लिए 0 № 2
Arrays और संकेत समान रूप से समान होते हैंचीज़। जब आप एक सरणी एन लंबे घोषित करते हैं, तो आप "स्मृति एन के एक ब्लॉक को आवंटित करते हैं लंबे समय (मूल्य प्रकार का आकार) और पहले तत्व को सूचक लौटाते हैं। जैसे भाव। arr[2]
फिर उस पहले पॉइंटर से आगे की गिनती करके उस मेमोरी से एक मान प्राप्त करें। यदि आपके पास सरणियों की एक सरणी है, तो आप सभी पहले एक (अपने में) का भंडारण कर रहे हैं a
सरणी) वह बिंदु है जहां अन्य सरणियों को संग्रहीत किया जाता है। (उस ने कहा, मेरा मानना है कि वे एक सन्निहित ब्लॉक में होना चाहिए जैसा आपने कहा)
क्या इससे कुछ हद तक स्पष्टीकरण में मदद मिलती है?
जवाब के लिए 0 № 3
int a[5][3]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
यह एक सच्चा दो आयामी सरणी है: 15 int
आकार के स्थानों को अलग रखा गया है और तत्व को खोजने के लिए पारंपरिक आयताकार सबस्क्रिप्ट का उपयोग किया जाता है a[row][col]
int *b[5];
यह पॉइंटर्स की एक सरणी है जो 5 पॉइंटर्स आवंटित करती है और इसे इनिशियलाइज़ नहीं किया जाता है a[3][2]
तथा b[3][2]
दोनों एक ही int के लिए संवैधानिक रूप से कानूनी संदर्भ हैं।
यह मानते हुए कि प्रत्येक तत्व b
कर देता है तीन-तत्व सरणी की ओर इंगित करें, तब होगा 15 ints
अलग सेट, प्लस पाँच कोशिकाओं के लिए संकेत दिए गए।
सूचक सरणी का महत्वपूर्ण लाभ यह है कि सरणी की पंक्तियाँ हो सकती हैं अलग-अलग लंबाई। अर्थात् प्रत्येक तत्व b
तीन-तत्व वेक्टर की ओर इंगित करने की आवश्यकता नहीं है, कुछ दो तत्वों को इंगित कर सकते हैं, कुछ को नौ, और कुछ को बिल्कुल भी नहीं।