زبان C – آرایهها (جلسه ۴)
زمان تقریبی مطالعه این مقاله: ۷ دقیقه
سلام به دوستان عزیز میکرولرنی 🙂 🙂 🙂
این مقاله در ۱۷ اردیبهشت ۱۴۰۰ به روز رسانی شده.
اگه تا این بخش از مقالههای زبان C رو در میکرولرن خونده باشید، با متغیرها و اشاره گرها به خوبی آشنا شدید. اما الان نوبت به اون رسیده تا در مورد اولین نوع از دادههای مرکب یعنی آرایه در زبان C صحبت کنیم. آرایه یا Array یکی از تحولات بزرگ در زمان خودش به حساب مییاد. به نوعی که، اگه آرایه را از برنامه نویسی حذف کنیم شما به بنبست کامل بر میخورید. پس یکی از موارد مهم برای تبدیل شدن به یک برنامه نویس خوب، اینه که آرایه را به خوبی یاد بگیرید. بیشتر از این مقدمه نمیگم و از شما میخوام تا با میکرولرن، مرجع برنامه نویسی C همراه بشید.
فهرست مطالب
آشنایی با آرایه در زبان C
طبق جلسات دو و سه از آموزش زبان C در میکرولرن، میدانیم که در برنامه نویسی از متغییرها برای ذخیره اطلاعات استفاده میشود. ولی مواردی پیش میآید که اطلاعات زیادی در یک برنامه به صورت یکجا وجود دارد و باید عملیاتی روی تمام آنها انجام شود. در این صورت معرفی کردن تعداد زیادی متغییر و انجام عملیات روی آنها کار بسیار وقت گیری خواهد بود و نیاز به برنامه های طولانی با دستورهای مشابه خواهد داشت.
برای درک موضوع به مثال زیر دقت کنید:
فرض کنید لازم باشد اطلاعات خروجی ۵۰ سنسور دمای متصل به یک میکروکنترلر خوانده شود. این اطلاعات پس از خوانده شدن، نیاز به ذخیره سازی دارند. این جاست که متغیرهای معمولی که تا کنون معرفی شدند جواب گو نیستند و باید سراغ نوع جدیدی از داده رفت.
چرا که اگر بخواهیم از متغیرهای معمولی استفاده کنیم نیاز به تعریف ۵۰ نام مختلف و متمایز برای متغیرها است و این فقط بخشی از دشواری کار است. چرا که برای انجام عملیات ریاضی باید نام همه را بدانیم و … . این نوع جدید آرایه نام دارد. آرایه مجموعه ای از متغیرهای هم طول و هم نوع را تحت عنوان یک نام معرفی می کند.
مزایای استفاده از آرایه
- اعلان ساده تر (اعلان یک متغییر بجای دهها و هزاران)
- سادگی کار با آنها ( عملیات ریاضی یکسانی بر روی آنها انجام می گیرد)
- انعطاف پذیری بیشتر (به روشهای مختلف می توان آنها را پردازش نمود)
- سهولت فهم برنامه
- کاهش اندازه برنامه نوشته شده
آرایههای یک بعدی
در اثر دستوری به شکل int a، یک متغیر به نام a در برنامه تعریف میشود که به آن یک خانه دو بایتی از حافظه نسبت داده میشود. حال سوالی که وجود دارد این است که آیا میتوان به جای یک خانه از حافظه، تعداد خانههای بیشتری را به یک نام نسبت داد؟
پاسخ را میتوان در آرایه ها جستجو کرد. آرایه عبارت است از مجموعهای از متغیرهای سادهی همنوع که تحت عنوان یک اسم در برنامه تعریف میشوند. اولین نوع از آرایه، یک بعدی است یعنی فقط یک سطر برای آن تعریف میشود. در ادامه با روش تعریف کردن آرایه آشنا می شویم.
تعریف آرایه در زبان C
برای تعریف یک آرایه، باید در هنگام تعریف، نوع و نام آرایه ذکر گردد و بعد از آن در داخل یک زوج کروشه یعنی [ ]، تعداد عناصر (خانههای) آرایه درج شود. در باکس زیر، نحوه تعریف را مشاهده می کنید:
<array type> <array name>[<array index>]
آرایهای که دارای n عنصر (خانه) باشد، اندیس عناصر آن از صفر تا n-1 تعریف میشود و کلیه این عناصر از یک نوع میباشند. مثلا برای یک آرایه با ۵ خانه شماره اندیس از ۰ تا ۴ تغییر می کند. در واقع خانه اول از صفر شروع می شود. به مثال زیر توجه کنید:
char array[7];
int sample[10];
- در خط اول آرایهای از نوع char با نام array1 که دارای ۷ خانه یا عنصر است تعریف شده است.
- در خط دوم آرایهای از نوع int با نام sample که دارای ۱۰ خانه یا عنصر است تعریف شده است.
- تذکر: اندازه یا تعداد خانههای آرایه باید در زمان تعریف آن مشخص گردد
مقدار دهی به عناصر آرایه
دستیابی و مقدار دهی به عناصر آرایهها از طریق عملگر زیرنویس که علامت آن یک زوج کروشه است و در سمت راست اسم آرایه قرار میگیرد، انجام میشود. شماره خانه مورد نظر از آرایه که اندیس آرایه نیز نامیده میشود در داخل زوج کروشه قرار میگیرد. به مثال زیر دقت کنید تا نحوه مقدار دهی به آرایه را درک کنید:
int array[4] = {3, 6, 10, 15};
در آرایهی ۴ عضوی بالا که با نام array مشخص شده است:
- عدد ۳ در [۰]array قرار می گیرد.
- عدد ۶ در [۱]array قرار می گیرد.
- عدد ۱۰ در [۲]array قرار می گیرد.
- عدد ۱۵ در [۳]array قرار می گیرد.
هم چنین به سبک زیر هم می توان آرایه ها را مقدار دهی کرد.
array[0] = 3;
array[1] = 6;
array[2] = 10;
array[3] = 15;
برای فهم بهتر تعریف آرایه به شکل زیر هم دقت کنید:
در این شکل آرایهای یک بعدی از نوع int که دارای ۷ خانه است تعریف شده است. همان طور که مشخص است، اندیس آرایه از ۰ شروع شده و تا ۶ پیش میرود. هم چنین طبق شکل واضح است که در هر خانه از آرایه چه مقداری ذخیره شده است.
سوال: طول [۰]x چند بایت است؟
آرایه های دو بعدی
تا این جا درباره آرایه هایی صبحت شد که یک اندیس داشتند. به بیان دیگر تمام خانههای آنها در یک بعد(سطر) بود. آرایههای دیگری وجود دارند که دو اندیس دارند. خانههای این آرایهها در دو بعد است. دقیقا مانند خانههای یک جدول که در در روزنامه حل می کنید و در دو بعد x و y دارای خانه است.
در نتیجه آرایه دو بعدی، یک ماتریس دارای سطر و ستون است. هر خانه از این ماتریس یک متغیر است و با اندیسهای سطر و ستون مشخص می شود.
قوانین و نحوه معرفی آرایه دو بعدی کاملا مشابه با آرایه معمولی است، با این تفاوت که باید تعداد سطرها و ستونها مشخص شود. برای تعریف یک آرایه دو بعدی به شکل زیر عمل میشود:
<array type> <array name>[<row>][<column>]
به مثال زیر از تعریف آرایه دو بعدی دقت کنید:
int array[2][4];
در این خط یک آرایه دو بعدی از نوع int و با نام array تعریف شده که ۲ سطر و ۴ ستون دارد. در مجموع دارای ۸ خانه است. حال مثال بالا را مقدار دهی اولیه می کنیم :
int array[2][4] = {{1,2,3,4},{5,6,7,8}};
اعداد ۱، ۲، ۳ و ۴ در خانه های ۰ تا ۳ سطر اول و اعداد ۵، ۶، ۷ و ۸ در خانههای ۰ تا ۳ سطر دوم قرار می گیرد.
array[0][0] =1 array[0][1]=2 array[0][2]=3 array[0][3]=4
array[1][0] =5 array[1][1]=6 array[1][2]=7 array[1][3]=8
اعضای آرایه دو بعدی نیز به تنهایی می توانند در محاسبات شرکت کنند.
برای مقدار دهی، خواندن یا آنالیز آرایهها در طول برنامه باید از حلقهها استفاده کرد. برای آشنایی با این بحث حتما مقاله حلقهها در زبان C را مطالعه کنید.
آرایه و اشاره گرها
در این بخش از مقاله آرایه در زبان C ارتباط آرایه و اشاره گر را بررسی میکنیم. همانطور که قبلا نیز گفته شد اشارهگرها یکی از مفاهیم بسیار مهم در زبان C هستند که کاربرد آنها در موارد مختلف باعث سهولت عملیات میشود و گاهی نیز تنها راهحل مسئله استفاده از اشارهگرها است.
آرایه ها و اشاره گرها ارتباط بسیار نزدیکی با هم دارند و هر عملی که از طریق اندیسدهی آرایهها انجام میشود؛ بهوسیلهی اشارهگرها نیز قابل انجام است. مزیتی که استفاده از اشارهگر نسبت به استفاده از اندیس دارد بالا رفتن سرعت عمل است، ولی برای برنامه نویسان مبتدی استفاده از اندیس سادهتر است.
با تعریف یک آرایه تعدادی بایت از حافظه به آن اختصاص داده شده و آدرس شروع این بایتها به نام آرایه نسبت داده میشود که آدرس پایهی آرایه نیز نام دارد. این نام یک ثابت اشارهگر(با متغیر اشاره گر در جلسه اشاره گر آشنا شدید) است به این دلیل که به آن یک آدرس از حافظه نسبت داده شده و ثابت است یعنی اینکه در طول برنامه قابل تغییر دادن نیست.
به مثال زیر دقت کنید:
int key[10];
int *pt, *pr;
Key یک ثابت اشاره کر و pt و pr متغیرهای اشارهگر هستند. در مورد آرایهی key بیان این نکته جالب است که [key[0 & و key هر دو نشاندهندهی آدرس شروع آرایه یا آدرس خانه اول آرایه میباشند.
مثلاً [key[3& آدرس خانه چهارم آرایه است که میتواند به شکل key + 3 نیز نوشته شود. حال میخواهیم آدرس آرایه را به اشارهگرها اختصاص دهیم. هر دو عبارت زیر درست هستند:
Pt = key;
Pr = key + 2;
- در خط یک آدرس خانه اول آرایه key به اشاره گر pt نسبت داده شده است.
- در خط دو آدرس خانه سوم آرایه key به اشاره گر pr نسبت داده شده است.
اما نوشتن دستوری به شکل ;key = pt اشتباه است، چراکه key یک ثابت اشارهگر بوده و مقدار آن قابلتغییر نیست.
دسترسی به آرایه با اشاره گر
زمانی که یک اشارهگر حاوی آدرس یک آرایه است، آن اشارهگر هم مانند نام آرایه قابل آدرسدهی است. برای مثال منظور از عبارتهایی به شکل [key[3 و [pt[3 و [pr[3 خانهی چهارم آرایه است و برای دسترسی به محتوای آرایه میتوان از دستورهایی به شکل (key + 3)* و (pt + 3)* و (pr+1)* استفاده کرد. دقت کنید که چون اشارهگرهای pt و pr به محلهای مختلفی از حافظه اشاره میکنند، برای دسترسی به محتوای خانه چهارم آرایه به آنها مقادیر متفاوتی اضافه شده است.
اکنون کمی به جزئیات این مثال توجه کنیم. فرض کنید که key به خانه شماره ۳۲۰۰ از حافظه اشاره میکند؛ چون هر خانه از این آرایه از نوع این است پس دو بایت را اشغال خواهد کرد. حال آدرس خانه دوم میشود ۳۲۰۲ که بهصورت key+1 یا [key[1 قابلدسترسی است. دقت کنید که در عبارت key+1 یکی به key اضافه کردیم اما در تبدیل آدرس، دو تا به آدرس واقعی key اضافهشده میشود. این به آن دلیل است که کامپایلر میداند key اشاره گری از نوع int است و باید در افزایش هر بار دو واحد (دو بایت که برای یک متغیر int لازم است) به آن اضافه کند.
به مثال مهم زیر دقت کنید:
float *x, *y, *z, total[]={5,10,15,20,25};
int num[10] = {2,4,6,8,10,12,14,16,18,20};
int p, q;
p = num;
q = num + 4;
x = total + 1;
y = &total[0];
++x;
z = x - 1;
z--;
- در خط یک اشاره گرهای x و y و z و آرایه total از نوع floatتعریف شده اند.
- در خط دو آرایه num از نوع int تعریف شده است.
- در خط سه اشاره گرهای p و q از نوع int تعریف شده اند.
- خطوط ۴ تا ۱۰ شامل تخصیص آدرس خانه های این دو آرایه به اشاره گرهای هم نوع خودشان است که با توجه به گویا بودن کد بالا از توضیح آن صرف نظر میشود. اما اگر ابهامی داشتید، در قسمت نظرات مطرح کنید.
سخن آخر
خسته نباشید میکرولرنیهای پر تلاش 🙂
مقاله آرایه در زبان C به انتها رسید. این جلسه ارتباط زیادی با بحث اشاره گرها هم داشت و لازمه تا هر دو موضوع را چندین بار مطالعه کنید. تا به تسلط برسید. جلسه بعدی در مورد نوع خاصی از آرایه یعنی رشتهها صحبت میکنیم. با استفاده از رشتهها دنیای کدنویسی شما خیلی جذاب تر میشه.
اما مثل همیشه برای کسانی که قصد دارند خیلی فراتر از این مقاله با زبان C درگیر بشند و درکارهای واقعی مثل میکروکنترلرها و کارهای نرم افزاری از اون استفاده کنند پیشنهاد میکنم از دوره جامع برنامه نویسی C استفاده کنید. برای دسترسی به دوره روی عکس زیر کلیک کنید.
درباره احسان عبداللهی
مدیر و موسس میکرولرن | برنامه نویسی پاسخی ظریف به یک نیاز در دنیای واقعی هست.
نوشته های بیشتر از احسان عبداللهیمطالب زیر را حتما مطالعه کنید
دوره های آموزشی مرتبط
آموزش جنگو
آموزش پایتون
آموزش الگوریتم و فلوچارت – تفکر برنامه نویسی
آموزش برنامه نویسی C برای میکروکنترلر
آموزش الکترونیک دیجیتال
9 دیدگاه
به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.
سلام چطور میشه مثلا دو آرایه a وb رو به صورت زیر در آرایه cذخیره کرد؟
Unsigned char a[]=x
Unsigned char b[]=y
Unsigned char c[]=x,y
سلام
میتونید از حلقه for کمک بگیرید برای اینکه دو آرایه را به ترتیب در آرایه جدید ذخیره کنید.
اگر خیلی براتون کاربردی هست یک تابع بنویسید که این کار بکنه و بعد از این تابع استفاده کنید.
سلام خسته نباشید، ممنون بابت اطلاعات خوبتون
من دمای بدست اومده توسط سنسور دما lm35 رو درون یک آرایه بدون دادن عددی برای تعداد خانه های اون ارایه ریختم حالا میخوام بدونم مقدار این سنسور در هر لحظه چند خانه از ارایه رو به خودش اختصاص داده؟؟
به عبارتی میخوام تعداد خونه های ارایه رو بدست بیارم ، لطفاً کمکم کنید با چه کدی این کار رو انجام بدم؟؟
سلام
بستگی داره آرایه از چه نوعی باشه. اگه از نوع int باشه یعنی هر خونه ۱۶ بیت داره پس مقدار خوانده شده از lm35 حتما در یک خونه جا میشه.
ممنون از پاسخگوییتون
حالا اگه از ایسی ساعت ds1307 استفاده کنیم و نوع ارایه از نوع char باشه؟؟
من میخوام مقدار خونه های آرایه رو بدست بیارم تا با استفاده از این عدد بدست اومده ساعت رو با ماژول وای فای به یک سرور انتقال بدم ، چون این ماژول از پروتکل یوزارت استفاده میکنه من باید دقیقا بدونم تعداد ارایه ام چندتاست
تعداد خونه های آرایه را که شما در شروع کار تعیین می کنید. منظورتون را دقیق تر بیان کنید.
من تعداد خونه های ارایه رو تعیین نکردم و باز گذاشتم با این حال اگر هم تعیین کنم برای مثال من برای وقتی که ساعت ۱۲:۱۲:۱۲ است ۸ خونه رو اشغال میکنه اما زمانی که ساعت ۲:۴:۱۳ است ۶ خونه اشغال میشه و حالت های دیگه برای همین من میخوام تعداد خونه های پر شده توسط تراشه ds1307 رو بدست بیارم
باید برنامه را ببینم. توی تلگرام میتونید ارسال کنید.از صفحه ارتباط با ما میتونید اقدام کنید.
با سلام
میشه در مورد نمایش ارایه های یک بعدی و دو بعدی در lcd کاراکتری توضیح بفرمایین
با تشکر از اساتید و سایت میکرولرن