যদি আমার অনুমান করতে হয় তবে আমি বলতে পারি যে আপনি জাভা ব্যাকগ্রাউন্ড থেকে এসেছেন। এটি সি ++, এবং জিনিসগুলি মান দ্বারা পাস করা হয় যদি না আপনি অন্যটি-ব্যবহারকারী ব্যবহার করে নির্দিষ্ট না করে &
থাকেন (দ্রষ্টব্য যে এই অপারেটরটি 'অ্যাড্রেস-অফ' অপারেটর হিসাবেও ব্যবহৃত হবে, তবে ভিন্ন প্রসঙ্গে)। এটি সমস্ত ভাল নথিবদ্ধ, তবে আমি যাইহোক যাইহোক পুনরায় পুনরাবৃত্তি করব:
void foo(vector<int> bar);
void foo(vector<int> &bar);
void foo(vector<int> const &bar);
আপনি কোনও ভেক্টর ( void foo(vector<int> *bar)
) এর কাছে কোনও পয়েন্টারও পাস করতে বেছে নিতে পারেন , তবে আপনি কী করছেন তা যদি না জানেন এবং আপনি যদি মনে করেন না যে এটি সত্যিই যাবার উপায়, তবে এটি করবেন না।
এছাড়াও, ভেক্টরগুলি অ্যারের মতো নয় ! অভ্যন্তরীণভাবে, ভেক্টর এমন একটি অ্যারে ট্র্যাক করে যা এটি আপনার জন্য মেমরি পরিচালনা পরিচালনা করে, তবে অন্য অনেকগুলি এসটিএল পাত্রে এটি করে। আপনি পয়েন্টার বা অ্যারে বা তদ্বিপরীত (আপনি অন্তর্নিহিত অ্যারে অ্যাক্সেস পেতে (যদিও এটি ব্যবহার করতে পারেন) প্রত্যাশা করে কোনও ফাংশনে ভেক্টরকে পাস করতে পারবেন না। ভেক্টরগুলি এর সদস্য-ফাংশনগুলির মাধ্যমে প্রচুর কার্যকারিতা সরবরাহ করে এমন ক্লাস হয় যেখানে পয়েন্টার এবং অ্যারেগুলি অন্তর্নির্মিত ধরণের হয়। এছাড়াও, ভেক্টরগুলি গতিশীলভাবে বরাদ্দ করা হয় (যার অর্থ রানটাইমের সময় আকারটি নির্ধারণ করা ও পরিবর্তিত হতে পারে) যেখানে সি-স্টাইল অ্যারেগুলি স্থিরভাবে বরাদ্দ করা হয় (এর আকারটি স্থির থাকে এবং সংকলন-সময় এটি অবশ্যই জানা থাকতে পারে), তাদের ব্যবহার সীমাবদ্ধ করে।
আমি আপনাকে সাধারণভাবে সি ++ সম্পর্কে আরও কিছু পড়ার পরামর্শ দিচ্ছি (বিশেষত অ্যারে ক্ষয় ), এবং তারপরে নীচের প্রোগ্রামটি দেখুন যা অ্যারে এবং পয়েন্টারগুলির মধ্যে পার্থক্যটি চিত্রিত করে:
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);
}