2011-05-24 13 views
7

a पूर्णांक की सरणी है, यदि मैं &a[2] - &a[1] == ? के पते मान को घटाने का प्रयास करता हूं तो परिणाम 4 या 1 होना चाहिए?सी ++: और एक [2] - और एक [1] ==?

EDIT: शीर्ष उत्तर here पर चौथी टिप्पणी देखें क्यों वह 1 कहता है ?? यही कारण है कि मैं उलझन में मैंने सोचा कि यह हो जाएगा 4

संपादित हूँ: यहाँ एक test

+5

जब आप इसे चलाते हैं तो आपको क्या मिलता है? –

+3

@disioe : आपके पास कंपाइलर नहीं है? तो आप कोड क्यों लिख रहे हैं? –

+0

@ मिच गेहूं: मैं नहीं हूं कि मैं सो नहीं सकता, इसलिए मैं स्टैक ओवरफ्लो पढ़ रहा हूं :)) मैं पैसे के लिए सी # में प्रोग्राम करता हूं। लेकिन वास्तव में मैं इसे codepad.org पर आजमाने की कोशिश कर रहा था लेकिन अब यह काम नहीं कर रहा है इसलिए मैंने – disioe

उत्तर

9

&a[2]&(*(a + 2)) रूप में ही है (अर्थात (a + 2)) और &a[1]&(*(a + 1)) (अर्थात (a + 1)) के समान है। तो जवाब होगा 1.

+0

बहुत बहुत धन्यवाद, मुझे अब मिल गया है। यह थ्रेड में भी था जिसे मैंने पढ़ा लेकिन किसी भी तरह से मुझे यह नहीं मिला। आपकी सहायता के लिए एक बार फिर से धन्यवाद। – disioe

+0

कोई समस्या नहीं @disioe। –

6

सूचक घटाव है आप तत्वों, नहीं बाइट्स में अंतर देता है। इससे कोई फर्क नहीं पड़ता कि सरणी का तत्व किस प्रकार है, &a[2] - &a[1] का परिणाम हमेशा 1 होगा, क्योंकि वे 1 तत्व अलग हैं।

3

अंतर होना चाहिए 1. जब आप पॉइंटर्स की तुलना करते हैं तो आपको हमेशा तत्वों का अंतर मिल जाएगा।

4

यह हमेशा होता है 1. पॉइंटर अंकगणित प्रत्येक तत्व के बाइट्स की संख्या से संबंधित नहीं हैं, और यह बहुत उपयोगी है। इन की तुलना करें:

ptr++; // go to the next element (correct) 
ptr += sizeof *ptr; // go to the next element (wrong) 

जब आप सरणियों के साथ काम आप आमतौर पर तत्वों में रुचि, बाइट्स उन्हें शामिल नहीं कर रहे हैं, और यही वजह है सी में सूचक arithmetics इस तरह से परिभाषित किया गया है।

2

चूंकि यह सी ++ है, इसलिए मुझे लगता है कि आपने & या * ऑपरेटर को किसी भी प्रकार a पर ओवरराइड नहीं किया है। कि काम कर, निम्न सत्य है:

&a[2] - &a[1] 
(a + 2) - (a + 1) 
a + 2 - a - 1 
2 - 1 
1 
+1

अच्छा व्युत्पन्न। – harper

1

जवाब यहां के एक जोड़े (के बाद से इस उत्तर पोस्ट किया गया हटाया गया) स्पष्ट रूप से किया था बाइट * ध्यान:

int a[10]; 
    byte * pA2 = (byte*)&a[2]; 
    byte * pA1 = (byte*)&a[1]; 
    int sz1 = &a[2] - &a[1]; 
    int sz2 = pA2 - pA1; 
    CString msg; 
    msg.Format("int * %d, byte * %d\n", sz1, sz2); 
    OutputDebugString(msg); 

उत्पादन होता है:

 int * 1, byte * 4 

दो पते लेकिन चर के घोषणापत्र के आधार पर पते को संग्रहीत किया जाता है, दोनों के बीच का अंतर 1 या 4 हो सकता है।

+1

यह मेरी समस्या थी, क्योंकि सवाल कोड में नहीं था, इसलिए मैंने प्रश्न को पढ़ा क्योंकि "पेंटर अंकगणितीय" के संदर्भ में दो पते के बीच क्या अंतर है। – Jens

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