2009-03-06 14 views
33

मैं पॉइंटर्स की एक सरणी बनाने की कोशिश कर रहा हूं। ये पॉइंटर्स मैंने बनाए गए छात्र ऑब्जेक्ट को इंगित करेंगे। मैं यह कैसे करुं? क्या मैं अब है:मैं पॉइंटर्स की सरणी कैसे बना सकता हूं?

Student * db = new Student[5]; 

लेकिन उस सरणी में प्रत्येक तत्व छात्र वस्तु, न छात्र वस्तु के लिए सूचक है। धन्यवाद।

उत्तर

68
Student** db = new Student*[5]; 
// To allocate it statically: 
Student* db[5]; 
+1

'छात्र * डीबी [5] 'छात्र ** डीबी = नया छात्र * [5]' जैसा ही है? एक दूसरे का उपयोग करने का क्या फायदा है? – damiancesar

+1

जब आप किसी फ़ंक्शन से सरणी वापस करना चाहते हैं तो सरणी को ढेर पर आवंटित करने की आवश्यकता होती है। यदि इसे ढेर पर आवंटित किया जाता है तो यह तुरंत नष्ट हो जाता है कि उस कार्य का दायरा समाप्त हो जाता है। –

17
#include <vector> 
std::vector <Student *> db(5); 
// in use 
db[2] = & someStudent; 

इस का लाभ यह है कि आप आवंटित भंडारण को हटाने की चिंता करने की जरूरत नहीं है - वेक्टर आप के लिए यह करता है।

+0

जबकि वेक्टर सामग्री की एक सूची रखने का सुझाया गया तरीका है, कड़ाई से बोलते हुए, यह एक सरणी नहीं है। –

+0

इसका उपयोग हर तरह से किया जा सकता है कि एक सरणी का उपयोग किया जा सकता है। अगर यह एक बतख की तरह quacks, यह एक बतख है। –

+6

वेक्टर आवंटित स्टोरेज को स्वचालित रूप से _not_ हटा नहीं देगा, यह _pointers_ के लिए संग्रहण को मुक्त करेगा, लेकिन सूचक के लिए नहीं जो पॉइंटर इंगित करता है। इसके लिए boost :: ptr_vector का उपयोग करें। –

11

संकेत की एक सरणी संकेत के सूचक के रूप में लिखा है:

Student **db = new Student*[5]; 

अब समस्या यह है, कि आप केवल पांच संकेत के लिए स्मृति सुरक्षित है। इसलिए आपको छात्र वस्तुओं को स्वयं बनाने के लिए उनके माध्यम से पुन: प्रयास करना होगा।

सी ++ में, अधिकांश उपयोग मामलों के लिए जीवन std :: वेक्टर के साथ आसान है।

std::vector<Student*> db; 

अब आप push_back() को नए पॉइंटर्स जोड़ने और [] को अनुक्रमणित करने के लिए उपयोग कर सकते हैं। ** चीज़ की तुलना में उपयोग करना क्लीनर है।

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