অ্যারে পয়েন্টারের সাথে অনেক মিলে যেছে, কিন্তু sizeof অপারেটর তাদের আলাদা করে। অ্যারে পয়েন্টারে কনভার্ট হলে (ফাংশন আর্গুমেন্টে পাস করলে বা পয়েন্টার ভেরিয়েবলে অ্যাসাইন করলে) sizeof অ্যারের আকার না দিয়ে পয়েন্টারের আকার দেয়। এটিকে Array Decay বলা হয়।
উদাহরণ
#include <iostream>
int main() {
const int a[] = {2, 3, 5, 7, 11};
const int* p = a; // Array decays to pointer
std::cout << (sizeof(p) != sizeof(a)) << std::endl; // 1 (true)
}
আউটপুট
1
sizeof(a) = ২০ বাইট (৫ × ৪), sizeof(p) = ৮ বাইট (৬৪-বিট সিস্টেমে পয়েন্টার সাইজ)।
কেন গুরুত্বপূর্ণ?
- ফাংশনে অ্যারে পাস করলে সাইজ তথ্য হারায়।
- র্যাঞ্জ-ভিত্তিক for (
for(auto x : arr)) কাজ করে না (পয়েন্টার হয়ে যাওয়ার কারণে)।
সমাধান
std::array<T, N>(C++11) - ফিক্সড সাইজ, decay না করেstd::vector<T>- ডাইনামিক সাইজstd::span<T>(C++20) - নন-ওয়ানিং ভিউ- সাইজ আলাদা প্যারামিটার হিসেবে পাস করা