أنواع البيانات في سي

أنواع البيانات في لغة سي تكون أنواع البيانات عبارة عن إعلانات لعنواين الذاكرة، أو المتغيرات،  التي تحدد خصائص البيانات التي يمكن تخزينها وأساليب (العمليات) للمعالجة المسموح بها.
توفر لغة C أنواع حسابية أساسية، مثل أنواع الأعداد الصحيحة، والأعداد الرقمية ، وبناء جمل اللغة لبناء أنواع المصفوفات والمركبات . يوجد العديد من الرؤوس (ترويسة (حوسبة)) في مكتبة سي المعيارية التي تحتوي على تعريفات للأنواع المدعومة ، التي لها خصائص إضافية ، مثل توفير مساحة تخزين ذات حجم دقيق ، مستقلة عن التنفيذ.

نوع القيم المنطقية (Boolean)

أضاف الC99 نوع Bool وهو عبارة عن ال ( صحيح / خطأ ) boolean . بالإضافة إلى ذلك ، يعرّف العنوان الجديد <stdbool.h>  ال Bool كاسم مستعار مناسب لهذا النوع كما يوفر وحدات الماكرو لـ true و false. وظائف ال Bool مماثلة لنوع متكامل عادي ، مع استثناء واحد: يتم تخزين أي بيان إلى _Bool التي ليست 0 (خطأ) ك 1 (صحيح). يوجد هذا السلوك لتجنب طفح عدد صحيح (integer overflows)  في تضييق التحويلات الضمنية. على سبيل المثال ، في التعليمة البرمجية (code) التالية:
unsigned char b = 256;if (b) {
   /* do something */}
قيمة الb  ستساوي صفر/خطأ (false) في حالة أن يكونunsigned char في نطاق ال8بت .. ويرجع السبب في ذلك إلى عدم احتواء نوع البيان ال 256  ، مما يؤدي إلى استخدام 8 بتات أقل منه ، مما ينتج عنه قيمة صفرية. ومع ذلك ، يؤدي تغيير نوع التعليمات البرمجية (code) السابقة إلى التصرف بشكل طبيعي
_Bool b = 256;if (b) {
   /* do something */}

حجم ومؤشر الانواع المختلفة

مواصفات لغة الC بالأضافة الي typedefs ( كلمة تستخدم لتكون اسم مستعار لنوع بيان جديد )  size_t وptrdiff_t لتمثيل الكميات المتعلقة بالذاكرة. يتم تعريف حجمها وفقا للقدرات الحسابية لمعالج الهدف لا قدرات الذاكرة ، مثل مساحة العنوان المتوفرة. كل من هذه الأنواع محددة في العنوان <stddef.h> ( في السي++ cstddef ) .
size_t  هو نوع صحيح غير موقعة يستخدم لتمثيل حجم أي كائن (بما في ذلك المصفوفات) في تنفيذ معين .  sizeof المشغل ينتج قيمة من نوع size_t  . الحجم الأكبر لsize_t  بنتج من خلال  SIZE_MAX
ثابت المايكرو الذي تم تعريفه في العنوان <stdint.h> .
size_t يضمن أن يكون علي الأقل علي نطاق 16 بايت . بالأضافة POSIX يحتوي ssize_t، وهو نوع متكامل موقّع بنفس عرضه ك  size_t.
ptrdiff_t نوع متكامل موقَّع يُستخدم لتمثيل الفرق بين المؤشرات . فقط يضمن أن تكون صالحة ضد المؤشرات التي من نفس النوع . مسح المؤشرات التي تتكون من أنواع مختلفة هو تعريف التنفيذ.

الهياكل ( Structures )

تعطي الهياكل ميزة تخزين البيانات المتعددة. مختلفة في نوع البيان. في مخزن في الذاكرة يدل علي متغير واحد ، المثال التالي يوضح هيكل معين اسم نوع البيان struct birthday الذي يحتوي علي اسم الشخص ويوم ميلاده الذي يتكون من حروف وأرقام . يتم تعريف الهيكل ويليه تعريف المتغيرات والبيانات بداخلها. 
struct birthday {
    char name[20];
    int day;
    int month;
    int year;};struct birthday John;
تخطيط الذاكرة للهيكل هو مشكلة في تنفيذ اللغة لكل نظام أساسي ، مع بعض القيود . عنوان الذاكرة لأول عنصر في الهيكل يجب أن يكون هو عنوان الهيكل نفسه، يمكن تهيئة الهياكل أو تعيينها لاستخدام القيم الحرفية المركبة  compound literals، الدالة يمكن أن تعود بهيكل. على الرغم من أن هذا غير فعال في كثير من الأحيان في وقت التشغيل. منذ C99 ، قد ينتهي الهيكل أيضًا بعنصر من المصفوفة المرنة.
struct node {
int val;
struct node *next;};

المصفوفة ( array )

لكل نوع T ، باستثناء أنواعا الدوال وال void ، توجد أنواع "مصفوفة عناصر N من النوع T". المصفوفة هي مجموعة من القيم ، جميعها من نفس النوع ، مخزنة بشكل متقارب في الذاكرة. يتم فهرسة (ترقيم) مصفوفة الحجم N بواسطة الأعداد الصحيحة من 0 حتى وتضم N-1. هناك أيضًا "مصفوفات ذات حجم غير محدد" ( vector )  حيث لا يعرف عدد العناصر بواسطة المبرمج أو المنفذ ( compiler ) . هنا مثال موجز:
int cat[10];  // array of 10 elements، each of type intint bob[];    // array of an unspecified number of 'int' elements
يمكن تهيئة المصفوفات باستخدام مُهيئ مركب ، ولكن لا يتم تعيينها. يتم تمرير المصفوفات إلى دوال function بتمرير مؤشر pointer  إلى العنصر الأول. يتم تعريف المصفوفات متعددة الأبعاد على أنها "مصفوفه من المصفوفات ..." ، ويجب أن يكون لجميع الأبعاد حجم ثابت وقت التجميع فيما عدا البعد الخارجي:
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'

المؤشر ( pointer )

كل نوع من البيانات T له مؤشر مناظر من نوع T . المؤشر هو نوع من أنواع البيانات ولكن يحتوي على عنوان موقع تخزين لمتغير من نوع معين . يتم اعلانه عن طريق وضع علامة النجمة (*) بعد نوع التخزين الأساسي وقبل اسم المتغير. المساحة قبل أو بعد علامة النجمة تكون اختيارية.
char * square;long* circle;int *oval;
قد يتم أيضًا الإعلان عن المؤشرات لأنواع بيانات المؤشر ، وبالتالي إنشاء عدة مؤشرات غير مباشرة ، مثل char ** و int *** ، بما في ذلك المؤشرات إلى المصفوفات . هذه الأخيرة أقل شيوعًا من مجموعة من المؤشرات ، وقد يكون انشائها مربكًا:
char *pc[10]; // array of 10 elements of 'pointer to char'char (*pa)[10]; // pointer to a 10-element array of char
يستهلك الكمبيوتر الشخصي عشرة أجزاء من الذاكرة من حجم المؤشر char (عادة 40 أو 80 بايت على الأنظمة الأساسية الشائعة) ، ولكن عنصر pa هو مؤشر واحد فقط -  حجم الpa عادة 4 أو 8 - والبيانات التي تشير إليها هي مجموعة من عشرة بايت (sizeof * سنويا = 10).

اتحادات ( Unions )

ال "union" هو بناء خاص يسمح بالوصول إلى مكان الذاكرة نفسه باستخدام خيار الأختلاف في نوع الوصف. على سبيل المثال ، قد يتم التصريح عن اتحاد (union) أنواع البيانات للسماح بقراءة نفس البيانات إما integer أو float أو أي نوع آخر تم التصريح به من قبل المستخدم:
union {
    int i;
    float f;
    struct {
        unsigned int u;
        double d;
    } s;} u;
قرأه عنصر من union ليست هي نفسها مثل الصب فيه حيث أن قيمة العضو لا يتم تحويلها ، بل يتم قراءتها فقط

مؤشرات الدالة (Function pointers)

مؤشرات الدالة تسمح بعودة الدالة بتوقيع معين. علي سبيل المثال: تخزين عنوان معيار الدالة  abs في متغير my_int_f:
int (*my_int_f)(int) = &abs;// the & operator can be omitted، but makes clear that the "address of" abs is used here