انواع داده در زبان C به طورکلی شامل انواع پایه، «شمارش شده» (Enumerated)، «تهی» (Void) و «مشتق شده» (Derived) میشوند. هر کدام از این نوعها خود به زیر مجموعههای مختلفی تقسیم شدهاند که در ادامه به طور کامل توضیح دادهایم. نوع هر متغیر، تعیین میکند که آن متغیر به چه میزان فضا از حافظه را اشغال کرده و مقدار ذخیره شده در آن فضا به چه شکلی باید تفسیر شود. در این مطلب از مجله فرادرس، درباره انواع داده در زبان C صحبت کردهایم.
به عنوان یکی از مفاهیم مرتبط با نوعها میتوان به متغیر اشاره کرد. متغیر به مکان قابل آدرسدهی در حافظه کامپیوتر اشاره میکند که دادهها در آنجا نگهداری میشوند. به هر کدام از این ظرفهای نگهداری دادهها نام مجزایی اختصاص میدهیم که به آن نام، متغیر گفته میشود. با کمک این نامها میتوانیم به سادگی از دادههای درون متغیرها استفاده کنیم. در زبان C برای تعریف متغیر باید نوع قابل پذیرش توسط آن را نیز مشخص کنیم. زبان برنامه نویسی C، جزو زبانهای با نوعدهی ایستا است. یعنی اینکه در زمان تعریف هر متغیر و قبل از استفاده از آن باید نام متغیر را همراه با نوع قابل ذخیرهسازی در متغیر مشخص کنیم. در این مطلب به بررسی انواع مختلف مربوط به زبان C پرداختهایم. زیرا C، زبانی با «نوعدهی قوی» (Strongly Typed) است، به این معنا که اجازه تغییر نوع در متغیرها به صورت خودکار داده نشده است.
انواع داده در زبان C کدام هستند؟
انواع داده در زبان C برای مشخص کردن نوع مقادیری به کار برده میشوند که باید در متغیرها ذخیره شوند. به طور کلی انواع داده در زبان برنامه نویسی C را میتوان به چهار دسته زیر تقسیم کرد.
- «انواع پایه» (Basic Types): این نوعها برای اعداد و محاسبات ریاضی به کار برده میشوند. انواع پایه به دو دسته انواع اعداد صحیح و اعداد با ممیز شناور تقسیم میشوند.
- «انواع شمارش شده» (Enumerated Types): این نوعها هم شامل انواع قابل استفاده در محاسبات ریاضی میشوند. انواع شمارش شده برای مشخص کردن متغیرهایی به کار برده میشوند که فقط میتوانیم مقادیر مشخص از نوع عدد صحیح و مجزا از هم را به آنها اختصاص دهیم.
- «نوع تهی» (The Type Void): استفاده از نوع Void در برنامه نویسی، برای توابع، نشان میهد که هیچ مقداری – در خروجی تابع یا بلوک کد – در دسترس نیست.
- «انواع مشتق شده» (Derived Types): این نوعها شامل نوع «اشارهگر» (Pointer)، نوع آرایه، نوع «ساختار» (Structure)، نوع Union و انواع تابع میشوند.
به انواع آرایه و Structure، «انواع تجمعی» (Aggregate Types) هم گفته میشود. زیرا این نوعها چندین مقدار مختلف را در موجودیت واحدی، جمع میکنند. نوع هر تابع، نوع مقدار برگشتی آن تابع را نشان میدهد. در ادامه این مطلب، «انواع پایه» (Basic Types) را بررسی کردهایم. بعد از آن، باقی نوعها را هم پشت سر هم و یک به یک به ترتیب توضیح دادهایم.
انواع Basic در زبان C
همینطور که اشاره کردیم، انواع Basic در زبان C به دو دسته کلی «اعداد کامل» (Integer) و اعداد با «ممیز شناور» (Floating-Point) تقسیم میشوند.
در این قسمت از مطلب ابتدا اعداد Integer و سپس اعداد Floating-Point را به دقت بررسی کردهایم.
نوع Integer
در فهرست زیر، جزئیات کامل همه دادههای مربوط به اعداد صحیح را در زبان C بیان کردهایم. این جزئیات همراه با اندازه فضای مورد نیاز برای ذخیرهسازی هر داده – در همان نوع مربوط به آن – و محدوده مقادیر قابل نمایش ارائه شدهاند.
- Char: اندازه مورد نیاز برای ذخیرهسازی هر واحد داده با این نوع برابر با ۱ بایت است. دامنه مقادیر قابل نمایش توسط این نوع هم از ۱۲۸- تا ۱۲۷ یا از ۰ تا ۲۵۵ را پوشش میدهد.
- Unsigned Char: اندازه مورد نیاز برای ذخیرهسازی هر واحد داده با این نوع برابر با ۱ بایت است. دامنه مقادیر قابل نمایش توسط این نوع هم از ۰ تا ۲۵۵ را پوشش میدهد.
- Signed Char: اندازه مورد نیاز برای ذخیرهسازی هر واحد داده با این نوع برابر با ۱ بایت است. دامنه مقادیر قابل نمایش توسط این نوع هم از ۱۲۸- تا ۱۲۷ را پوشش میدهد.
- Int: اندازه مورد نیاز برای ذخیرهسازی هر واحد داده با این نوع برابر با ۲ تا ۴ بایت است. دامنه مقادیر قابل نمایش توسط این نوع هم از ۳۲،۷۶۸- تا ۳۲۷۶۷ یا از ۲،۱۴۷،۴۸۳،۶۴۸- تا ۲،۱۴۷،۴۸۳،۶۴۷ را پوشش میدهد.
- Unsigned Int: اندازه مورد نیاز برای ذخیرهسازی هر واحد داده با این نوع برابر با ۲ تا ۴ بایت است. دامنه مقادیر قابل نمایش توسط این نوع هم از ۰ تا ۶۵۵۳۵ یا از ۰ تا ۴،۲۴۹،۹۶۷،۲۹۵ را پوشش میدهد.
- Short: اندازه مورد نیاز برای ذخیرهسازی هر واحد داده با این نوع برابر با ۲ بایت است. دامنه مقادیر قابل نمایش توسط این نوع هم از ۳۲،۷۶۸- تا ۳۲۷۶۷ را پوشش میدهد.
- نوع Unsigned Short: اندازه مورد نیاز برای ذخیرهسازی هر واحد داده با این نوع برابر با ۲ بایت است. دامنه مقادیر قابل نمایش توسط این نوع هم از ۰ تا ۶۵۵۳۵ را پوشش میدهد.
- نوع Long: اندازه مورد نیاز برای ذخیرهسازی هر واحد داده با این نوع برابر با ۸ بایت است. دامنه مقادیر قابل نمایش توسط این نوع هم از ۹۲۲۳۳۷۲۰۳۶۸۵۴۷۷۵۸۰۸- تا ۹۲۲۳۳۷۲۰۳۶۸۵۴۷۷۵۸۰۷ را پوشش میدهد.
- Unsigned Long: اندازه مورد نیاز برای ذخیرهسازی هر واحد داده با این نوع برابر با ۸ بایت است. دامنه مقادیر قابل نمایش توسط این نوع هم از ۰ تا ۱۸۴۴۶۷۴۴۰۷۳۷۰۹۵۵۱۶۱۵ را پوشش میدهد.
در هر سیستم عاملی، برای بدست آوردن اندازه دقیق نوع یا متغیر، میتوانیم از تابع sizeof() زبان C استفاده کنیم. عبارت sizeof(Type) ، در خروجی، اندازه فضای ذخیرهسازی شیء یا نوع مورد نظر را در واحد بایت برمیگرداند.
دو مورد از مشهورترین انواع نام برده شده بالا را – نوع Char و نوع Int – در پایین، توضیح دادهایم.
داده از نوع Char
کاراکترهای مجزا با استفاده از نوع Char نمایش داده میشوند. این نوع به صورت معمول برای استفاده از کاراکترهای رمزگذاری شده ASCII یا UTF-8 مانند حروف الفبا، ارقام، نمادها یا علائم نگارشی به کار برده میشود. ۲۵۶ کاراکتر مختلف وجود دارند که میتوان هر کدام از آنها را با نوع Char نمایش داد. هر واحد داده با نوع Char به اندازه ۱ بایت فضای حافظه را اشغال میکند. برای مثال، کاراکترهایی مانند «’A’» و «’b’» و «’5’» یا «’$’» توسط کوتیشنهای یگانه محصور شدهاند.
داده از نوع Int
دادههای نوع Int ، اعدادی کامل و بدون بخش اعشاری هستند. برای نمایش این نوع از اعداد از نماد و نوع Int استفاده میکنیم. این نوع از اعداد اغلب اوقات برای نشان دادن متغیرهایی مانند شمارندهها، اندیسها یا سایر مقادیر عددی به کار برده میشوند. از آنجا که نوع Int به صورت پیشفرض دارای علامت است، میتواند مقادیر مثبت و منفی را نمایش دهد.
مثالی از Integer
کدی که در زیر نمایش داده شده، مثالی برای نشان دادن اندازه انواع مختلف عدد صحیح در سیستم عامل لینوکس است. این مثال را با استفاده از ثابتهای تعریف شده در فایل هدر limits.h پیادهسازی کردهایم.
بعد از اینکه برنامه بالا را در سیستم عامل لینوکس کامپایل کرده و اجرا کنیم، نتایج زیر تولید شده و در کنسول برنامه نمایش داده میشوند.
CHAR_BIT : 8 CHAR_MAX : 127 CHAR_MIN : -128 INT_MAX : 2147483647 INT_MIN : -2147483648 LONG_MAX : 9223372036854775807 LONG_MIN : -9223372036854775808 SCHAR_MAX : 127 SCHAR_MIN : -128 SHRT_MAX : 32767 SHRT_MIN : -32768 UCHAR_MAX : 255 UINT_MAX : 4294967295 ULONG_MAX : 18446744073709551615 USHRT_MAX : 65535
نوع اعداد با ممیز شناور Floating-Point
در فهرست زیر، تمام جزئیات مربوط به اعداد با ممیز شناور را بیان کردهایم. این جزئیات شامل اندازه فضای ذخیرهسازی برای هر واحد داده با نوع مربوطه، محدوده مقادیر قابل نمایش و میزان دقت واحدهای داده میشوند.
- Float: هر واحد داده از این نوع نیاز به ۴ بایت فضا برای ذخیرهسازی دارد. محدوده مقادیر قابل پذیرش توسط نوع Float برابر با ۱٫۲E-۳۸ تا ۳٫۴E+۳۸ بوده و تا ۶ رقم اعشار را به خوبی و با دقت بالا نمایش میدهد.
- Double: هر واحد داده از این نوع نیاز به ۸ بایت فضا برای ذخیرهسازی دارد. محدوده مقادیر قابل پذیرش توسط نوع Double برابر با ۲٫۳E-۳۰۸ تا ۱٫۷E+۳۰۸ بوده و تا ۱۵ رقم اعشار را به خوبی و با دقت بالا نمایش میدهد.
- Long Double: هر واحد داده از این نوع نیاز به ۱۰ بایت فضا برای ذخیرهسازی دارد. محدوده مقادیر قابل پذیرش توسط نوع Long Double برابر با ۳٫۴E-۴۹۳۲ تا ۱٫۱E+۴۹۳۲ بوده و تا ۱۹ رقم اعشار را به خوبی و با دقت بالا نمایش میدهد.
فایل هدر float.h ، کلاندستورهایی را تعریف میکند که برای استفاده از مقادیر و جزئیات مربوط به روش ذخیرهسازی اعداد حقیقی به برنامه نویس کمک میکنند.
مثالی از اعداد با ممیز شناور
مثالی که در زیر، پیادهسازی شده مقدار فضای ذخیرهسازی مورد استفاده توسط دادههای نوع Float را همراه با مقدار مربوط به محدوده عملیاتی آنها نمایش میدهد.
بعد از کامپایل کردن و اجرای برنامه بالا در سیستم عامل لینوکس، نتایج بدست آمده به شکل زیر در خروجی به کاربر نمایش داده میشوند.
Storage size for float : 4 FLT_MAX : 3.40282e+38 FLT_MIN : 1.17549e-38 -FLT_MAX : -3.40282e+38 -FLT_MIN : -1.17549e-38 DBL_MAX : 1.79769e+308 DBL_MIN : 2.22507e-308 -DBL_MAX : -1.79769e+308 Precision value: 6
توجه: تابع sizeof مقدار size_t را برمیگرداند. نوع عدد صحیح بدون علامت – یعنی مثبت – برابر با size_t است. این مقدار بسته به سیستم عامل میزبان، تغییر میکند. شاید نوع size_t همیشه برابر با «Long Unsigned Int» نباشد. بنابراین بهجای استفاده از %d در قالبدهی به رشتهها از %zu استفاده میکنیم.
نسخههای اولیه زبان C دارای نوع Boolean نبودند. زبان C معرفی شده توسط ANSI با استانداردهای C99، نوع «ـbool» را معرفی کرد. در این نوع عدد صفر برابر با False و مقادیر غیر از صفر برابر با True در نظر گرفته شدند.
آموزش برنامه نویسی با زبان C در فرادرس
زبان برنامه نویسی C، بدون شک یکی از مهمترین زبانهای برنامهنویسی است. این زبان به صورت مستقیم، سهم زیادی از بازار طراحی و تولید نرمافزارها و برنامههای حرفهای را به خود اختصاص داده است. از آنجا که زبان برنامه نویسی C توانایی برقرار کردن ارتباط مستقیم بالایههای سختافزاری کامپیوتر را دارد، از آن در طراحی و مدیریت انواع سیستمهای سختافزاری و سیستم عاملها استفاده میکنند. حتی بسیاری از سایر زبانهای برنامه نویسی نیز با کمک زبان C توسعه داده شدهاند. زبان C معمولا جزو اولین زبانهایی است که در دانشگاهها به دانشجویان تازه وارد آموزش داده میشود.
C در همه جا حضور دارد. تقریباً همه سیستمهای عامل برای رایانهها به زبان C نوشته شدهاند. اغلب گوشیهای هوشمند و تبلتها سیستم عامل مبتنی بر زبان C دارند. C++، Objective C و #C مستقیم بر مبنای C ساخته شدهاند و زبان برنامهنویسی «پایتون» (Python) نیز به وسیله آن نوشته شده است. بنابراین فرادرس به عنوان تولیدکننده فیلمها و مطالب آموزشی و علمی تلاش میکند تا مجموعه آموزش حرفهای را برای این زبان نیز فراهم کند. در نتیجه علاقهمندان به برنامهنویسی میتوانند با کمک فرادرس، زبان C را یاد بگیرند. در پایین چند مورد از فیلمهای آموزشی زبان C را معرفی کردهایم.
داده از نوع مشتق شده در زبان C
به غیر از انواع بنیادین برنامه نویسی، زبان C از «انواع مشتق شده» (Derived Types) شامل Array-ها، Pointer-ها، Structure-ها و Union-ها نیز پشتیبانی میکند. این انواع داده به برنامهنویسان برای کارهایی مانند مدیریت دادههای همگن، دستکاری مستقیم در حافظه کامیپوتر و ساخت ساختارهای داده پیچیده کمک میکنند.
دو مورد از مهمترین و خاصترین انواع مشتق شدهای که شاید به ندرت در سایر زبانها با آنها آشنا شوید انواع Structure و Union هستند. Structure-ها از جمله ابزارهای مهمی هستند که در زبانهای برنامه نویسی پیادهسازی شدهاند و برای تولید برنامههای پیشرفته با کاربردهای مختلف، ضروری هستند. برای اینکه در کار با این دست از انواع داده در زبان C به خوبی مسلط شوید، پیشنهاد میکنیم که فیلم آموزش رایگان ساختار Structure و یونیون Union در برنامه نویسی C را از فرادرس مشاهده کنید. به منظور کمک به مخاطبان مجله، لینک مربوط به فیلم را در پایین نیز قرار دادهایم.
در ادامه تمام موارد معرفی شده در بالا را به ترتیب بررسی کردهایم.
داده از نوع Array
نوع «آرایه» (Array)، نوع مشتق شدهای است که به برنامه نویسان برای ذخیره توالی از عناصر یکسان با اندازه ثابت، کمک میکند. نوع آرایه در زبان برنامه نویسی C مکانیزمی را برای جمعآوری چند مقدار مختلف، با نوع یکسان و تحت نام مشترک فراهم میکند.
برای دسترسی به عناصر آرایه در زبان C از اندیسها استفاده میکنیم. همیشه اندیس اولین عنصر در آرایه برابر با «۰» است. اندازه آرایهها در زمان تعریف، تعیین شده و در طول زمان اجرای برنامه قابل تغییر نیست. عناصر آرایه در حافظه کامیپوتر هم به صورت یکجا و چسبیده بهم ذخیره میشوند.
در کادر پایین، مثالی برای تعریف و استفاده از آرایهها را به زبان C پیادهسازی کردهایم.
بعد از اجرای کد بالا، خروجی زیر تولید شده و به کاربر نمایش داده میشود.
Values in the array: 10 20 30 40 50
داده از نوع Pointer
نوع Pointer، نوع مشتق شدهای است که آدرس مقدارهای انواع مختلف را در حافظه ذخیره میکند. وقتی که «اشارهگر» (Pointer) تعریف میشود، ابتدا دادهای را مشخص میکنیم که Pointer مورد نظر باید به آن اشاره کند. یعنی آدرس آن را در حافظه ذخیره کند. سپس نام متغیر مورد نظر را همراه با علامت ستاره * در ادامه قرار میدهیم.
استفاده از Pointer به برنامه نویسان، دسترسی غیرمستقیم و توانایی اعمال تغییرات در محتوای متغیر مورد را میدهد. زیرا به صورت مستقیم به آدرس حافظهای اشاره میکند که متغیر مورد نظر در آنجا قرار دارد. از اشارهگرها به شکل متداول در مسائلی مانند «اشارهگرهای تابعی» (Function Pointers)، ساختمان داده و «تخصیص حافظه پویا» (Dynamic Memory Allocation) استفاده میشود. این ابزارهای کمک بسیار زیادی به مدیریت حافظه در برنامه نویسی با زبان C میکنند.
در کادر زیر مثالی درباره روش تعریف و استفاده از اشارهگرها در زبان برنامه نویسی C را پیادهسازی کردهایم.
بعد از اجرای کد بالا، خروجی زیر تولید شده و به کاربر نمایش داده میشود.
Value of num: 42
از Pointer-ها برای نگهداری آدرس متغیرها استفاده میشود. هر چند در زبان C متغیرهای مختلفی وجود دارند. برنامه نویسان حرفهای این زبان برای مدیریت هرچه بهتر برنامهها و کدهای خود باید به شکل بسیار خوبی بر روی کار با انواع متغیر در زبان C مسلط شوند. به منظور آشنایی با این متغیرها میتوانید مطلب انواع متغیر در زبان C، به زبان ساده با مثال و کد را از مجله فرادرس مطالعه کنید.
داده از نوع Structure
یکی از انواع داده در زبان C همین نوع Structure است. این نوع زیرمجموعه انواع مشتق شده بوده و در ساخت انواع داده ترکیبی کمک میکند. یعنی اینکه با استفاده از نوع Structure میتوانیم انواع داده مختلف را با هم ترکیب کرده و تحت نام مشترک و به شکل نوع جدیدی به کار ببریم. با استفاده از Structure-ها و از طریق ترکیب متغیرهایی با انواع مختلف، میتوانیم ساختمان داده و نوع منحصر به فرد خودمان را ایجاد کنیم.
- به متغیرهای درون هر «ساختار» (Structure)، عضو یا فیلد میگویند.
- هر نوعی، حتی خود ساختارها هم میتوانند عضوی از ساختار بزرگتری باشند.
- اعضای درون ساختار با استفاده از عملگر نقطه . قابل دسترسی هستند.
در کدهای زیر مثالی از تعریف و استفاده از نوع «ساختار» (Structure) فرضی را نمایش دادهایم.
بعد از اجرای کد بالا، خروجی زیر تولید شده و به کاربر نمایش داده میشود.
Name: John Doe Age: 30 Height: 1.80
نوع Union
نوع Union یکی دیگر از انواع داده در زبان C است که در دسته، دادههای مشتق شده جای میگیرد. این نوع به برنامهنویسان کمک میکند که انواع مختلف را در کنار هم و در آدرس حافظه یکسانی ذخیره کنند. برعکس Structure-ها که هر عضوی فضای جداگانهای در حافظه را به خود اختصاص داده بود، تمام اعضای متعلق به Union یکسان، از فضای حافظه مشترکی استفاده میکنند. هر مقدار در هر لحظه فقط توسط یکی از انواع عضو Union قابل نگهداری است. اگر بخواهیم از انواع مختلفی نگهداری کنیم که در هر لحظه فقط داده مربوط به یکی از آنها به کار برده میشود، استفاده از نوع Union بسیار مفید خواهد بود. مانند نوع Structure، با استفاده از عملگر نقطه . میتوانیم به اعضای هر Union تعریف شده دسترسی داشته باشیم.
در کدهای پایین مثالی از نحوه تعریف و استفاده نوع Union را پیادهسازی کردهایم.
source