2012-08-08 21 views
5

कृपया विस्तार से बताएं मैं एक कार्यक्रम के बारे में 2-डी सरणियोंअंतर

आधार पता 8678

#include<stdio.h> 
#include<conio.h> 
main() 
{ 
int arr[3][3]={ 
       {83,8,43}, 
       {73,45,6}, 
       {34,67,9} 
       }; 
printf("%d ",&arr+1); //points to 8696 
printf("%d ",arr+1); //points to 8684 
return 0; 
} 

क्या arr+1 और &arr+1 के बीच का अंतर है है?

उत्तर

9

ठीक है, वे अलग-अलग चीजें हैं। arr आपके सरणी के पहले तत्व को पॉइंटर के अधिकांश संदर्भों में क्षय - इसका मतलब है कि आपके 2 डी सरणी में पहली 3-तत्व पंक्ति में पॉइंटर: int (*)[3] टाइप करें। arr + 1, फिर, सरणी में दूसरी पंक्ति को इंगित करता है।

&arr सरणी का पता है (int (*)[3][3] टाइप करें), इसलिए &arr + 1 आपके 2 डी सरणी की पूरी तरह से अंत में स्मृति के लिए अंक को इंगित करता है।

आप अलग-अलग प्रिंट करके आसानी से इस व्यवहार की पुष्टि कर सकते हैं। विशेष रूप से, मूल्यों की बजाय नए पॉइंटर्स को ऑफ़सेट प्रिंट करना स्वयं चीजों को स्पष्ट करने में मदद करेगा। इन प्रिंट बयानों से अपने कार्यक्रम से उत्पादन:

printf("%ld\n",(intptr_t)(&arr+1) - (intptr_t)arr); 
printf("%ld\n",(intptr_t)(arr+1) - (intptr_t)arr); 

क्रमशः &arr+1 और arr+1 को दशमलव ऑफसेट होगा।

36 
12 

36 मैचों अप: 3 पंक्तियों × 3 कॉलम प्रविष्टि प्रति × 4 बाइट्स = 36 बाइट्स यहाँ एक परीक्षण रन से उत्पादन मैं बस हो गया है। तो 12: 1 पंक्ति × 3 कॉलम × 4 बाइट प्रति प्रवेश = 12 बाइट्स करता है।

नोट - आप %d का उपयोग कर पॉइंटर्स प्रिंटिंग भी कर रहे हैं, जो गलत है। इसके लिए आपको शायद %p का उपयोग करना चाहिए।

+2

के अगले सरणी के पता देता है मैं अपने जवाब से बहुत कुछ सीखा देता है। धन्यवाद। –

+0

'% p' के साथ, आपको पॉइंटर्स को 'शून्य *' पर डालना होगा। –

1

आप इस तुल्यता की मदद से इस समझ सकते हैं: एक्स [Y] === * (X + Y)

के बाद से * (आगमन +1) === आगमन [1], आगमन + 1 === & आगमन [1]

इसी तरह, & आगमन +1 === & ((& आगमन) [1])

क्या (& आगमन) है [1]? खैर, (& आगमन) [0] === * & आगमन === आगमन, कि है, 3x3 सरणी में ही है, तो (& आगमन) [1] 3x3 सरणी पीछा कर रहा है कि, और & आगमन + 1 === & ((& एआर) [1]) & एआर के बाद 3x3 सरणी का पता है ... बाइट के लिए एक पॉइंटर बस पूरे सरणी के पीछे है।

-1

सरणी + 1 का मतलब सरणी [1] का पता है और इसकी लागत 3 int स्मृति है।

& सरणी + 1 का मतलब सरणी का पता [0] 1 जोड़ें;

+0

गलत। इसे आज़माएं और आप देखेंगे। या यहां तक ​​कि ओपी के आउटपुट को देखो, मुझे लगता है। –

+0

पूल अंग्रेजी आपको गलत समझती है। सरणी एक सूचक है जो सरणी के पते को इंगित करता है, और (सरणी + 1) एक सूचक है जो सरणी के पते को इंगित करता है [1]। और सरणी सरणी का पता है और फिर 1. – hupantingxue

+0

कार्ल नोरम जोड़ें, आप मुझे गलत समझते हैं। – hupantingxue

0

आगमन + 1 एक सरणी में अगले तत्व जबकि & आगमन +1 पूर्णांकों