PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : آرايه‌ها و اشاره‌گرها در برنامه‌نويسي (( دشواري‌هاي كندوي زنبورعسل ))



آبجی
18th August 2010, 11:16 AM
دشواري‌هاي كندوي زنبورعسل


در برنامه‌نويسي وقتي صحبت از مجموعه بزرگي از داده‌ها مي‌شود چه در مورد ذخيره و بازيابي اين اطلاعات در حافظه و چه در مورد پاس دادن آنها به عناصر برنامه، شيوه ذخيره‌سازي و كنترل اين مجموعه از داده‌ها دشوار خواهد شد. ساختمان داده آرايه، يكي از مفيدترين ساختمان‌هاي داده‌اي است كه امروزه در زبان برنامه‌نويسي به‌كار مي‌رود.
<span lang="FA"> آرايه چيست؟ آرايه به مجموعه‌اي از عناصر گفته مي‌شود که از يک نوع باشند و يک نام واحد داشته‌باشند. بگذاريد با مثال اين تعريف را بيان کنيم؛ فرض کنيد مي‌خواهيم فهرستي از نمرات دانشجويان يک کلاس را داشته ‌باشيم. يک راه اين است که به ازاي هر دانشجو يک متغير تعريف کنيم اما آيا اين راه منطقي است؟ جواب خير است. اينجا است که بحث آرايه‌ها مطرح مي‌شود چون نمرات همه دانشجويان از يک نوع است. ما مي‌توانيم يک مجموع از نوع عدد درست کرده و نمرات دانشجويان را درون آن قرار دهيم. به اين مجموعه آرايه گفته مي‌شود. در زبان C آرايه‌ها به‌صورت زير تعريف مي‌شوند:


double scores[10];

int ids[200];

char string[20];
كه كليدواژگان double، int و char نوع داه‌اي عناصر آرايه را نشان مي‌دهند، scores، idsو string نام دلخواه آرايه هستند و اعداد درون براكت نيز طول آرايه را نمايش مي‌دهند.
نکته: آرايه‌ها در زبان‌هاي خانواده C مانند ++ C،
جاوا،# C و... از صفر آغاز مي‌شوند، اما در VB عنصر آغازين، شماره 1 دارد. براي دسترسي به عناصر آرايه از انديس آنها استفاده مي‌کنيم به‌طور مثال براي گرفتن مقدار عنصر اول آرايه به‌صورت زير مي‌نويسيم:


Array_variable[0]
مقداردهي اوليه به آرايه، براي اين‌ كار مقاديري که بايد در آرايه قرار داده شود را داخل {} جلوي تعريف آرايه مي‌نويسيم. به‌عنوان مثال:
<div align="left">

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);

استفاده از تمامی مطالب سایت تنها با ذکر منبع آن به نام سایت علمی نخبگان جوان و ذکر آدرس سایت مجاز است

استفاده از نام و برند نخبگان جوان به هر نحو توسط سایر سایت ها ممنوع بوده و پیگرد قانونی دارد