दिलचस्प पोस्ट
क्या स्टैक्स या ढेर में संग्रहीत primitives के एक जावा सरणी है? केवल ऑपरेशन पढ़ने के लिए मुझे हाइबरनेट में लेन-देन की आवश्यकता क्यों है? UICollectionView प्रवाह सही ढंग से कोशिकाओं को लपेटने से नहीं लेआउट (आईओएस) सामान्य विधि के लिए GetMethod PHP में URL से पार्सिंग डोमेन IPhone पर बेस64 एन्कोडिंग कैसे करें I क्या HTML5 आपको किसी ब्राउज़र में से स्थानीय क्लाइंट फ़ाइलों से इंटरैक्ट करने की अनुमति देता है में अंतर्निहित एनिमेशन को अक्षम करना – MySQL तालिका से आईडी याद आ रही है UITapGestureRecognizer – इसे छूने पर काम करते हैं, स्पर्श नहीं करते हैं? प्रोग्रामर रूटर V4 का उपयोग करके नेविगेट करें सशर्त-और और सशर्त-या ऑपरेटरों के जावा आवधिक असाइन संस्करण क्यों नहीं हैं? (&& =, || =) आप Windows पर एक वर्चुअल नेटवर्क इंटरफेस कैसे बनाते हैं? प्रक्षेपक में अपेक्षित स्थितियां IE10 में क्रॉस-मूल पोस्ट मेसेज टूटा हुआ है?

सूचक अंकगणित में सी

निम्नलिखित कोड खंड पर विचार करें:

int (*p)[3]; int (*q)[3]; q = p; q++; printf("%d, %d\n", q, p); printf("%d\n", qp); 

मुझे पता है कि सूचक अंकगणितीय बुद्धिमान है, जिसका अर्थ है कि अगली 3-पूर्णांक-सरणी को इंगित करने के लिए ऑपरेशन q++ अग्रिम q पर्याप्त बाइट्स हैं, इसलिए यह मुझे आश्चर्य नहीं है कि पहला प्रिंट 12, 0 ' है जिसका अर्थ है कि वृद्धिशील q इसे 12 में बड़ा बना दिया

लेकिन दूसरा प्रिंट मुझे आश्चर्यचकित करता है यह 1 प्रिंट करता है!
तो यह 12 के बजाय 1 प्रिंट क्यों करेगा? यह सिर्फ मुझे पहेली

वेब के समाधान से एकत्रित समाधान "सूचक अंकगणित में सी"

++ इंचालिमेंट ऑपरेटर की तरह, पॉइंटर्स के साथ- घटाव ऑपरेटर भी ऑब्जेक्ट्स के आकार को ध्यान में रखता है। विशेष रूप से, परिणाम दिया जाता है, पॉइंटर मूल्यों में बाइट्स फर्क की संख्या, जो इंगित-टू ऑब्जेक्ट के आकार से विभाजित है (12, आपके उदाहरण में)। तो अंतर 12 बाइट्स है, जो कि आकार 12 या 1 से विभाजित है।

यदि आप वास्तव में अंतर जानना चाहते हैं तो प्रत्येक पॉइंटर्स को प्रत्येक (चार *) और फिर (int) में डालें और फिर घटाएं। यही आपको जवाब देना चाहिए।

यह कोड आपको पूर्ण मूल्य देता है:

 printf("%d\n", abs((int)((char*)q) - (int)((char*)p))); 

गणित को शामिल करना याद रखें।

संपादित करें: जैसा कि एक टिप्पणी में बताया गया है, हमें दोहरे कलाकारों की आवश्यकता नहीं है। प्रत्येक सूचक सूचक को पूर्णांक में कास्ट करना और फिर घटा देना समान उत्तर देता है (अनावश्यक) ऊपर का दोहरी कास्टिंग।

 printf("%d\n", abs((int)(q) - (int)(p)));