الگوریتمستان - آرایه ایستا و پویا در ++C

آشنایی با آرایه پویای یک بعدی و کاربردهای آن

✤    ۲۰ خرداد ۱۳۸۵ - آخرین به‌روزرسانی: ۹ خرداد ۱۳۸۸

زبان ++C همانند اکثر زبان‌های برنامه‌نویسی دیگر، ساختاری به نام آرایه دارد که امکان تعریف مجموعه‌ای از متغیرهای هم‌نوع (اصطلاحا مجموعه عناصر همگن) را فراهم می‌کند. چنین ساختاری به صورت زیر تعریف می‌شود:

  

type name[number of elements];

  

که در آن type یکی از انواع داده‌های استاندارد ++C، ساختمان و یا کلاس است. number of elements هم تعداد اعضا یا عناصر آرایه را مشخص می‌کند که باید عدد ثابتی باشد. مثلا عبارت زیر یک آرایه 10 عضوی از اعداد اعشاری به نام arr تعریف می‌کند:

  

float arr[10];

  

توجه داشته باشید که شماره اندیس اعضای آرایه در ++C همیشه از صفر شروع می‌شود:

  

arr[0], arr[1], ..., arr[9]

  

این نوع تعریف، آرایه‌هایی را ایجاد می‌کند که به آرایه‌های ایستا معروف هستند. این اسم‌گذاری از آنجا ناشی می‌شود که طول چنین آرایه‌هایی در حین تعریف مشخص می‌شود و مقدار ثابتی است. لازم به ذکر است که برای تعیین طول تابع (یا همان تعداد اعضای آن) حتما باید از یک عدد و یا داده ثابت (const) استفاده کنید. به عبارت دیگر، در این زبان نمی‌توان از یک متغیر برای تعیین طول آرایه استفاده کرد. پس عباراتی مانند دستورالعمل‌های زیر در زبان ++C کامپایل نشده و خطا تولید می‌کند:

  

int n;

cin >> n;

double arr[n];

  

چرا که n یک متغیر است و نمی‌تواند برای تعیین طول آرایه به کار رود. البته این مسئله در برخی کامپایلرهای جدید وجود ندارد که قبل از برنامه‌نویسی باید بررسی شود.

حال ببینیم این ویژگی چه مشکلاتی را ممکن است به وجود بیاورد.

فرض کنید از ما خواسته شده است برنامه‌ای بنویسیم که تعدادی نمره (عدد اعشاری) دریافت کرده و با استفاده از هر روش دلخواهی آنها را مرتب کند. تعداد نمره‌ها از قبل مشخص نیست. اگر بخواهیم از یک آرایه ایستا استفاده کنیم، باید طول ثابتی را در نظر بگیریم. پس باید یک حداکثر برای تعداد نمره‌ها معلوم کنیم. مثلا فرض کنیم حداکثر می‌توان هزار نمره وارد کرد. پس تعریف می‌کنیم:

  

float marks[1000];

  

اما تعریف فوق دو ایراد دارد. اول این که اگر تعداد نمره‌ها بیشتر از هزار باشد، برنامه کار نمی‌کند؛ و دوم، اگر مثلا فقط سه نمره وارد شود، 997 عضو از عناصر آرایه بلااستفاده خواهند ماند، که حافظه اشغال کرده‌اند. رفع این دو ایراد راه ساده‌ای دارد: استفاده از آرایه پویا.

آرایه پویا همانند آرایه ایستا، برای تعریف عناصر هم‌نوع به کار می‌رود. با این تفاوت که می‌توان در زمان تعریف، از متغیرها برای تعیین طول استفاده کرد. حالت کلی تعریف آرایه پویا با عبارت زیر مشخص می‌شود:

  

type *name;

name = new type[number of elements];

  

به عنوان نمونه، عبارت بالا را باید نوشت:

  

int n;

double *arr;

cin >> n;

arr = new double[n];

  

که باعث می‌شود یک آرایه پویا به نام arr و به طول n ایجاد شود.

آرایه‌های پویا پس از تعریف، هیچ تفاوتی با آرایه ایستای معمولی ندارند و دسترسی به عناصر آنها با اندیس صورت می‌گیرد. اما حتما باید به خاطر داشت باشید که حافظه استفاده شده برای آرایه پویا را بعد از استفاده، با دستور delete آزاد کنید:

  

delete[] name;

  

برای آرایه arr که در قبلا تعریف کرده‌ایم:

  

delete[] arr;

  

همانطور که مشاهده می‌کنید، آرایه‌های پویا ارتباط نزدبکی با اشاره‌گرها و بحث تخصیص حافظه دارند. با این وجود، ایراداتی دارند که گاهی برنامه‌نویس را مجبور می‌کند از ساختارهای دیگر - مانند لیست پیوندی - استفاده کند.


نسخه‌ی اولیه‌ی این نوشته از وبلاگ برنامه‌نویسی و طراحی الگوریتم به الگوریتمستان منتقل شده است.

تا کنون ۱۰۰ امتیاز ثبت شده
نوشته لایک نداشت؟
 
به اشتراک گذاری نوشته

amasoudfam.ir/l/7jymp

اشتراک‌گذاری در LinkedIn     اشتراک‌گذاری در Twitter     ارسال با Telegram

نام: *  
پست الکترونیک (محرمانه):
پیام: *  
• fahimah
۱۹ اردیبهشت ۱۳۸۶، ساعت ۱۸:۵۱

با عرض سلام خواهشمند است چند سوال در مورد حافظه داینامیک برایم بفرستید البته منظورم آرایه ای از رشته ها و اختصاص دلدن حافظه است  

                                                                         با تشکر

• fahimah
۱۹ اردیبهشت ۱۳۸۶، ساعت ۲۰:۲۶

با عرض سلام خواهشمند است آررایه یک بعدی با استفاده ازاشاره گر و حافظه ی داینامیک توضیح دهید

اگر میشه خیلی سریع

                                                   باتشکر

• راضیه
۳۱ مرداد ۱۳۸۶، ساعت ۱۱:۴۷

سلام آیا روشی که برای آرایه پویا در C++ توضیح دادین قابل استفاده  در  c هم هست ؟

• محمد
۸ آذر ۱۳۸۶، ساعت ۱۳:۱۸

باسلام

ممنون مي شم اگه در مورد مطلب زير اطلاعاتي برام بديد

الگوريتم ماتريس يك بعدي با روش پر پيچ و خم

• maliheh
۱۸ آذر ۱۳۸۶، ساعت ۱۹:۰۴

اگه ميشه جواب سوال هايي رو  كه پرسيده شده  روي همين سايت بذارين تا ما هم بتونيم استفاده كنيم.

با كمال تشكر.

• leila
۱۸ اسفند ۱۳۸۶، ساعت ۱۴:۲۴

salam

tashakor mikonam az site khyli jaleb va khubetun

mikhastam age momkene ye ketab baraie graphic dar c++ va java be man moarefi konid

khyli khyli mamnun

• سهذسخقناه
۲۸ خرداد ۱۳۸۷، ساعت ۲۳:۴۵

من یک پروژه دارم می خواستم بیبینم برای شما بفرستیم انجام می دهید.برنامهC

مسعود اقدسی‌فام
۲۹ خرداد ۱۳۸۷، ساعت ۰۰:۰۸

نه سهذسخقناه جان!!! انجام نمی دیم.

• حامد
۲۰ فروردین ۱۳۸۹، ساعت ۱۴:۱۰

با سلام

میخواستم همین روش را برای آرایه های دو بعدی توضیح دهید یعنی هر دو بعد متغیر باشند .

واینکه من میخواهم برنامه ای بنویسم ونتیجه محاسبات در یک آرایه ریخته شود.وتعداد محاسبات معلوم نیست یعنی طول  آرایه دائم تغییر میکند لطفآراهنمایی کنید  

۲۰ فروردین ۱۳۸۹، ساعت ۱۶:۱۶
• مسعود اقدسی‌فام

درباره آرایه پویای دو بعدی مطلب جداگانه ای نوشته شده.

در صورتی که حد بالایی برای تعداد محاسبات وجود نداره، تنها راه حل ممکن استفاده از لیستهای پیوندی به جای آرایه هاست. نمی شه طول آرایه رو بعد از تعریف تغییر داد.

البته در این زبان شما می تونید به اندیسهای بالاتر از تعریف آرایه هم داده بنویسید (آرایه ها و اشاره گر به حافظه رابطه نزدیکی با هم دارن). اما با توجه به اینکه اون محل حافظه برای آرایه رزرو نشده، ممکنه برنامه دیگه ای روی همون محل داده وارد کنه، و در نتیجه اطلاعات شما مخدوش بشه.

• حامد
۷ خرداد ۱۳۸۹، ساعت ۰۰:۳۰

سلام . لطف می کنید مفهوم حافظه پوبا و ایستا رو در ساختمان داده ها بگید . و انواع ساختمان داده ها که با این روش ذخیره می شود

• narmin
۱۲ خرداد ۱۳۸۹، ساعت ۱۱:۲۰

سلام میخواستم برنامه ی زمانبندی RR(round robin) را با صفها در C  یا    C++بنویسم اما نمی دونم چطور؟ با آرایه ها زمان ورود و اجرا وکوانتوم رو بگیرم یا یک ساختمان تعریف کنم؟و چطوری فرایندها رو اجرا کنم؟ لطفا بهم کمک کنید خیلی واجبه .

• مریم
۳۰ اردیبهشت ۱۳۹۰، ساعت ۲۲:۱۴

برنامه ای که یک مقداری رو بگیره و به 4 روش که در کتاب سیستم عامل اومده حافظه تخصیص بده به هر زبان دلخواه

خواهش می کنم کمک کنید

واسه یه بنده خدایی که خیلی به نمره ی این برنامه احتیاج داره.

مطمئنم دعاتون می کنه.

خدا خیرتون بده

منتظر جوابتون هستم

• سعيد
۱۳ شهریور ۱۳۹۲، ساعت ۱۸:۰۳

سلام من كد الگوريتم تخصيص حافظه بست فيت رو به زبان سي پلاس پلاس ميخوام تا بتونم شبيه سازي كنم خواهش ميكنم كمكم كنيد

• بهار
۱ آبان ۱۳۹۲، ساعت ۱۲:۰۴

سلام

.من بايد با ديوسي پلاس پلاس  يه الگوريتم پويا بنويسم كه بتونه با توجه به فايل ورودي  كه يه گرامري از زبان نظريه زبان ها و اتوماتا هست و يه جمله اي كه بهش ميدم در كمترن زمان ممكن برام مشخص كنه ايا جمله در اين گرامر صدق مي كند يا نه؟گرامر و جملات مهم نيست فقط الگوريتمش چه جوري بايد باشه؟خواهش مي كنم كمكم كنيد

• حسین
۲۲ آذر ۱۳۹۲، ساعت ۱۱:۴۸

سلام می شه الگویتم گرامر رو که توی درس نظریه زبان هاست بزارین؟

ممنون!!

• Soroushp
۳۰ بهمن ۱۳۹۲، ساعت ۲۱:۱۶

ممنون

• rezaiy
۲۵ دی ۱۳۹۳، ساعت ۲۳:۰۶

با سلام و تشکر فراوان

ببخشید یه سوال داشتم اگه امکانش هست جوابشو واسم ایمیل کنین

اگر در ++c  داده استاتیک رو در قسمت proptect کلاس تعریف کنیم چه اتفاقی مییوفته

روش تعریف این متغیر و مقدار دهیش چطوریه؟

و داده های استاتیک در کلاس به چند روش فراخوانی میشن؟

خیلی ممنون میشم اگه بشه زود جواب بدین امتحان دارم

• A
۲۲ آذر ۱۳۹۴، ساعت ۱۷:۱۷

سلام...

ممنون از مطلب خوبتون...

آیا این امکان هم وجود داره که داخل یک استراکچر حافظه پویا تخصیص بدیم؟!

میشه کمی راهنمایی کنید؟!10

ممنون...

• فاطمه
۲ آذر ۱۳۹۵، ساعت ۱۲:۳۴

1313141414

• وحید
۱۶ اسفند ۱۳۹۶، ساعت ۱۴:۲۵

ممنون. واقعا خیلی به درد بخور و فوق العادو بود. 0606

• اسرا
۱۹ آبان ۱۳۹۷، ساعت ۱۳:۰۱

05050505

• محمد
۸ دی ۱۳۹۷، ساعت ۱۸:۵۶

مطالب زیبا و خوانا بودن با تشکر استفاده کردم.

Http://tadriscpp.blogfa.com

• رضا
۳ خرداد ۱۳۹۸، ساعت ۰۱:۵۹

عالی بود خیلی کمکم کرد1414