c++ - Difference between char argv[][7] and char *argv[] -


इस सवाल का पहले से ही एक उत्तर है: < / P>

  • 10 उत्तर
  • 4 जवाब

    मैंने हाल ही में सी भाषा सीख ली है मैंने पढ़ा है कि स्ट्रिंग की एक सरणी बनाने के कुछ तरीके हैं। क्या char argv [] [7] और चार * argv [] के बीच कोई अंतर है? अगर नहीं है तो आप क्या उपयोग करना पसंद करते हैं?

    C99 मानक §6.2.5 ¶ से उद्धरण 20 (प्रकार)

    एक सरणी प्रकार किसी विशेष सदस्य ऑब्जेक्ट प्रकार के साथ ऑब्जेक्ट्स के कॉन्सीग्यूएरियल आवंटित गैर-निष्पक्ष सेट का वर्णन करता है, जिसे तत्व प्रकार कहा जाता है। सरणी प्रकार उनके तत्व प्रकार और सरणी में तत्वों की संख्या के आधार पर होता है।

    मानक आगे §6.2.5 ¶22 में कहते हैं

    अज्ञात आकार का एक सरणी प्रकार एक अपूर्ण प्रकार है। यह एक बाद में घोषणा (आंतरिक या बाह्य संबंध के साथ) में निर्दिष्ट करके, उस प्रकार की पहचानकर्ता के लिए पूरा हो गया है।

    सरणी सबस्क्रिप्ट ऑपरेटर [] * ऑपरेटर से अधिक प्राथमिकता है इसलिए, कथन

      चार * argv [];   

    परिभाषित करता है argv सरणी आकार निर्दिष्ट नहीं है क्योंकि अज्ञात आकार के वर्णों के लिए सूचक की एक सरणी हो। सरणी argv एक अपूर्ण प्रकार है। यह मान रहा है कि उपरोक्त कथन में अभिव्यक्ति फ़ंक्शन पैरामीटर के रूप में प्रकट नहीं होती है। चूंकि सरणी argv अपूर्ण प्रकार है, आपको इसका उपयोग करने से पहले इसके आकार की जानकारी प्रदान करनी होगी। इसका मतलब है कि आपको उपरोक्त विवरण को एक घोषणा करना चाहिए और इसके परिभाषा को कहीं और देना चाहिए ताकि लिंकर इसे हल करेगा। घोषणा और परिभाषा के बीच अंतर के लिए इसे पढ़ें -

      // सरणी घोषणा // यह स्थान नहीं आवंटित करता है / / लेकिन केवल टाइप जानकारी प्रदान करता है / हालांकि एक अपूर्ण प्रकार के // argv में आंतरिक या बाहरी संबंध होना चाहिए एक्सटर्न केयर * एजीआर []; // सरणी की परिभाषा // पूरी जानकारी और इसके लिए स्मृति आवंटित करता है I // एक ही अनुवाद इकाई या // एक अलग एक में चार * argv [8];   

    आप एक सरणी प्रारंभिक सूची के साथ सरणी भी प्रारंभ कर सकते हैं और सरणी का आकार सूची से अनुमान लगाया जाएगा।

      // आकार सरणी argv निर्धारित किया जाता है // स्पष्ट रूप से 2 वर्ण * argv [] = {"हैलो", "विश्व"} होना; // उपरोक्त चार * argv के बराबर है [2]; Argv [0] = "हैलो"; Argv [1] = "विश्व";   

    ध्यान दें: उपर्युक्त केवल इसका आकार स्पष्ट रूप से निर्दिष्ट किए बिना सरणी के प्रारंभिक प्रदर्शन के लिए है। स्ट्रिंग शब्दशः केवल पढ़ने के लिए हैं, इसलिए कथन को बेहतर रूप से लिखा जाना चाहिए

      const char * argv [] = {"हैलो", "विश्व"};   

    यदि यह फ़ंक्शन पैरामीटर के रूप में प्रतीत होता है, तो यह char ** argv के समान है

      int main ( Int argc; char * argv []); // int main (int argc, char ** argv) के बराबर;   

    नीचे दिए गए बयान में सरणी के लिए भी जाता है।

      char argv [] [7];   

    उपरोक्त कथन argv को char [7] के तत्वों की एक सरणी के रूप में परिभाषित करता है, अर्थात, 7 वर्ण सरणी का आकार argv फिर से निर्दिष्ट नहीं है इसलिए, argv एक अपूर्ण प्रकार है मान लें कि यह एक फ़ंक्शन पैरामीटर के रूप में नहीं दिखाई देता है, बयान को एक घोषणा में बनाया जाना चाहिए क्योंकि यह एक अधूरा प्रकार है और इसकी परिभाषा कहीं और प्रदान की जानी चाहिए।

      // सरणी घोषणा // argv में आंतरिक या बाह्य लिंक एक्सट्रॉन वर्ण argv [] [7] होना चाहिए; // परिभाषा // एक ही अनुवाद इकाई में // या एक अलग एक चार argv [10] [7];   

    सरणी को पिछले मामले की तरह प्रारंभ किया जा सकता है और आकार प्रारंभिक सूची से निहित निर्धारित किया जाएगा।

      // सरणी argv का आकार 3 से प्रारंभिक सूची के रूप में अनुमान लगाया गया है। चार argv [] [7] = {{'ए', 'बी', 'सी', 'डी', 'ई', 'एफ', 'जी'} , 'ए', 'बी', 'सी', 'डी', 'ई', 'एफ', 'जी', '' ए ',' बी ',' सी ',' डी ',' ई ',' एफ ',' जी '}};   

    हालांकि, अगर सरणी अभिव्यक्ति फ़ंक्शन पैरामीटर के रूप में प्रकट होती है, तो यह * [7] के बराबर है, यानी, एक सूचक 7 वर्णों की एक सरणी के लिए।

      void foo (char argv [] [7]); // void foo के बराबर (char (*) [7])   

    ऐसा इसलिए है क्योंकि आप किसी फ़ंक्शन के लिए एक सरणी नहीं दे सकते। क्या वास्तव में पारित हो जाता है सरणी के पहले तत्व के लिए एक सूचक है। इसलिए, फ़ंक्शन में सरणी पैरामीटर को निहित रूप से पॉइंटर में सरणी तत्व प्रकार में कनवर्ट किया जाता है। कृपया इसे और अधिक विस्तार के लिए पढ़ें -



Comments

Popular posts from this blog

Verilog Error: output or inout port "Q" must be connected to a structural net expression -

jasper reports - How to center align barcode using jasperreports and barcode4j -

c# - ASP.NET MVC - Attaching an entity of type 'MODELNAME' failed because another entity of the same type already has the same primary key value -