| کتابخانه استاندارد سی |
| --- |
| * انواع داده
* طبقه‌بندی کاراکترها
* رشته‌ها
* ریاضیات
* ورودی/خروجی فایل
* تاریخ/زمان
* بومی‌سازی
* اختصاص حافظه
* کنترل روند
* سیگنال‌ها
* نشانه‌های جایگزین

**سرآیندهای متفرقه**:* `<assert.h>`
* `<Errno.h>`
* `<setjmp.h>`
* `<Stdarg.h>`
 |
| * ن
* ب
* و
 |

در زبان برنامه‌نویسی سی، **انواع داده** اشاره به یک سیستم گسترده و وسیع برای اعلان متغیرها از انواع مختلف دارد. خود زبان سی تنها چند نوع داده ساده محاسباتی و قواعدی برای ایجاد آرایه‌ها و داده‌های ترکیبی ارائه می‌دهد. چند فایل هدر در کتابخانه استاندارد سی دربرگیرنده نوع داده‌های بیشتری، با ویژگی‌های بیشتر مانند اندازه دقیق تضمین شده هستند.

انواع اساسی
-----------

زبان سی تعدادی زیادی نوع داده پایه‌ای ارائه می‌دهد. خیلی از این نوع داده‌ها از ترکیب انواع محاسباتی ساده (مانند عدد صحیح، کاراکتری، ممیز شناور) به همراه تعدادی اصلاح‌کننده (short, long, signed, unsigned) تشکیل می‌شوند. تمام این انواع داده در جدول زیر آورده شده‌است:

| نوع | Explanation | نوع | Explanation |
| --- | --- | --- | --- |
| char | کوچک‌ترین واحد قابل آدرس‌دهی در ماشین که می‌تواند دربرگیرنده مجموعه کاراکترهای پایه‌ای باشد. یک نوع عدد صحیح است. بسته به پیاده‌سازی، مقدار واقعی می‌تواند با علامت یا بدون علامت باشد. | signed char | هم اندازه `char`, اما با تضمین علامت‌دار بودن. |
| unsigned char | هم اندازه `char`, اما با تضمین بی‌علامت بودن. |
| shortshort intsigned shortsigned short int | عدد صحیح علامت دار *short*. حداقل ۱۶ بیت حجم دارد. | unsigned shortunsigned short int | مانند `short`, ولی بدون علامت. |
| intsigned int | نوع عدد صحیح علامت‌دار. حداقل ۱۶ بیت حجم دارد. | unsignedunsigned int | مانند `int`, ولی بدون علامت. |
| longlong intsigned longsigned long int | نوع عدد صحیح باعلامت *long*. حداقل ۳۲ بیت حجم دارد. | unsigned longunsigned long int | مانند `long`, اما بدون علامت. |
| long longlong long intsigned long longsigned long long int | نوع عدد صحیح با علامت *long long*. حداقل ۶۴ بیت اندازه دارد. در استاندارد C99 مشخص شده‌است. | unsigned long longunsigned long long int | مانند `long long`, اما بدون علامت. تنها در استاندارد C99 وجود دارد. |
| float | نوع ممیز شناور. |
| double | نوع ممیز شناور با دقت مضاعف. |
| long double | نوع ممیز شناور با دقت بزرگ. |

### نوع بولی

نوع بولی (درست/نادرست) به صورت ‎\_Bool اعلان می‌شود. در فایل هدر stdbool.h هم چند شناسه مفید به عنوان ماکرو برای کار با مقادیر بولی تعریف شده‌است. در این هدر ماکرویی به نام bool از نوع ‎\_Bool تعریف شده‌است. true به عنوان ۱ تعریف شده‌است. false هم به صورت ۰ تعریف شده‌است. به علاوه ‎\_\_bool\_true\_false\_are\_defined هم به صورت ۱ تعریف شده‌است. نوع ‎\_Bool و هدر stdbool.h در استانداردهای ماقبل C99 وجود نداشتند.

### اندازه و انواع مختلف اشاره‌گرها

زبان سی برای نمایش دادن کمیت‌های مرتبط با حافظه از انواع size\_t و ptrdiff\_t استفاده می‌کند. انواع داده موجود غیر کافی دانسته می‌شد، زیرا اندازه آن‌ها بر طبق قابلیت‌های محاسباتی پردازنده مقصد تعریف می‌شد، نه بر اساس قابلیت‌های حافظه، مانند فضای آدرس موجود. هر دو نوع size\_t و ptrdiff\_t در فایل stddef.h تعریف شده‌اند.

size\_t برای نمایش اندازه هر گونه شیئی به کار می‌رود. حتی برای نمایش اندازه آرایه‌ها. از نوع size\_t به عنوان مقدار برگشتی عملگر sizeof استفاده می‌شود. بیشترین مقداری که یک متغیر از نوع size\_t می‌تواند داشته باشد در ماکرویی به نام SIZE\_MAX تعریف شده‌است. این ماکرو در فایل stdint.h تعریف شده‌است. توجه داشته باشید که size\_t یک نوع داده بدون علامت است. برای اندازه‌های علامت‌دار نوع ssize\_t در نظر گرفته شده‌است.

ptrdiff\_t هم برای نمایش تفاوت میان اشاره‌گرها استفاده می‌شود.

ویژگی‌های هر نوع داده
---------------------

اطلاعات مربوط به ویژگی‌های واقعی هر نوع داده به صورت ماکروهایی در فایل‌های limits.h و float.h تعریف شده‌اند. limits.h دربرگیرنده ماکروهایی برای انواع عدد صحیح و float.h دربرگیرنده ماکروهای مربوط به انواع ممیز شناور است. مقادیر واقعی این ماکروها وابسته به پیاده‌سازی است.

### ویژگی‌های انواع عدد صحیح

CHAR\_BIT - اندازه نوع char بر حسب بیت (حداقل ۸ بیت)

SCHAR\_MIN, SHRT\_MIN و INT\_MIN, LONG\_MIN, LLONG\_MIN - کوچکترین مقدار ممکن برای انواع عدد صحیح علامت دار:signed char, signed short, signed int, signed long, signed long long

SCHAR\_MAX, SHRT\_MAX, INT\_MAX, LONG\_MAX, LLONG\_MAX - بیشترین مقدار ممکن برای انواع عدد صحیح علامت‌دار: signed char, signed short, signed int, signed long, signed long long

UCHAR\_MAX, USHRT\_MAX, UINT\_MAX, ULONG\_MAX, ULLONG\_MAX - بیشترین مقدار ممکن برای انواع عدد صحیح بدون علامت

CHAR\_MIN کوچکترین مقدار ممکن برای نوع char

CHAR\_MAX - بیشترین مقدار ممکن برای نوع char

MB\_LEN\_MAX – بیشترین تعداد بایتها در یک کاراکتر چندبایتی

ساختارها
--------

ساختار یک نوع داده ترکیبی است. ساختارها روشی برای ذخیره کردن چندین قلم داده در یک نوع متغیر هستند. برای مثال فرض کنید ما می‌خواهیم نام و تاریخ تولد یک شخص را در یک متغیر به صورت رشته ذخیره کنیم. برای ذخیره آن اطلاعات می‌توانیم از یک ساختار به شکل زیر استفاده کنیم:

```
struct birthday
{
 char name[20];
 int day;
 int month;
 int year;
};

```

ساختارها می‌توانند دربرگیرنده اشاره‌گری به یک ساختار از نوع خودشان باشند. اینگونه ساختارها در طراحی لیست‌های پیوندی بسیار متداول هستند. همچنین هر ساختار می‌تواند دربرگیرنده ساختاری از نوع دیگر باشد.

آرایه
-----

برای هر نوع *T*، به جز نوع void و تابع، یک نوع داده به شکل «آرایه‌ای متشکل از *N* عنصر از نوع *T*» وجود دارد. یک آرایه مجموعه‌ای از مقادیر است که همه این مقادیر از یک نوع هستند و به صورت پشت سر هم در حافظه ذخیره شده‌اند. آرایه‌ای با اندازه N، دارای اندیس‌هایی با شماره 0 تا N-1 است.

هم چنین آرایه‌هایی هم وجود دارد که تعداد عناصر آن‌ها برای کامپایلر نامعلوم است. به عنوان مثال:

```
int cat[10]; // array of 10 elements, each of type int
int bob[]; // array of an unspecified number of 'int' elements.

```

می‌توان آرایه‌ها را در زمان اعلان مقداردهی هم کرد. برای ارسال یک آرایه به یک تابع، می‌توان اشاره‌گری به اولین عنصر آرایه را به تابع ارسال کرد. می‌توانند چند بعدی هم باشند.

```
int a[10][8]; // array of 10 elements, each of type 'array of 8 int elements'
float f[][32]; // array of unspecified number of 'array of 32 float elements'

```

اشاره‌گرها
----------

برای هر نوع *T*، «اشاره‌گری از نوع *T* وجود دارد»

اشاره گر متغیری است که آدرس یک شی دیگر را نگه میدارد. آن‌ها مانند متغیرهای معمولی اعلان می‌شوند با این تفاوت که قبل از نام آن‌ها باید کاراکتر \* قرار گیرد. مثل:

```
char \*square;
long \*circle;

```

اشاره‌گرها می‌توانند چند سطحی باشند. می‌توان اشاره‌گری به یک اشاره‌گر دیگر تعریف کرد. مثلاً int\*\*‎ اشاره‌گری به نوع int\*‎ است. همچنین «اشاره‌گر به آرایه» هم وجود دارد. اما آن‌ها نسبت به «آرایه‌ای از اشاره‌گرها» کمتر رایج هستند.

```
char \*pc[10]; // array of 10 elements of 'pointer to char'
char (\*pa)[10]; // pointer to a 10-element array of char

```

منابع
-----

مشارکت‌کنندگان ویکی‌پدیا. «C data types». در *دانشنامهٔ ویکی‌پدیای انگلیسی*، بازبینی‌شده در ۲۳ ژوئیه ۲۰۱۳.