زبان ++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 که در قبلا تعریف کردهایم:
همانطور که مشاهده میکنید، آرایههای پویا ارتباط نزدبکی با اشارهگرها و بحث تخصیص حافظه دارند. با این وجود، ایراداتی دارند که گاهی برنامهنویس را مجبور میکند از ساختارهای دیگر - مانند لیست پیوندی - استفاده کند.