2013-02-18 8 views
5

के रूप में ऐरे मैं सोच रहा था कि जब मैं पैरामीटर के रूप में सरणी पास करता हूं तो इनमें से कौन सा सबसे अच्छा होता है?पैरामीटर

void function(int arr[]) {...}; 

या

void function(int* arr) {...}; 

तुम मुझे अपना कारण बता सकते हैं? और आप किस पुस्तक का उल्लेख कर सकते हैं? धन्यवाद!

+0

जब आप कार्य करने के लिए एक सरणी पास करते हैं तो यह सरणी के पहले तत्व को पॉइंटर के रूप में क्षय करता है। तो दोनों समान हैं। इनमें से –

+0

इनमें से? 'शून्य कार्य (std :: स्ट्रिंग कॉन्स और स्ट्र) {...}; 'सबसे अच्छा है। – Johnsyweb

+0

अनुशंसित पढ़ने: http://stackoverflow.com/a/4810672/78845 – Johnsyweb

उत्तर

4

इस सवाल का टैग है के बाद से , मैं न प्रयोग करेंगे। यदि आप का उपयोग करना चाहते हैं, तो दोनों समकक्ष हैं।

लेकिन जब से तुम सी ++ का उपयोग करें, एक बेहतर दृष्टिकोण इस तरह के कार्यों

void function(std::vector<int> &arr) {...} 

या, यदि आप सरणी/वेक्टर

void function(const std::vector<int> &arr) {...} 
1

वे अर्थात् समान हैं।

# 1 थोड़ा बेहतर है (मेरी राय में) क्योंकि यह स्पष्ट करता है कि आप एक सरणी पारित कर रहे हैं।

+3

वे _syntactically_ अलग हैं। वे _semantically_ समकक्ष हैं। –

+0

और मुझे कबूल करना होगा, मैं # 2 पसंद करता हूं, लेकिन इसलिए नहीं क्योंकि यह स्पष्ट करता है कि आप एक सरणी पारित कर रहे हैं; मैं इसे पसंद करता हूं क्योंकि यह स्पष्ट करता है कि आप ** पता ** = पी पास कर रहे हैं – WhozCraig

0

एक पैरामीटर के रूप एक सरणी पारित करने के लिए सबसे अच्छा तरीका है वास्तव में है:

void function(type_t* array, int amountOfElts, int arrayAllocatedElts);

कुछ मामलों के लिए (जैसे जब तार गुजर) आप अक्सर इन दो मापदंडों को छोड़ सकते हैं। लेकिन वे किसी भी तरह से उपयोगी हो सकते हैं, उदाहरण के लिए जब स्ट्रिंग पर कुछ ऑपरेशन करते हैं, या वे आपको एक स्ट्रेल कॉल या दो बचा सकते हैं।

फ़ंक्शन तर्कों में [] विकल्प का उपयोग करना मेरी राय में उलझन में है और इससे बचा जाना चाहिए। लेकिन मुझे नहीं लगता कि यह एक सम्मेलन है।

3

यदि आप किसी भी सरणी (गतिशील रूप से आवंटित समेत) पास करना चाहते हैं, तो वे बराबर हैं।

अपने कार्य एक वास्तविक निश्चित-आकार सरणी की आवश्यकता है, आप ऐसा कर सकता है:

template <size_t N> 
void function(char (&str)[N]) { ... } 
1

को संशोधित नहीं आप पूछ के लिए एक std::vector उपयोग करने के लिए है जो

void function(int arr[]) {...}; 

और

का चयन करने के लिए
void function(int* arr) {...}; 

उत्तरार्द्ध आपको पॉइंटर को const के रूप में घोषित करने की अनुमति देता है, जबकि पूर्व केवल आपको आइटम को const के रूप में घोषित करने की अनुमति देता है। हालांकि, पाठक [] पर एक सरणी को इंगित करता है जो संभावित रूप से एक ऑब्जेक्ट के पॉइंटर के विपरीत होता है। व्यक्तिगत रूप से मुझे लगता है कि const द्वारा प्रदान की गई बाधा [] द्वारा प्रदान की गई सरणी के संकेत से अधिक व्यावहारिक रूप से उपयोगी है।

उच्च स्तरीय कोड के लिए, std::vector या std::array का उपयोग करें, जो भी अधिक उपयुक्त हो।

0

अमूर्त उपलब्ध कराना चाहते हैं की परत के आधार पर आप ओलाफ का दृष्टिकोण या कुछ एसटीएल महान स्तर तक का उपयोग करता है के बीच चुना जाना चाहिए:

template <class Iter> 
void function(Iter first, Iter last) 
{ 
    // for example, to get size: 
    std::size_t size = std::distance(first, last); 
    // for example, to iterate: 
    for (Iter it = first; it != last; ++it) 
    { 
     // *it to get the value, like: 
     std::cout << *it << std::endl; 
    } 
} 

इस तरह, आप सरणियों के लिए न केवल फ़ंक्शन का उपयोग कर सकते हैं, लेकिन विभिन्न एसटीएल प्रकारों के लिए: वैक्टर, सूचियां, कतार, ढेर और इतने सारे।

int tab[4] = {1,2,3,4}; 
function(tab, tab+4); 

std::vector<int> vec; 
// fill vector with something 
function(vec.begin(), vec.end());