2010-09-03 12 views
9

नीचे 2 कार्यक्रमोंक्यों अलग जवाब?

सबसे पहले हैं

#include<stdio.h> 

void main() 
{ 
    int a[5]={1,2,3,4,5}; 
    int *p; 
    p=&a; 
    printf("%u %u",p,p+1); 
} 

दूसरा

#include<stdio.h> 

void main() 
{ 
    int a[5]={1,2,3,4,5}; 
    printf("%u %u",&a,&a+1); 
} 

अब, दो programs..I में पहली में & एक का उपयोग कर पी के मूल्यों मुद्रित है कोड और सीधे दूसरे में ..

परिणाम अलग क्यों हैं?

जो उत्तर मैं प्राप्त कर रहा हूं।

for first 3219048884 3219048888 
for second 3219048884 3219048904 
+1

आप संपादक में कोड बटन के साथ कोड के अपने लाइनों को फ़ॉर्मेट कृपया सकते हैं देख सकते हैं? लोगों के लिए मदद करने के लिए यह बहुत आसान बनाता है। – jlafay

+2

आपको क्या परिणाम मिल रहे हैं? –

+2

और आप क्या परिणाम देख रहे हैं? –

उत्तर

14

&a का प्रकार int (*) [5] है। इसलिए &a+1 एक सूचक है जो a से अधिक 5 int है। हालांकि p का प्रकार int * है, इसलिए p+1 एक सूचक है जोp से आगे है।

+0

स्नीकी! मैं मंजूरी देता हूँ। –

+0

हां, लेकिन यह सीरी – kriss

+1

@kriss के अंतिम मूल्य को छोड़कर प्रश्न के साथ अप्रासंगिक है: यह अप्रासंगिक कैसे है? यह प्रत्येक अनुक्रम में अंतिम मूल्य है जो भिन्न है, और यही कारण है कि। –

-2

आप p = a और नहीं p = &a उपयोग करना चाहिए। a जैसे एक सरणी को पहले से ही एक स्थिर सूचक माना जाता है। आपको & ऑपरेटर के साथ इसे अव्यवस्थित करने की आवश्यकता नहीं है।

+0

'a' एक सूचक नहीं है। कभी नहीं। – GManNickG

+0

@GMan फिर आप 'a [0] = 2' के समान अर्थ के साथ' * a = 2' क्यों कह सकते हैं? – Frank

+0

क्योंकि सरणी के सूचक के लिए एक निहित रूपांतरण है। लेकिन सरणी पॉइंटर्स नहीं हैं। – GManNickG

2

दोनों कार्यक्रमों में, आप सरणी के मेमोरी पते प्रिंट कर रहे हैं।

प्रत्येक बार जब आप प्रोग्राम चलाते हैं तो यह भिन्न हो सकता है। ओएस जो आपको चुनने का विकल्प चुनती है वह अलग हो सकती है।

जब आपका प्रोग्राम 5 पूर्णांक की सरणी घोषित करता है, तो ओएस आपको लगातार 5 पूर्णांक देने का वादा करता है, यह वादा नहीं करता कि आपको कौन सी मेमोरी मिलेगी, या आपको हर बार एक ही स्मृति मिल जाएगी।

7

जब मैं उस चलाने के लिए, मैं इस मिल: फर्क सिर्फ इतना अंतिम स्थिति में किया जा रहा है, p+1 बनाम &a+1

p साथ

1245036 1245040 1245036 1245040 
1245036 1245040 1245036 1245056 

तो p+1 पता है, एक पूर्णांक के लिए सूचक है अगले पूर्णांक का। (यानी 4 बाइट आगे memeory में)

a 5 पूर्णांक की एक सरणी है, इसलिए & ए + 1 5 पूर्णांक की अगली सरणी का पता है। (यानी, 20 बाइट्स मेमरी में आगे)

1

आपका पहला प्रोग्राम अमान्य है। p = &a असाइन करना अवैध है, क्योंकि p में int * और &a टाइप int (*)[5] है। ये प्रकार संगत नहीं हैं। यदि आपका कंपाइलर इस प्रकार के असाइनमेंट को अनुमति देने के लिए पर्याप्त ढीला है (क्या यह कम से कम आपको चेतावनी देता है?), तो शायद इसे p = (int *) &a के रूप में व्याख्या किया गया है, यानी यह &a के मान को int * पॉइंटर के रूप में मजबूती से दोहराता है। इस प्रकार, आपके पहले प्रोग्राम में सभी पॉइंटर अंकगणित int * अंकगणित है। यही कारण है कि पहला कार्यक्रम a+1 और p+1 मानों के लिए एक ही आउटपुट उत्पन्न करता है।

दूसरे कार्यक्रम में &a का मान पुन: व्याख्या नहीं किया गया है। यह अपना मूल प्रकार `int () [5] and it follows the rules of normal pointer arithmetic for type int () [5] , meaning that when you do & ए + 1 , the pointer is moved आकार (int [5]) 'बाइट्स, जैसा कि करना चाहिए। यही कारण है कि परिणाम पहले कार्यक्रम से अलग है।

2

आपके पास अलग-अलग स्टैक फ्रेम के साथ दो प्रोग्राम हैं, कोई आश्चर्य नहीं कि स्थानीय चर के पते अलग हैं। प्रत्येक बार जब आप प्रोग्राम चलाते हैं तो Il बदल सकता है (यह तब होता है जब मैं इसे कोशिश करता हूं, लिनक्स पर जीसीसी के साथ संकलित कोड)।

लेकिन आपको सेरी के अंतिम मूल्य को छोड़कर नीचे दिए गए प्रोग्राम के साथ समान मूल्य प्राप्त होंगे (अंतिम अंक को छोड़कर, पॉइंटर अंकगणितीय कार्यों के कारण)।

#include<stdio.h> 

void main() 
{ 
    int a[5]={1,2,3,4,5}; 
    int *p; 
    p=&a; 
    printf("%u %u %u %u ",a,a+1,p,p+1); 
    printf("%u %u %u %u",a,a+1,&a,&a+1); 
} 

एक (काफी) संकेत और सरणियों के बीच अंतर की पूर्ण विवरण के लिए आप मेरा उत्तर here

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