1. مهمان گرامی، جهت ارسال پست، دانلود و سایر امکانات ویژه کاربران عضو، ثبت نام کنید.
    بستن اطلاعیه

آرايه‌ها و اشاره‌گرها در برنامه‌نويسي (( دشواري‌هاي كندوي زنبورعسل ))

شروع موضوع توسط minaaa ‏28/1/11 در انجمن C #C++

  1. کاربر پیشرفته

    تاریخ عضویت:
    ‏9/12/10
    ارسال ها:
    19,773
    تشکر شده:
    6,457
    امتیاز دستاورد:
    113
    دشواري‌هاي كندوي زنبورعسل





    در برنامه‌نويسي وقتي صحبت از مجموعه بزرگي از داده‌ها مي‌شود چه در مورد
    ذخيره و بازيابي اين اطلاعات در حافظه و چه در مورد پاس دادن آنها به عناصر
    برنامه، شيوه ذخيره‌سازي و كنترل اين مجموعه از داده‌ها دشوار خواهد شد.
    ساختمان داده آرايه، يكي از مفيدترين ساختمان‌هاي داده‌اي است كه امروزه در
    زبان برنامه‌نويسي به‌كار مي‌رود.

    <span lang="FA"> [SIZE=+0]آرايه چيست؟ آرايه به
    مجموعه‌اي از عناصر گفته مي‌شود که از يک نوع باشند و يک نام واحد
    داشته‌باشند. بگذاريد با مثال اين تعريف را بيان کنيم؛ فرض کنيد مي‌خواهيم
    فهرستي از نمرات دانشجويان يک کلاس را داشته ‌باشيم. يک راه اين است که به
    ازاي هر دانشجو يک متغير تعريف کنيم اما آيا اين راه منطقي است؟ جواب خير
    است. اينجا است که بحث آرايه‌ها مطرح مي‌شود چون نمرات همه دانشجويان از يک
    نوع است. ما مي‌توانيم يک مجموع از نوع عدد درست کرده و نمرات دانشجويان
    را درون آن قرار دهيم. به اين مجموعه آرايه گفته مي‌شود. در زبان C
    آرايه‌ها به‌صورت زير تعريف مي‌شوند:[/SIZE] کد PHP:
    <code style="white-space: nowrap;">
    <code>
    [LEFT]double scores[10];[/LEFT]
    [
    LEFT]int ids[200];[/LEFT]
    [
    LEFT]char string[20];[/LEFT]



    </code>
    </code>

    [SIZE=+0]كه كليدواژگان double، int و char نوع داه‌اي
    عناصر آرايه را نشان مي‌دهند، scores، idsو string نام دلخواه آرايه هستند و
    اعداد درون براكت نيز طول آرايه را نمايش مي‌دهند.[/SIZE]

    [SIZE=+0]نکته: آرايه‌ها در زبان‌هاي خانواده C مانند ++ C، [/SIZE]

    [SIZE=+0]جاوا،[/SIZE][SIZE=+0]# [/SIZE][SIZE=+0]C و... از صفر آغاز مي‌شوند، اما در VB عنصر آغازين، شماره 1 دارد.[/SIZE] [SIZE=+0]براي دسترسي به عناصر آرايه از انديس آنها استفاده مي‌کنيم به‌طور مثال براي گرفتن مقدار عنصر اول آرايه به‌صورت زير مي‌نويسيم:[/SIZE]

    کد PHP:
    <code style="white-space: nowrap;">
    <code>
    Array_variable[0]



    </code>
    </code>

    [SIZE=+0]مقداردهي اوليه به آرايه، براي اين‌ كار
    مقاديري که بايد در آرايه قرار داده شود را داخل {} جلوي تعريف آرايه
    مي‌نويسيم. به‌عنوان مثال:[/SIZE]

    <div align="left"> کد PHP:
    <code style="white-space: nowrap;">
    <code>
    [LEFT]Int x[4] = {1,2,3,4};[/LEFT]
    [
    LEFT]Int y[] = {1,2,3,4};[/LEFT]



    </code>
    </code>

    [SIZE=+0]هر دو آرايه طولشان 4 است و مقدار‌هاي عناصر آنها برابر است.[/SIZE]

    [SIZE=+0]

    [/SIZE]

    [SIZE=+0]دسترسي به عناصر آرايه[/SIZE]

    [SIZE=+0]

    [/SIZE]​
    [SIZE=+0]به‌صورت کلي براي دسترسي به عناصر آرايه از عملگر [] استفاده مي‌شود.[/SIZE]

    [SIZE=+0]حال وقتي يک آرايه را تعريف مي‌کنيم، چه اتفاقي مي‌افتد؟[/SIZE]

    [SIZE=+0]مثلا فرض کنيد آرايه‌اي به‌صورت [[/SIZE]

    [SIZE=+0]int a[10 [/SIZE][SIZE=+0]تعريف شده است.
    10 خانه پشت سر هم در حافظه براي دسترسي به آرايه رزرو مي‌شود و وقتي ما
    انديس خانه‌اي را بيان مي‌کنيم برنامه از اولين خانه حافظه شروع به شمردن
    مي‌کند تا به انديس مورد نظر برسد. مثلا وقتي مي‌نويسيم [/SIZE][SIZE=+0][[/SIZE][SIZE=+0]a[/SIZE][SIZE=+0][2[/SIZE][SIZE=+0]، از خانه اول 3 خانه که به‌اندازه يک int هستند جلو مي‌رود و محتويات خانه را به ما نشان مي‌دهد تا مقداري را به آن بدهيم.[/SIZE] [SIZE=+0]خب چطور وقتي ما مي‌گوييم [/SIZE]

    [SIZE=+0][[/SIZE][SIZE=+0]a[/SIZE][SIZE=+0][2[/SIZE][SIZE=+0] کامپايلر خانه 3 آرايه را به ما مي‌دهد؟[/SIZE] [SIZE=+0]در
    بحث اشاره‌گرها گفته شد که مي‌توانيم با استفاده از عملگر‌ ++ اشاره‌گر را
    به جلو حرکت دهيم يا با استفاده از عملگر + بگوييم که اشاره‌گر به چند
    خانه جلوتر اشاره کند. مثلا بنويسيم ptrx+[/SIZE]

    [SIZE=+0]2[/SIZE][SIZE=+0]، ptrx به‌اندازه 2 خانه از نوع int به‌سمت جلو حرکت مي‌کند.[/SIZE] [SIZE=+0]حال
    اگر آرايه را يک اشاره‌گر در نظر بگيريم مي‌توان راحت به خانه‌هاي مختلف
    آن دسترسي داشت.پس متغير a در آرايه تعريف شده بالا يک اشاره‌گر از نوع int
    است که مي‌توان با حرکت دادن آن به محتويات خانه‌هاي مختلف آن دسترسي پيدا
    کرد.پس [/SIZE]

    [SIZE=+0]*a[/SIZE][SIZE=+0] برابر [/SIZE][SIZE=+0][[/SIZE][SIZE=+0]a[/SIZE][SIZE=+0][0 [/SIZE][SIZE=+0]است و همين‌طور [/SIZE][SIZE=+0](a+1)*[/SIZE][SIZE=+0] برابر [/SIZE][SIZE=+0][[/SIZE][SIZE=+0]a[/SIZE][SIZE=+0][1[/SIZE][SIZE=+0].[/SIZE]
    [SIZE=+0]

    [/SIZE]

    [SIZE=+0]مشکلات استفاده از آرايه[/SIZE]

    [SIZE=+0]

    [/SIZE]​
    [SIZE=+0]گاهي داده‌هاي شما زياد است و
    سيستم‌عامل نمي‌تواند آن مقدار خانه پشت سر هم را اختصاص دهد يا اين‌که
    ممکن است در عملکرد برنامه‌هاي ديگر خلل ايجاد شود و چون طول آرايه‌ها ثابت
    است نمي‌توانيم به هر ميزان که خواستيم آرايه تعريف کنيم.[/SIZE]

    [SIZE=+0]از طرفي ممکن است ما ندانيم واقعا به چه مقدار عنصر آرايه نياز داريم.[/SIZE]

    [SIZE=+0]در واقع آرايه يک عنصر استاتيک است. چگونه مشکل آرايه ايستا را حل کنيم؟[/SIZE]

    [SIZE=+0]براي حل اين مشکل بايد يک آرايه به‌صورت پويا (آرايه
    پويا آرايه‌اي است که طول آن مشخص نيست و در هر لحظه مي‌توان طول آن‌را
    تغيير داد) تعريف کنيم. اما چگونه؟[/SIZE]

    [SIZE=+0]براي تعريف آرايه پويا از اشاره‌گر‌ها استفاده
    مي‌کنيم. براي اين کار با تابعي به‌نام malloc آشنا مي‌شويم. تعريف اين
    تابع به‌صورت زير است:[/SIZE]

    کد PHP:
    <code style="white-space: nowrap;">
    <code>
    Void* malloc(size_t size);



    </code>
    </code>

    [SIZE=+0]اين تابع چه کار مي‌کند؟ اين تابع به
    اندازه size_t حافظه اشغال مي‌کند سپس نشاني اولين خانه از حافظه‌ اشغال
    شده را برمي‌گرداند. توجه داشته ‌باشيد که مقدار برگشتي تابع [/SIZE]

    [SIZE=+0]* [/SIZE][SIZE=+0]void است که با توجه به نوع داده‌اي که مي‌خواهيم آن‌را تبديل مي‌کنيم. مثلا مي‌خواهيم آرايه‌اي از نوع int به طول 10 داشته‌باشيم: [/SIZE]
    کد PHP:
    <code style="white-space: nowrap;">
    <code>
    int* ptrx = (int*)malloc(sizeof(int)*10);



    </code>
    </code>

    [SIZE=+0]خب تا اينجا که فرقي با آرايه معمولي
    نداشت حال ما مي‌توانيم اندازه حافظه‌اي که ptrx به آن اشاره مي‌کند را
    افزايش دهيم. براي اين کار از تابع reallocکه تعريف آن به‌صورت زير است:[/SIZE]

    کد PHP:
    <code style="white-space: nowrap;">
    <code>
    Void* realloc(void* ptr,size_t newsize);



    </code>
    </code>

    [SIZE=+0]مقدار ptrx را طوري تغيير دهيد که به 20 خانه از حافظه اشاره کند.[/SIZE]

    کد PHP:
    <code style="white-space: nowrap;">
    <code>
    ptrx = (int*)realloc(ptrx,sizeof(int)*20);



    </code>
    </code>