cpp-05-02 - استفاده از آرایه؛ آرایه همگن در مقابل ناهمگن
cpp-05-02 - استفاده از آرایه؛ آرایه همگن در مقابل ناهمگن
توضیحات :
خب تا اینجا فهمیدیم که آرایهها در اصل شبیه متغیرها هستند؛ با این تفاوت که آرایه یک مجموعهای از مقادیر را در یک ساختار نگه میدارد.
در زبانهایی مثل C و C++ اصطلاحاً میگوییم آرایه Homogeneous یا «همگن» است.
همگن یعنی چی؟ یعنی تمام اعضای آرایه باید از یک جنس باشند.
مثلاً نمیتوانی آرایهای داشته باشی که یک خانهاش عدد صحیح باشد، خانهی بعدش عدد اعشاری و خانهی دیگری رشته باشد. این میشود آرایهی ناهمگن.
در زبانهای مدرن مثل Python یا PHP داشتن آرایههای ناهمگن طبیعی است، اما در زبانهای Strongly Typed مثل C، C++ یا C# آرایهها حتماً باید همگن باشند.
تعریف آرایه
برای تعریف آرایه، سه چیز لازم داری:
-
جنس آرایه
-
نام آرایه
-
تعداد خانهها
مثلاً:
این یعنی آرایهای داریم از جنس int با 3 خانه.
چرا میگوییم آرایه هم یک نوع متغیر است؟
چون دقیقاً مثل تعریف متغیر:
-
اول جنس را مینویسی
-
بعد اسم را
-
فقط اینجا یک جفت براکت اضافه میشود که تعداد اعضا را مشخص میکند.
چه اتفاقی در حافظه میافتد؟
فرض کن این بخش، RAM کامپیوتر است.
وقتی میگویی:
کامپیوتر سه خانه پشت سر هم در حافظه برایت کنار میگذارد.
چرا پشت سر هم؟
چون آرایه Contiguous یا پیوسته است.
حالا بسته به نوع آرایه، اندازهی هر خانه فرق میکند:
-
اگر int باشد → هر خانه 4 بایت
-
اگر char باشد → هر خانه 1 بایت
-
اگر double باشد → هر خانه 8 بایت
پس اگر آرایه int باشد، 3 خانه × 4 بایت = 12 بایت فضا در رم اشغال میشود.
مقدار اولیه داخل خانهها چیست؟
اگر خودت مقدار ندهی، مقدارهای داخل آرایه نامشخص هستند (random garbage).
برای جلوگیری از این مشکل، باید آرایه را Initialize کنی:
وقتی فقط یک عدد داخل {} میگذاری، تمام خانهها با همان مقدار پر میشوند.
دسترسی به اعضای آرایه
آرایهها اندیس دارند.
اندیس همیشه از ۰ شروع میشود.
در آرایهی ۳ خانهای:
-
خانه اول → arr[0]
-
خانه دوم → arr[1]
-
خانه سوم → arr[2]
چرا آخرین اندیس همیشه n-1 است؟
چون شمارش از صفر شروع میشود.
مقداردهی تکتک خانهها
میتوانی هنگام تعریف مقدار بدهی:
یا بعداً مقدار بدهی:
اما اگر آرایهات بزرگ باشد (مثلاً 2000 خانه)، مقداردهی تکتک خانهها به صورت دستی منطقی نیست.
استفاده از حلقه برای مقداردهی
برای آرایههای بزرگ از حلقه استفاده میکنیم:
در پروژههای واقعی معمولاً دادهها از یک دیتابیس یا فایل خوانده میشوند و با حلقه در آرایه قرار میگیرند.
در استانداردهای جدیدتر C++ مثل C++11 حلقههای بهتر و سادهتری اضافه شدهاند مثل for-each که بعداً یاد میگیریم.
مشاهده وضعیت آرایه در حافظه (Memory Debugging)
حالا میرسیم به بخش جذاب:
اینکه آرایه واقعاً در حافظه چگونه ذخیره میشود.
در Visual Studio اگر یک break point بگذاری و برنامه را با F5 (نه Ctrl+F5) اجرا کنی، میتوانی مقدار دقیق خانههای آرایه را در پنجرهی Memory ببینی.
مثلاً:
در حافظه سه بخش 4 بایتی پشت سر هم ایجاد میشود:
-
4 بایت اول → عدد 1
-
4 بایت دوم → عدد 2
-
4 بایت سوم → عدد 3
در Memory Window مقدارها معمولاً به صورت هگزادسیمال نمایش داده میشوند و از راست به چپ باید بخوانی (به دلیل Little Endian بودن معماری CPU).
در پنجره Locals نیز میتوانی نام آرایه و مقدار خانهها را ببینی.
به این صورت با چشم میبینی که:
-
آرایهها واقعاً پیوسته در حافظه ذخیره میشوند
-
اندازهی هر خانه دقیقاً به اندازهی نوع داده است
-
مقادیر همان چیزی هستند که تنظیم کردی
جمعبندی
در این بخش یاد گرفتیم:
-
آرایهها همگن هستند (همه اعضا یک نوع دارند).
-
روش تعریف آرایه و مقداردهی اولیه.
-
مفهوم اندیس و دسترسی به اعضا.
-
استفاده از حلقهها برای مقداردهی آرایههای بزرگ.
-
نحوه ذخیره شدن آرایه در حافظه و مشاهده آن داخل Visual Studio.
حالا میرویم سراغ بخش بعدی و ادامهی کار با آرایهها و اینکه اصلاً چهجوری در برنامهنویسی واقعی از آنها استفاده میکنیم.
لطفا برای گذاشتن نظرات خود وارد شوید