सरणी के लिए पॉइंटर के इस डीरफ्रेंसिंग के साथ आकार कैसे काम करता है?


9

यहाँ मेरे पास 4 पूर्णांक के ptrसरणी arrके लिए एक संकेतक है । ptrपूरे सरणी के लिए अंक। ptr[0]या *ptrसरणी के पहले तत्व को इंगित करता है, इसलिए 1 को जोड़कर सरणी ptr[0]के दूसरे तत्व का पता देता है।

मैं समझ नहीं पा रहा हूं कि sizeof(ptr[0])पूरे सरणी का आकार 16 बाइट्स क्यों देता है, न कि केवल पहले तत्व का आकार, 4 बाइट्स, ( ptr[0]सरणी में पहले तत्व को इंगित करता है)।

int arr[4] = {0, 1, 2, 3};
int (*ptr)[4] = &arr;
printf("%zd", sizeof(ptr[0])); //output is 16

दूसरी पंक्ति नहीं होनी चाहिए int *ptr = arr;? यह इसे सरणी के पहले (पहले तत्व) के लिए इंगित करेगा, जो समकक्ष है &arr[0]
एंड्रियास वेन्जेल

1
@AndreasWenzel दूसरी पंक्ति नहीं होनी चाहिए int *ptr = arr;? दरअसल नहीं। चार मानों की एक पूरी सरणी के लिए एक संकेतक के रूप में int (*ptr)[4]बनाता है । पॉइंटर सिंटैक्स जैसे कि सच-बहुआयामी सरणियों को गतिशील रूप से आवंटित करना आवश्यक है। नेस्टेड लूप्स के साथ बनाई गई "2-आयामी सरणियों" और गलत तरीके से बहुआयामी सरणियों के रूप में वर्णित वास्तव में 1-d सरणियों से कई 1-d सरणियों के बिंदु हैं। देखें stackoverflow.com/questions/42094465/...ptrintmalloc()
एंड्रयू हेनले

जवाबों:


6

ओपी: ptr[0]सरणी में पहले तत्व को इंगित करता है।

भ्रम टाइप करें। ptr[0]एक सरणी है।

ptrint के सरणी 4 के लिए एक सूचक है
ptr[0], जैसे सूचक को व्यूह में*ptr बाँटना । एक सरणी का आकार है।
sizeof(ptr[0])


के साथ sizeof(ptr[0]), ptr[0]"'पॉइंटर टू टाइप' के साथ एक एक्सप्रेशन को लाइक नहीं करता है जो कि एरे ऑब्जेक्ट के शुरुआती एलिमेंट को" कन्वर्सेशन "की ओर इशारा करता है। (c11dr §6.3.2.1 3)। के साथ sizeof, ptr[0]एक सरणी है।


1
@ अब्द-इलाहमानमोहम्मद सहमत "लेकिन पीटीआर [0] [0] एक पूर्णांक है जो पूर्णांक की ओर इशारा नहीं करता है"। "ptr [0] सरणी में पहले तत्व का पता है" सच नहीं है।
chux -

1
@ अब्द-इलाहमानमोहम्मद हाँ, मूल्य समान हैं लेकिन प्रकार भिन्न हैं। पीटीआर [0] में सरणी प्रकार होता है और &ptr[0][0]इसका int *प्रकार होता है
ग्रीन ट्री

1
@chux ptr[0]( संक्षेप में रूपांतरित int *) पहली अंतर तत्व के पते का मूल्यांकन करेगा।
ग्रीन ट्री

1
@ आकार के बारे में - सही, मुझे आपके द्वारा कही गई बात का गलत अर्थ लगता है
ग्रीन ट्री

1
@ अब्द-इलाहमानमोहम्मद ऐसा नहीं करता। printf("someforamt", ptr[0] , ptr[0]+1)कुछ अलग करता है sizeof(ptr[0])ptr[0]पहले मामले में एक inplicit रूपांतरण के माध्यम से चला जाता है। के साथ sizeof(ptr[0]), ptr[0]नहीं करता है।
chux -

5

ptrयहाँ प्रकार का है pointer to an array of 4 int elementsऔर सरणी प्रकार आपके प्लेटफ़ॉर्म पर आकार 16 है (sizeof (int) * (हाथियों की संख्या))।

मुझे समझ नहीं आ रहा है कि sizeof (ptr [0]) का उपयोग करने से पूरे सरणी का आकार 16 बाइट्स हो जाता है, केवल पहले तत्व 4 बाइट्स का आकार नहीं

क्योंकि C प्रकार प्रणाली में सरणी प्रकार हैं। यहाँ दोनों arrऔर *ptrहै। आप जो घोषित करते हैं, वह आपके पास है। साइज़ोफ़ इंट को पाने के लिए आपको साइज़ोफ़ करना चाहिए (ptr [0] [0]) - जहाँ ptr [0] एरे का मूल्यांकन करता है।


2

साथ int (*ptr)[4] = &arr ;आप चार पूर्णांकों की एक सरणी के लिए सूचक और आगमन की ओर इशारा करते है।

ptrअब arrएक डबल पॉइंटर की तरह इशारा कर रहा है । हम के तत्वों का उपयोग कर सकते arrका उपयोग कर ptr[0][x]जहां xहो सकता है 0के लिए 4

तो sizeof(ptr[0])ऐसा ही हैsizeof(arr)


2

परिभाषा के अनुसार, ptr[0]जैसा *(ptr + 0)है बदले में वैसा ही है *ptr। इसके अलावा, ptrइनिशियलाइज़्ड के साथ &arr, ऐसा *ptrहै *&arrऔर बस है arr। ध्यान दें कि के मध्यवर्ती भंडारण &arrमें ptrहै नहीं किसी भी सरणी क्षय तो तुल्यता बनाए रखा है और कोई प्रकार की जानकारी खो दिया है करने के लिए,।

ध्यान दें कि यह सब संकलन-समय पर गणना की जाती है, बस इस अतिरिक्त नुकसान से बचने के लिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.