2010-03-17 16 views

उत्तर

9

आप नहीं कर सकते। एक सूचक केवल एक स्मृति स्थान है, और इसमें कुछ खास नहीं है जो आकार निर्धारित कर सकता है।

के बाद से इस सी ++ है, क्या आप ऐसा कर सकते हैं की तरह संदर्भ द्वारा सरणी पार जाते हैं:

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 
} 

और बस आकार के लिए समय-समय पर इन उपयोगिता कार्यों।

+0

'सरणी प्रकार बनाने के लिए' टाइप किए गए 'टाइप का उपयोग करना बेहतर है, और' टेम्पलेट 'को खत्म करने के लिए इसका संदर्भ स्वीकार करना, जब तक कि ये विधियां हेडर फ़ाइल में न हों और सरणी आकार वास्तव में भिन्न हो (अभी तक शेष संकलन-समय निर्धारक)। – Potatoswatter

+0

@Potatoswatter: मुझे इस तरह टाइप टाइप करने का तरीका पता नहीं है। एन को फ़ंक्शन में तब तक ज्ञात नहीं है जब तक यह कॉल के साथ तत्काल नहीं हो जाता है। मैं टाइपिफ़ का एक उदाहरण जोड़ूंगा, क्या आपका मतलब था? – GManNickG

+0

हाँ, आपके द्वारा जोड़े गए टाइप टाइपिफ़ का उदाहरण मेरा मतलब है। 'टेम्पलेट 'ऑटो आकार के' int ary [] = {...} के साथ अच्छा है; 'लेकिन तत्कालता असुविधाजनक/उलझन में हो सकती है और लाभ थोड़ा AFAIK है जब तक कि सरणी को इस तरह घोषित नहीं किया जाता है। या उपयोगकर्ता कई निश्चित आकारों के साथ काम करता है। – Potatoswatter

15

आप इसे नहीं कर सकते हैं। आपको सरणी लंबाई के साथ सरणी लंबाई को पारित करने की आवश्यकता है, या आपको std::vector जैसे कंटेनर ऑब्जेक्ट का उपयोग करने की आवश्यकता है। ,

int a[10]; 
int *start = a; 
int *end = a + 10; 
size_t n = end - start; /* pointers! :-) */ 
+0

और जल्द ही std :: array :) – coelhudo

+2

इस बिंदु पर मैं सी ++ 4x को अंतिम रूप देने के समय सामाजिक सुरक्षा एकत्र करने की उम्मीद करता हूं। –

+0

मुझे नहीं लगता कि बड़ा सौदा क्या है: आप अभी बूस्ट :: सरणी का उपयोग कर सकते हैं। –

3

आप की तरह कुछ मतलब है। चार सरणी के मामले में, यह एक '\ 0' है, इसलिए जब तक आप लंबाई को समझने के लिए उस चरित्र को पढ़ नहीं लेते तब तक आप लूप कर सकते हैं।

+2

नहीं, एक "अंत" सूचक पारंपरिक रूप से एक-अतीत-अंत-अंत है (जो कानूनी है) विशेष रूप से अंत - प्रारंभ = लंबाई, और ताकि आप 'int (i * i = start; i! = end; ++ i) जैसी चीजें कर सकें। –

+0

@ टाइलर: धन्यवाद। –

0

आप नहीं कर सकते जब तक कि आप क्या अंत सूचक dereferences पता:

+1

* स्ट्रिंग्स * के मामले में यह पारंपरिक रूप से '0' है। प्रत्येक चार सरणी एक स्ट्रिंग नहीं है। – Potatoswatter

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