सी ++ में केवल पॉइंटर्स के साथ सरणी लंबाई कैसे प्राप्त करें? मुझे पता है कि टैब नाम पहले तत्व के लिए सूचक है, लेकिन अगला क्या है?पॉइंटर्स के साथ ऐरे लम्बाई
उत्तर
आप नहीं कर सकते। एक सूचक केवल एक स्मृति स्थान है, और इसमें कुछ खास नहीं है जो आकार निर्धारित कर सकता है।
के बाद से इस सी ++ है, क्या आप ऐसा कर सकते हैं की तरह संदर्भ द्वारा सरणी पार जाते हैं:
template <typename T, size_t N>
void handle_array(T (&pX)[N])
{
// the size is N
pX[0] = /* blah */;
// ...
pX[N - 1] = /* blah */;
}
// for a specific type:
template <size_t N>
void handle_array(int (const &pX)[N]) // const this time, for fun
{
// the size is N
int i = pX[0]; // etc
}
लेकिन अन्यथा आप & अंत शुरू, गुजरती हैं और एक घटाव करने के लिए आलोक पता चलता है की तरह, एक शुरुआत की जरूरत है & आकार, जैसा कि आप सुझाव देते हैं, या एक स्थिर सरणी को डुबोते हैं और एक वेक्टर का उपयोग करते हैं, जैसे कि टायलर सुझाव देता है।
आप सरणी आप के साथ काम करेंगे के आकार का पता है, तो आप कर सकते हैं एक typedef
:
template <typename T, size_t N>
size_t countof(T (&pX)[N])
{
return N;
}
template <typename T, size_t N>
T* endof(T (&pX)[N])
{
return &pX[0] + N;
}
// use
int someArray[] = {1, 2, 6, 2, 8, 1, 3, 3, 7};
size_t count = countof(someArray); // 9
std::for_each(someArray, endof(someArray), /* ... */);
मैं का उपयोग करें:
typedef int int_array[10];
void handle_ten_ints(int_array& pX)
{
// size must be 10
}
और बस आकार के लिए समय-समय पर इन उपयोगिता कार्यों।
आप इसे नहीं कर सकते हैं। आपको सरणी लंबाई के साथ सरणी लंबाई को पारित करने की आवश्यकता है, या आपको std::vector
जैसे कंटेनर ऑब्जेक्ट का उपयोग करने की आवश्यकता है। ,
int a[10];
int *start = a;
int *end = a + 10;
size_t n = end - start; /* pointers! :-) */
और जल्द ही std :: array :) – coelhudo
इस बिंदु पर मैं सी ++ 4x को अंतिम रूप देने के समय सामाजिक सुरक्षा एकत्र करने की उम्मीद करता हूं। –
मुझे नहीं लगता कि बड़ा सौदा क्या है: आप अभी बूस्ट :: सरणी का उपयोग कर सकते हैं। –
आप की तरह कुछ मतलब है। चार सरणी के मामले में, यह एक '\ 0' है, इसलिए जब तक आप लंबाई को समझने के लिए उस चरित्र को पढ़ नहीं लेते तब तक आप लूप कर सकते हैं।
नहीं, एक "अंत" सूचक पारंपरिक रूप से एक-अतीत-अंत-अंत है (जो कानूनी है) विशेष रूप से अंत - प्रारंभ = लंबाई, और ताकि आप 'int (i * i = start; i! = end; ++ i) जैसी चीजें कर सकें। –
@ टाइलर: धन्यवाद। –
आप नहीं कर सकते जब तक कि आप क्या अंत सूचक dereferences पता:
* स्ट्रिंग्स * के मामले में यह पारंपरिक रूप से '0' है। प्रत्येक चार सरणी एक स्ट्रिंग नहीं है। – Potatoswatter
- 1. ऐरे (रिकॉर्ड करने के लिए पॉइंटर्स)
- 2. सी ++ पॉइंटर्स का ऐरे: हटाएं या हटाएं []?
- 3. सी ++: विभिन्न कार्यों के लिए सदस्य फ़ंक्शन पॉइंटर्स का ऐरे
- 4. PHP के साथ ईमेल ओपन लम्बाई ट्रैकिंग
- 5. टेक्स्टवॉचर के साथ वर्णित वर्ण एचटीसी लम्बाई
- 6. सी पॉइंटर्स के साथ सहायता
- 7. सी पॉइंटर्स के साथ समस्या
- 8. पॉइंटर्स के साथ strcmp सी
- 9. वजन के साथ बेवकूफ ऐरे
- 10. फिक्स्ड लम्बाई
- 11. पॉइंटर्स के साथ मानचित्र कैसे संभालें?
- 12. स्मार्ट पॉइंटर्स के साथ आभासी कन्स्ट्रक्टर मुहावरे
- 13. पॉइंटर्स के साथ const_iterator को समझना?
- 14. पावरहेल स्क्रिप्ट ऐरे तक पहुंचने के बाद विफल रहता है। लम्बाई संपत्ति
- 15. स्ट्रिंग लम्बाई
- 16. पॉइंटर्स के लिए पॉइंटर्स क्या हैं?
- 17. क्रोम के साथ जावास्क्रिप्ट ऐरे छंटनी?
- 18. नेस्टेड ऐरे के साथ PHP foreach?
- 19. पैराम्स ऐरे के साथ सेटअप विधि
- 20. HTTP के साथ एक ऐरे भेजें
- 21. स्ट्रिंग इंडेक्स के साथ पायथन ऐरे
- 22. पॉइंटर्स
- 23. पॉइंटर्स
- 24. अधिकतम टेक्स्ट देखें 3 बिंदुओं के साथ अधिकतम लम्बाई
- 25. पॉइंटर्स?
- 26. पॉइंटर्स
- 27. पॉइंटर्स
- 28. पॉइंटर्स
- 29. पॉइंटर्स
- 30. पॉइंटर्स
'सरणी प्रकार बनाने के लिए' टाइप किए गए 'टाइप का उपयोग करना बेहतर है, और' टेम्पलेट 'को खत्म करने के लिए इसका संदर्भ स्वीकार करना, जब तक कि ये विधियां हेडर फ़ाइल में न हों और सरणी आकार वास्तव में भिन्न हो (अभी तक शेष संकलन-समय निर्धारक)। – Potatoswatter
@Potatoswatter: मुझे इस तरह टाइप टाइप करने का तरीका पता नहीं है। एन को फ़ंक्शन में तब तक ज्ञात नहीं है जब तक यह कॉल के साथ तत्काल नहीं हो जाता है। मैं टाइपिफ़ का एक उदाहरण जोड़ूंगा, क्या आपका मतलब था? – GManNickG
हाँ, आपके द्वारा जोड़े गए टाइप टाइपिफ़ का उदाहरण मेरा मतलब है। 'टेम्पलेट 'ऑटो आकार के' int ary [] = {...} के साथ अच्छा है; 'लेकिन तत्कालता असुविधाजनक/उलझन में हो सकती है और लाभ थोड़ा AFAIK है जब तक कि सरणी को इस तरह घोषित नहीं किया जाता है। या उपयोगकर्ता कई निश्चित आकारों के साथ काम करता है। –
Potatoswatter