آنچه میخوانید ویراست جدید نوشتهای است که اولین بار با عنوان «آرایه ایستا و پویا در ++C»
خرداد ماه ۱۳۸۵
از طریق وبگاه برنامهنویسی و طراحی الگوریتم (عنوان و طرح پیشین وبگاه الگوریتمستان)
منتشر شده بود.
زبان ++C همانند اکثر زبانهای برنامهنویسی دیگر، ساختاری به نام آرایه دارد که امکان تعریف مجموعهای از متغیرهای همنوع (اصطلاحا مجموعه عناصر همگن) را فراهم میکند. چنین ساختاری به صورت زیر تعریف میشود:
type name[number of elements];
که در آن type یکی از انواع دادههای استاندارد ++C، ساختمان و یا کلاس است. number of elements هم تعداد اعضا یا عناصر آرایه را مشخص میکند که باید عدد ثابتی باشد. مثلا عبارت زیر یک آرایهی 10 عضوی از اعداد اعشاری به نام arr تعریف میکند:
توجه داشته باشید که شمارهی اندیس اعضای آرایه در ++C همیشه از صفر شروع میشود:
arr[0], arr[1], ..., arr[9]
این نوع تعریف، آرایههایی را ایجاد میکند که به آرایههای ایستا معروف هستند. این اسمگذاری از آنجا ناشی میشود که طول چنین آرایههایی در حین تعریف مشخص میشود و مقدار ثابتی است. لازم به ذکر است که برای تعیین طول تابع (یا همان تعداد اعضای آن) حتما باید از یک عدد و یا دادهی ثابت (const) استفاده کنید. به عبارت دیگر، در این زبان نمیتوان از یک متغیر برای تعیین طول آرایه استفاده کرد. پس عباراتی مانند دستورالعملهای زیر در زبان ++C کامپایل نشده و خطا تولید میکند:
int n;
cin >> n;
double arr[n];
چرا که n یک متغیر است و نمیتواند برای تعیین طول آرایه به کار رود. البته این مسئله در برخی کامپایلرهای جدید وجود ندارد که قبل از برنامهنویسی باید بررسی شود.
حال ببینیم این ویژگی چه مشکلاتی را ممکن است به وجود بیاورد.
فرض کنید از ما خواسته شده است برنامهای بنویسیم که تعدادی نمره (عدد اعشاری) دریافت کرده و با استفاده از هر روش دلخواهی آنها را مرتب کند. تعداد نمرهها از قبل مشخص نیست. اگر بخواهیم از یک آرایهی ایستا استفاده کنیم، باید طول ثابتی را در نظر بگیریم. پس باید یک حداکثر برای تعداد نمرهها معلوم کنیم. مثلا فرض کنیم حداکثر میتوان هزار نمره وارد کرد. پس تعریف میکنیم:
اما تعریف فوق دو ایراد دارد. اول این که اگر تعداد نمرهها بیشتر از هزار باشد، برنامه کار نمیکند؛ و دوم، اگر مثلا فقط سه نمره وارد شود، 997 عضو از عناصر آرایه بلااستفاده خواهند ماند، که حافظه اشغال کردهاند. رفع این دو ایراد راه سادهای دارد: استفاده از آرایهی پویا.
آرایهی پویا همانند آرایهی ایستا، برای تعریف عناصر همنوع به کار میرود. با این تفاوت که میتوان در زمان تعریف، از متغیرها برای تعیین طول استفاده کرد. حالت کلی تعریف آرایهی پویا با عبارت زیر مشخص میشود:
type *name;
name = new type[number of elements];
به عنوان نمونه، عبارت بالا را باید نوشت:
int n;
double *arr;
cin >> n;
arr = new double[n];
که باعث میشود یک آرایهی پویا به نام arr و به طول n ایجاد شود.
آرایههای پویا پس از تعریف، هیچ تفاوتی با آرایهی ایستای معمولی ندارند و دسترسی به عناصر آنها با اندیس صورت میگیرد. اما حتما باید به خاطر داشت باشید که حافظهی استفاده شده برای آرایهی پویا را بعد از استفاده، با دستور delete آزاد کنید:
برای آرایهی arr که در قبلا تعریف کردهایم:
همانطور که مشاهده میکنید، آرایههای پویا ارتباط نزدبکی با اشارهگرها و بحث تخصیص حافظه دارند. با این وجود، ایراداتی دارند که گاهی برنامهنویس را مجبور میکند از ساختارهای دیگر - مانند لیست پیوندی - استفاده کند.