2009-07-05 16 views
11

पर ड्रेन्फरेंसिंग पॉइंटर मेरे पास 10 की पूर्णांक सरणी के लिए एक सूचक है। इस सूचक को संदर्भित करने के लिए मुझे क्या देना चाहिए?पूर्णांक सरणी

उदाहरण के लिए:

#include<stdio.h> 

main() 
{ 
    int var[10] = {1,2,3,4,5,6,7,8,9,10}; 
    int (*ptr) [10] = &var; 

    printf("value = %u %u\n",*ptr,ptr); //both print 2359104. Shouldn't *ptr print 1? 


} 

उत्तर

15

क्या आप भिन्नता एक सरणी के लिए सूचक है। इस प्रकार, dereferencing आपको सरणी देता है। Printf (या किसी भी फ़ंक्शन के लिए) को सरणी पास करना पहले तत्व का पता पास करता है।

आप printf बताते हैं कि आप इसे पारित एक unsigned int (%u), लेकिन वास्तव में क्या पारित हो जाता है एक int* है। आपके द्वारा देखी जाने वाली संख्या सरणी के पहले तत्व के पते हैं जो एक हस्ताक्षरित int के रूप में व्याख्या की गई हैं।

बेशक, यह अपरिभाषित व्यवहार है। अगर आप एक पता मुद्रित करना चाहते हैं, तो आपको %p का उपयोग करना होगा और void* पास करना होगा।

+0

या आप एक उचित पूर्णांक प्रकार - जैसे ''' से uintptr_t पर जा सकते हैं और उचित प्रारूप आइटम का उपयोग कर सकते हैं, शायद PRIUPTR (वह कहता है, एक फ्लैकी मेमोरी से काम कर रहा है)। –

+0

litb, क्या आप मुझे समझा सकते हैं कि "dereferencing आपको सरणी देता है" मतलब क्या है? क्या यह फिर से सरणी के लिए सूचक है? या यह पहले तत्व का पता है? – chappar

+0

यह आपको "var" नाम देने के समान ही देता है: सरणी :) इस प्रकार, 'sizeof (* ptr) == 10 * sizeof (int) ', और' & * ptr == int (*) [ 10] ' –

10

जब आप घोषित

int var[10]; 

var के लिए एक संदर्भ टाइप(Link to C Faq Relevant's section) int करने के लिए सूचक है।

&var का संदर्भ सूचकांक है 10 इंच में।

आपका घोषणा int (*ptr) [10] ठीक ही 10 ints की एक सरणी के लिए सूचक बनाता है जो आप &var(Link to C Faq Relevant's section) (10 ints की एक सरणी के लिए सूचक का पता) आवंटित करने के लिए।

इन चीजों के साथ उम्मीद है कि ptrपॉइंटर के आधार पते को 10 इंच के सरणी पर प्रिंट करेगा।

*ptr तो पहला तत्व 10 ints की सरणी के की पता प्रिंट होगा।

इनमें से दोनों इस मामले में बराबर हैं और यही कारण है कि आप एक ही पते को देखते हैं।

और हाँ, **ptr would give you 1.

+0

अगर आप लीटब की सलाह का पालन करते हैं तो यह सही तरीके से प्रिंट करेगा। प्रिंटिंग पते के दौरान (शून्य *) और% पी का उपयोग करें। –

-1

मुझे लगता है कि यह और अधिक स्पष्टता ला सकता है:

(मैं सिर्फ कोड का एक टुकड़ा का उपयोग कर रहा अव्यवस्था कम करने)

घोषणा:

int a[5]; 
a[5] = {0,1,2,3,4); 

संकेत

ptr = a <======> ptr = &a[0] 

अपसंदर्भन

*ptr = *a <======> *ptr = *&a[0] 
        *ptr = a[0] 

इसलिए, हम लिख सकते हैं:

*(ptr + i) = *(a + i) <======> *(ptr + i) = a[i] 

नोट: '< =====>' बस 'के लिए एक संकेत का अर्थ है '। कुछ खास नहीं!!! आशा है कि मैं गलत नहीं हूँ ??

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