अगर मुझे अनुमान लगाना होता, तो मैं कहता कि आप एक जावा बैकग्राउंड से हैं। यह सी ++ है, और चीजें तब तक मूल्य से पारित हो जाती हैं जब तक कि आप अन्यथा निर्दिष्ट न करें &
-परेटर का उपयोग करें (ध्यान दें कि इस ऑपरेटर को 'एड्रेस-ऑफ' ऑपरेटर के रूप में भी उपयोग किया जाता है, लेकिन एक अलग संदर्भ में)। यह सब अच्छी तरह से प्रलेखित है, लेकिन मैं फिर से पुन: पुनरावृति करूंगा:
void foo(vector<int> bar); // by value
void foo(vector<int> &bar); // by reference (non-const, so modifiable inside foo)
void foo(vector<int> const &bar); // by const-reference
आप एक सदिश ( void foo(vector<int> *bar)
) को पॉइंटर पास करने का विकल्प भी चुन सकते हैं , लेकिन जब तक आप यह नहीं जानते कि आप क्या कर रहे हैं और आपको लगता है कि यह वास्तव में जाने का तरीका है, ऐसा न करें।
इसके अलावा, वैक्टर सरणियों के समान नहीं हैं ! आंतरिक रूप से, वेक्टर एक सरणी का ट्रैक रखता है जिसमें से यह आपके लिए मेमोरी प्रबंधन को संभालता है, लेकिन कई अन्य एसटीएल कंटेनर करते हैं। आप एक वेक्टर को एक सूचक या सरणी या इसके विपरीत की अपेक्षा वाले फ़ंक्शन को पास नहीं कर सकते हैं (आप अंतर्निहित सरणी तक (पॉइंटर तक पहुंच प्राप्त कर सकते हैं) और इसका उपयोग कर सकते हैं)। वेक्टर्स अपने सदस्य-फ़ंक्शंस के माध्यम से बहुत अधिक कार्यक्षमता प्रदान करते हैं, जबकि पॉइंटर्स और एरेज़ बिल्ट-इन प्रकार के होते हैं। इसके अलावा, वैक्टर गतिशील रूप से आवंटित किए जाते हैं (जिसका अर्थ है कि आकार निर्धारित किया जा सकता है और रनटाइम में बदला जा सकता है) जबकि सी-स्टाइल सरणियों को सांख्यिकीय रूप से आवंटित किया गया है (इसका आकार स्थिर है और संकलन-समय पर ज्ञात होना चाहिए), उनके उपयोग को सीमित करना।
मेरा सुझाव है कि आप सामान्य रूप से C ++ के बारे में कुछ और पढ़ें (विशेष रूप से सरणी क्षय ), और फिर निम्नलिखित कार्यक्रम पर एक नज़र डालें जो सरणियों और बिंदुओं के बीच के अंतर को दिखाता है:
void foo1(int *arr) { cout << sizeof(arr) << '\n'; }
void foo2(int arr[]) { cout << sizeof(arr) << '\n'; }
void foo3(int arr[10]) { cout << sizeof(arr) << '\n'; }
void foo4(int (&arr)[10]) { cout << sizeof(arr) << '\n'; }
int main()
{
int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
foo1(arr);
foo2(arr);
foo3(arr);
foo4(arr);
}