समस्या की एक सरणी के लिए आदेश पंक्ति तर्क भंडारण की व्यवस्था नहीं है के बारे में 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
विशेष नहीं है, यह फ़ंक्शन तर्क के रूप में पारित अन्य सरणी से अलग नहीं है, यह मेरे उदाहरण कोड का पूरा बिंदु है।
स्रोत
2013-08-21 07:37:50
printf ("% d% d", a, &a); यहां और ए और एक ही पते पर इंगित करेगा ... इसलिए आपको उन्हें प्रिंट करने की आवश्यकता नहीं है और पता मुद्रित करने के लिए% d के बजाय% p का उपयोग करें। – sunny1304
मुझे लगता है कि क्योंकि argv सूचक प्रारंभ किया गया है लेकिन आपका पॉइंटर नहीं है इसलिए यह वही एड्रेस – Saxtheowl