آرایه‌ها و اشاره‌گرها در برنامه‌نویسی

دشواری‌های کندوی زنبورعسل

در برنامه‌نویسی وقتی صحبت از مجموعه بزرگی از داده‌ها می‌شود چه در مورد ذخیره و بازیابی این اطلاعات در حافظه و چه در مورد پاس دادن آنها به عناصر برنامه، شیوه ذخیره‌سازی و کنترل این مجموعه از داده‌ها دشوار خواهد شد. ساختمان داده آرایه، یکی از مفیدترین ساختمان‌های داده‌ای است که امروزه در زبان برنامه‌نویسی به‌کار می‌رود.
کد خبر: ۳۴۷۱۱۵

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

double scores[10];

int ids[200];

char string[20];

که کلیدواژگان double، int و char نوع داه‌ای عناصر آرایه را نشان می‌دهند، scores، idsو string نام دلخواه آرایه هستند و اعداد درون براکت نیز طول آرایه را نمایش می‌دهند.

نکته: آرایه‌ها در زبان‌های خانواده C مانند ++ C، جاوا، # C و... از صفر آغاز می‌شوند، اما در VB عنصر آغازین، شماره 1 دارد.

برای دسترسی به عناصر آرایه از اندیس آنها استفاده می‌کنیم به‌طور مثال برای گرفتن مقدار عنصر اول آرایه به‌صورت زیر می‌نویسیم:

Array_variable[0]

مقداردهی اولیه به آرایه، برای این‌ کار مقادیری که باید در آرایه قرار داده شود را داخل {} جلوی تعریف آرایه می‌نویسیم. به‌عنوان مثال:

Int x[4] = {1,2,3,4};

Int y[] = {1,2,3,4};

هر دو آرایه طولشان 4 است و مقدار‌های عناصر آنها برابر است.

دسترسی به عناصر آرایه

به‌صورت کلی برای دسترسی به عناصر آرایه از عملگر [] استفاده می‌شود.

حال وقتی یک آرایه را تعریف می‌کنیم، چه اتفاقی می‌افتد؟

مثلا فرض کنید آرایه‌ای به‌صورت [int a[10 تعریف شده است. 10 خانه پشت سر هم در حافظه برای دسترسی به آرایه رزرو می‌شود و وقتی ما اندیس خانه‌ای را بیان می‌کنیم برنامه از اولین خانه حافظه شروع به شمردن می‌کند تا به اندیس مورد نظر برسد. مثلا وقتی می‌نویسیم [a[2، از خانه اول 3 خانه که به‌اندازه یک int هستند جلو می‌رود و محتویات خانه را به ما نشان می‌دهد تا مقداری را به آن بدهیم.

خب چطور وقتی ما می‌گوییم [a[2 کامپایلر خانه 3 آرایه را به ما می‌دهد؟

در بحث اشاره‌گرها گفته شد که می‌توانیم با استفاده از عملگر‌ ++ اشاره‌گر را به جلو حرکت دهیم یا با استفاده از عملگر + بگوییم که اشاره‌گر به چند خانه جلوتر اشاره کند. مثلا بنویسیم ptrx+2، ptrx به‌اندازه 2 خانه از نوع int به‌سمت جلو حرکت می‌کند.

حال اگر آرایه را یک اشاره‌گر در نظر بگیریم می‌توان راحت به خانه‌های مختلف آن دسترسی داشت.پس متغیر a در آرایه تعریف شده بالا یک اشاره‌گر از نوع int است که می‌توان با حرکت دادن آن به محتویات خانه‌های مختلف آن دسترسی پیدا کرد.پس *a برابر [a[0 است و همین‌طور (a+1)* برابر [a[1.

مشکلات استفاده از آرایه

گاهی داده‌های شما زیاد است و سیستم‌عامل نمی‌تواند آن مقدار خانه پشت سر هم را اختصاص دهد یا این‌که ممکن است در عملکرد برنامه‌های دیگر خلل ایجاد شود و چون طول آرایه‌ها ثابت است نمی‌توانیم به هر میزان که خواستیم آرایه تعریف کنیم.

از طرفی ممکن است ما ندانیم واقعا به چه مقدار عنصر آرایه نیاز داریم.

در واقع آرایه یک عنصر استاتیک است. چگونه مشکل آرایه ایستا را حل کنیم؟

برای حل این مشکل باید یک آرایه به‌صورت پویا (آرایه پویا آرایه‌ای است که طول آن مشخص نیست و در هر لحظه می‌توان طول آن‌را تغییر داد) تعریف کنیم. اما چگونه؟

برای تعریف آرایه پویا از اشاره‌گر‌ها استفاده می‌کنیم. برای این کار با تابعی به‌نام malloc آشنا می‌شویم. تعریف این تابع به‌صورت زیر است:

Void* malloc(size_t size);

این تابع چه کار می‌کند؟ این تابع به اندازه size_t حافظه اشغال می‌کند سپس نشانی اولین خانه از حافظه‌ اشغال شده را برمی‌گرداند. توجه داشته ‌باشید که مقدار برگشتی تابع * void است که با توجه به نوع داده‌ای که می‌خواهیم آن‌را تبدیل می‌کنیم. مثلا می‌خواهیم آرایه‌ای از نوع int به طول 10 داشته‌باشیم:

int* ptrx = (int*)malloc(sizeof(int)*10);

خب تا اینجا که فرقی با آرایه معمولی نداشت حال ما می‌توانیم اندازه حافظه‌ای که ptrx به آن اشاره می‌کند را افزایش دهیم. برای این کار از تابع reallocکه تعریف آن به‌صورت زیر است:

Void* realloc(void* ptr,size_t newsize);

مقدار ptrx را طوری تغییر دهید که به 20 خانه از حافظه اشاره کند.

ptrx = (int*)realloc(ptrx,sizeof(int)*20);

امیربهاالدین سبط‌الشیخ

newsQrCode
ارسال نظرات در انتظار بررسی: ۰ انتشار یافته: ۰

نیازمندی ها