2013-08-21 4 views
5

नीचे दिए गए कार्यक्रम के लिए, पहले printfargv और &argv के लिए अलग-अलग मान क्यों प्रिंट करते हैं? दूसरा printfa और &a के लिए समान मान प्रिंट करता है। तंत्र क्या है जिसके द्वारा प्रोग्राम में तर्क चर पारित किया जाता है?स्ट्रिंग के तर्क और सामान्य सरणी के बीच विभिन्न आउटपुट

#include<stdio.h> 
    int main(int argc, char * argv[]){ 
    char * a[10]; 
    printf("%d %d\n\n",argv,&argv); 
    printf("%d %d",a,&a); 
    return 0; 
} 

क्या तार

+1

printf ("% d% d", a, &a); यहां और ए और एक ही पते पर इंगित करेगा ... इसलिए आपको उन्हें प्रिंट करने की आवश्यकता नहीं है और पता मुद्रित करने के लिए% d के बजाय% p का उपयोग करें। – sunny1304

+0

मुझे लगता है कि क्योंकि argv सूचक प्रारंभ किया गया है लेकिन आपका पॉइंटर नहीं है इसलिए यह वही एड्रेस – Saxtheowl

उत्तर

5

समस्या की एक सरणी के लिए आदेश पंक्ति तर्क भंडारण की व्यवस्था नहीं है के बारे में argv विशेष है, लेकिन समारोह तर्क गुजर के बारे में नहीं है। मेरी मशीन में

#include<stdio.h> 

void foo(int a[]) 
{ 
    int b[10]; 
    printf("foo :%p %p\n",a,&a); 
    printf("foo :%p %p\n",b,&b); 
} 

int main(int argc, char* argv[]) 
{ 
    int a[10]; 
    printf("main:%p %p\n", a, &a); 
    foo(a); 
    return 0; 
} 

उत्पादन: इस कार्यक्रम का प्रयास करें

main:0x7fffb4ded680 0x7fffb4ded680 
foo :0x7fffb4ded680 0x7fffb4ded628 
foo :0x7fffb4ded630 0x7fffb4ded630 

पहली और तीसरी लाइन आश्चर्य की बात नहीं है, क्योंकि एक सरणी arr, के लिए arr और &arr एक ही मूल्य है। दूसरी पंक्ति को समझाया जाना चाहिए।

आप देख सकते हैं, जब a समारोह foo में पारित हो जाता है, a का मान परिवर्तित करना नहीं है, लेकिन पता &a बदल गया है के बाद से सी कार्यों हमेशा मूल्य द्वारा तर्क पारित, वहाँ तर्क की एक स्थानीय प्रति हो जाएगा समारोह के अंदर।

यह argv के साथ समान है क्योंकि यह main फ़ंक्शन में केवल एक तर्क है।


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

+0

अच्छा उदाहरण कोड मिला है! मुझे लगता है कि आपके जवाब देखने से पहले मुख्य में 'argv' में कुछ विशेष स्थान है! –

+0

यह वास्तव में उत्तर नहीं है। सरणी प्रकार के किसी भी चर 'ए' के ​​लिए, '& a' और' a' पॉइंटर्स के रूप में * हमेशा * एक ही पता होगा। यह परिणाम है कि सी में सरणी प्रकार कैसे काम करते हैं। अंतर यह है कि 'argv' सरणी प्रकार का नहीं है। – newacct

+0

@newacct फिर 'argv' एक सूचक क्यों है? वास्तव में क्योंकि यह फ़ंक्शन तर्क के रूप में पारित होता है, और एक पॉइंटर में "क्षीण" होता है। –

4

अपने उदाहरण में argv और a के बीच का अंतर पैरा 6.7.6.3 विज्ञापन 7 सी मानक के से इस प्रकार है:

के रूप में '' प्रकार की सरणी 'एक पैरामीटर का एक घोषणा' समायोजित किया जाएगा टाइप करने के लिए योग्य पॉइंटर '', जहां टाइप क्वालीफायर (यदि कोई है) वे सरणी प्रकार व्युत्पन्न के [और] के भीतर निर्दिष्ट हैं। यदि कीवर्ड स्थिर भी सरणी प्रकार व्युत्पन्न के [और] के भीतर प्रकट होता है, तो प्रत्येक कॉल के लिए फ़ंक्शन पर, संबंधित वास्तविक तर्क का मान किसी सरणी के पहले तत्व तक पहुंच प्रदान करेगा, जिसमें कम से कम कई तत्व निर्दिष्ट किए गए हैं आकार अभिव्यक्ति द्वारा। जबकि a एक सरणी और सरणी, जो सरणी के पते के रूप में ही है के पहले तत्व का पता करने के लिए a अंक है

एक परिणाम argv के रूप में, एक सूचक जो अपनी ही पता है।

+0

+1 यह वास्तविक उत्तर है – newacct

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