✤  آرایه ایستا و پویا در ++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;

  

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

مسعود اقدسی فام

مسعود اقدسی فام هستم.

دانش‌آموخته‌ی علوم کامپیوتر و فعال حوزه‌های علم داده و یادگیری ماشین؛ علاقه‌مند به یاد دادن و یاد گرفتن :)

algs.ir/sp7jymp     اشتراک‌گذاری در LinkedIn     اشتراک‌گذاری در Twitter     ارسال با Telegram
نوشته‌ها از این دست
       ✦   قالب‌ها در ++C
آخرین نوشته‌ها
       ✦   الگوریتم آنلاین
نوشته‌های پرمخاطب
  • 1
  • 2
  • 3
  • 4
  • 5

نام: *  

پست الکترونیک (محرمانه):

متن پیام: *  

01 02 06 07 08 09 10 11 12 13 14

• 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