दिलचस्प पोस्ट
अपना कस्टम एडैप्टर बनाने के दौरान getView () विधि कैसे काम करती है? एक सामान्य वर्ग या विधि के सदस्य से टी के प्रकार कैसे प्राप्त करें? जावा एसोसिएटिव- सरणी रेल 3 – शामिल करें के साथ चुनें? मैं उद्देश्य-सी के साथ JSON को कैसे पार्स करूं? जीसीसी के उपयोग में निष्पादन योग्य संसाधनों को एम्बेड करना तुलना करें विधि जावा HTML5 वीडियो अवधि को पुनः प्राप्त करने में समस्या जावास्क्रिप्ट घटना ई। जो? रेल 3.0 में f.error_messages डबल क्लिक के साथ विस्टा पर जार निष्पादित करना प्रवेश के बिना एकल वर्ण कैसे प्राप्त करें? बहुलाइन पाठ बॉक्स के लिए अधिकतम लंबाई निर्दिष्ट करना जावास्क्रिप्ट में किसी ऑब्जेक्ट की चाबियाँ / गुणों की कुशलता कैसे गिनेंगी? जावा शून्य संदर्भ प्रकार के लिए उपयोग करता है?

जब फ़ंक्शन के पास एक विशिष्ट आकार के सरणी पैरामीटर होता है, तो उसे एक सूचक के साथ क्यों बदल दिया जाता है?

निम्नलिखित कार्यक्रम को देखते हुए,

#include <iostream> using namespace std; void foo( char a[100] ) { cout << "foo() " << sizeof( a ) << endl; } int main() { char bar[100] = { 0 }; cout << "main() " << sizeof( bar ) << endl; foo( bar ); return 0; } 

आउटपुट

 main() 100 foo() 4 
  1. सरणी को पहली तत्व के रूप में एक सूचक के रूप में क्यों दिया गया है?
  2. क्या यह सी से विरासत है?
  3. मानक क्या कहते हैं?
  4. सी ++ की सख्त प्रकार की सुरक्षा क्यों गिरा दी गई है?

वेब के समाधान से एकत्रित समाधान "जब फ़ंक्शन के पास एक विशिष्ट आकार के सरणी पैरामीटर होता है, तो उसे एक सूचक के साथ क्यों बदल दिया जाता है?"

हाँ यह सी से विरासत में मिली है। समारोह:

 void foo ( char a[100] ); 

एक पैरामीटर समायोजित करने वाला पैरामीटर होगा, और ऐसा हो जाता है:

 void foo ( char * a ); 

यदि आप चाहते हैं कि सरणी प्रकार संरक्षित है, तो आपको सरणी के संदर्भ में जाना चाहिए:

 void foo ( char (&a)[100] ); 

सी +03 8.3.5 / 3:

… एक फ़ंक्शन का प्रकार निम्नलिखित नियमों का उपयोग कर निर्धारित किया जाता है। प्रत्येक पैरामीटर का प्रकार अपने स्वयं के डिक्लस-स्पेसिफेर-सेक और घोषणाकर्ता से निर्धारित होता है। प्रत्येक पैरामीटर के प्रकार का निर्धारण करने के बाद, "T के सरणी" या "फ़ंक्शन रिटर्निंग टी" के किसी भी पैरामीटर को क्रमशः "Return T कार्य करने के लिए" सूचक "T" या "सूचक को समायोजित किया जाता है ….

वाक्य रचना को समझाने के लिए:

Google में "दाएं बाएं" नियम की जांच करें; मुझे इसके बारे में एक विवरण मिला।

यह इस उदाहरण के लिए लगभग लागू होगा:

 void foo (char (&a)[100]); 

पहचानकर्ता 'ए' पर प्रारंभ करें

'ए' एक है

सही स्थानांतरित करें – हमें ए ) तो हम दिशा की दिशा बदलते हैं ( जैसा कि हम आगे बढ़ते हैं &

'ए' एक संदर्भ है

के बाद & हम उद्घाटन तक पहुंचते हैं ( इसलिए हम फिर से उलटा और सही दिखते हैं। अब हम देखें [100]

'ए' 100 की एक सरणी के लिए एक संदर्भ है

और जब तक हम char तक नहीं पहुंच जाते, तब तक हम दिशा char :

'ए' 100 वर्णों की एक सरणी के लिए एक संदर्भ है

हाँ। सी और सी ++ में आप कार्यों के लिए सरणियों को नहीं दे सकते। यह वैसा ही है जैसा होना चाहिए।

वैसे भी आप सादे सरणियां क्यों कर रहे हैं? क्या आपने boost / std::tr1::array / std::array या std::vector ?

ध्यान दें कि आप एक फ़ंक्शन टेम्पलेट में मनमाना की लंबाई के एक सरणी के संदर्भ में, पास कर सकते हैं। मेरे सर के ऊपर से चला गया:

 template< std::size_t N > void f(char (&arr)[N]) { std::cout << sizeof(arr) << '\n'; } 

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

 int intArray[] = {1, 3, 5, 7, 11}; // static array of 5 ints //... void f(int a[]) { // ... } // ... f(intArray); // only pointer to the first array element is passed int length = sizeof intArray/sizeof(int); // calculate intArray elements quantity (equals 5) int ptrToIntSize = sizeof(*intArray); // calculate int * size on your system