2011-04-05 14 views
6

जब आप बहु-आयामी सरणी char a[10][10] बनाते हैं, तो मेरी पुस्तक के अनुसार यह कहता है कि आपको किसी फ़ंक्शन में सरणी पास करने के लिए char a[][10] के समान पैरामीटर का उपयोग करना होगा।मल्टी-आयामी सरणी और पॉइंटर पॉइंटर्स

आपको इस तरह की लंबाई निर्दिष्ट क्यों करनी चाहिए? क्या आप बस एक डबल पॉइंटर के साथ रहने के लिए नहीं गुजर रहे हैं, और क्या वह डबल पॉइंटर आवंटित स्मृति को इंगित नहीं करता है? तो पैरामीटर char **a क्यों नहीं हो सका? आप char ** dereferenced दूसरे से 10

उत्तर

12

प्वाइंटर आपूर्ति सरणियों नहीं कर रहे हैं

A से किसी भी नए स्मृति पुनः दिए जाने कर रहे हैं प्रकार char * का एक उद्देश्य है।

एक अस्वीकृत char (*)[10]char [10] प्रकार का एक ऑब्जेक्ट है।

सरणी संकेत

c-faq entry about this very subject देख पाने में असमर्थ हैं।


मान लें आप

char **pp; 
char (*pa)[10]; 

है और तर्क की खातिर, एक ही जगह पर दोनों बिंदु के लिए,: 0x420000।

pp == 0x420000; /* true */ 
(pp + 1) == 0x420000 + sizeof(char*); /* true */ 

pa == 0x420000; /* true */ 
(pa + 1) == 0x420000 + sizeof(char[10]); /* true */ 

(pp + 1) != (pa + 1) /* true (very very likely true) */ 

और यही कारण है कि तर्क प्रकार char** का नहीं हो सकता। इसके अलावा char** और char (*)[10] संगत प्रकार नहीं हैं, इसलिए तर्क के प्रकार (सड़ा हुआ सरणी) मानकों (समारोह प्रोटोटाइप में टाइप करें)

+0

आपके द्वारा दी गई स्पष्टीकरण बहुत स्पष्ट है, धन्यवाद :-)। – rubixibuc

+0

यह भी आपके द्वारा प्रदान किया गया लिंक अद्भुत है। – rubixibuc

+0

आपका स्वागत है। आपको सी-एफएक्स पसंद है। केवल अनुभाग 6 को न पढ़ें: इसे पढ़ें [http://c-faq.com/index.html)। – pmg

1

सी भाषा मानक, मसौदा n1256 मेल खानी चाहिए:

6,3। 2.1 Lvalues, सरणियों, और समारोह designators
... जब यह sizeof ऑपरेटर या एकल & ऑपरेटर के संकार्य है, या एक स्ट्रिंग शाब्दिक अभिव्यक्ति टाइप किया है कि एक सरणी प्रारंभ करने, प्रयोग किया जाता है सिवाय
3 '' प्रकार ' प्रकार' 'पॉइंटर से प्रकार' 'के साथ एक अभिव्यक्ति में परिवर्तित किया गया है जो के प्रारंभिक तत्व को सरणी ऑब्जेक्ट को इंगित करता है और यह एक अंतराल नहीं है। यदि सरणी ऑब्जेक्ट में स्टोरेज क्लास पंजीकृत है, तो व्यवहार अपरिभाषित है।

char a[10][10]; 

की घोषणा सरणी अभिव्यक्ति a के प्रकार के "char के 10-तत्व वाली सरणी के 10-तत्व वाली सरणी" है को देखते हुए। उपर्युक्त नियम के अनुसार, जो "char" के 10-तत्व सरणी को इंगित करने के लिए गुप्त हो जाता है, या char (*)[10]

याद रखें कि फ़ंक्शन पैरामीटर घोषणा के संदर्भ में, T a[N] और T a[]T *a के समान हैं; इस प्रकार, T a[][10]T (*a)[10] के समान है।

+0

इसे पोस्ट करने के लिए धन्यवाद, इससे मुझे भी मदद मिली। :-) – rubixibuc

संबंधित मुद्दे