ورقة C المرجعية
آخر تحديث
Hello World وبنية البرنامج
كل برنامج C يبدأ من main ويُرجع int.
| العنصر | الكود |
|---|---|
| تضمين ترويسة | #include <stdio.h> |
| نقطة الدخول | int main(void) { ... } |
| مع وسائط سطر الأوامر | int main(int argc, char *argv[]) { ... } |
| طباعة سطر | printf("Hello, World!\n"); |
| إرجاع النجاح | return 0; |
| تعليق على سطر واحد | // comment |
| تعليق كتلة | /* comment */ |
أنواع البيانات
الأحجام تعتمد على المنصة؛ والحدود الدنيا أدناه يضمنها المعيار.
| النوع | الوصف |
|---|---|
int | عدد صحيح، 16 بت على الأقل (عادةً 32) |
unsigned int | عدد صحيح غير سالب |
long / long long | أعداد صحيحة أوسع (32 / 64 بت على الأقل) |
float / double | نقطة عائمة بدقة فردية / مزدوجة |
char | بايت واحد، يُستخدم أيضًا للأحرف |
_Bool (bool عبر <stdbool.h>) | true أو false |
size_t | نوع غير مُشار للأحجام والفهارس |
void | بلا نوع - يُستخدم للدوال والمؤشرات العامة |
محدّدات تنسيق printf و scanf
نواب مكان تطابق نوع كل وسيط.
| المحدّد | ما يطابقه |
|---|---|
%d / %i | int بإشارة |
%u | int بلا إشارة |
%ld / %lld | long / long long |
%f | double (و float في printf) |
%.2f | double بمنزلتين عشريتين |
%c | char واحد |
%s | سلسلة نصية (char *) |
%p | عنوان مؤشر |
%x | int بلا إشارة بالنظام الست عشري |
%zu | size_t |
العوامل
| العامل | المعنى |
|---|---|
+ - * / % | حسابي (% هو باقي القسمة الصحيحة) |
== != | يساوي / لا يساوي |
< > <= >= | المقارنة |
&& || ! | منطقي: و / أو / نفي |
& | ^ ~ << >> | ثنائي: and و or و xor و not والإزاحات |
++ -- | الزيادة / النقصان |
+= -= *= /= | إسناد مركّب |
cond ? a : b | شرطي ثلاثي |
sizeof(x) | حجم نوع أو متغير بالبايت |
التحكم في التدفق
| العبارة | الصياغة |
|---|---|
| If / else | if (x > 0) { ... } else { ... } |
| Else if | else if (x == 0) { ... } |
| Switch | switch (n) { case 1: ...; break; default: ...; } |
| حلقة while | while (i < n) { ... } |
| حلقة do-while | do { ... } while (i < n); |
| حلقة for | for (int i = 0; i < n; i++) { ... } |
| Break / continue | break; تخرج من حلقة، و continue; تتخطّى إلى التكرار التالي |
| Goto (نادر) | goto label; ... label: |
الدوال
عرّفها قبل الاستخدام، أو أضِف نموذجًا أوليًا (prototype) في أعلى الملف.
| العملية | الصياغة |
|---|---|
| تعريف دالة | int add(int a, int b) { return a + b; } |
| نموذج أولي (تصريح) | int add(int a, int b); |
| دون قيمة إرجاع | void greet(void) { ... } |
| دون معاملات | int rand_seed(void) { ... } |
| التمرير بمؤشر (التعديل) | void inc(int *p) { (*p)++; } |
| تمرير مصفوفة | int sum(int arr[], int n) { ... } |
| ساكن (محلي للملف) | static int helper(void) { ... } |
المؤشرات والذاكرة
المؤشر يحمل عنوانًا. ويجب تحرير ذاكرة الكومة (heap) يدويًا.
| العملية | الصياغة |
|---|---|
| تعريف مؤشر | int *p; |
| عنوان-كذا (address-of) | p = &x; |
| التفكيك (قراءة/كتابة) | int y = *p; / *p = 10; |
| مؤشر فارغ (null) | int *p = NULL; |
| التخصيص على الكومة | int *a = malloc(n * sizeof(int)); |
| التخصيص + التصفير | int *a = calloc(n, sizeof(int)); |
| تغيير حجم التخصيص | a = realloc(a, newSize); |
| تحرير ذاكرة الكومة | free(a); |
| حساب المؤشرات | *(a + i) مثل a[i] تمامًا |
المصفوفات والسلاسل النصية
السلاسل النصية في C هي مصفوفات char تنتهي بـ \0.
| العملية | الصياغة |
|---|---|
| تعريف مصفوفة | int nums[5]; |
| تهيئة مصفوفة | int nums[] = {1, 2, 3}; |
| الوصول إلى عنصر | nums[0] = 10; |
| طول المصفوفة (مصفوفات المكدّس) | sizeof(nums) / sizeof(nums[0]) |
| سلسلة نصية حرفية | char s[] = "hello"; |
| طول السلسلة النصية | strlen(s) (لا يشمل \0) |
| نسخ سلسلة نصية | strcpy(dst, src); |
| مقارنة السلاسل النصية | strcmp(a, b) == 0 يعني متساويتان |
| دمج السلاسل النصية | strcat(dst, src); |
البُنى والمكتبة القياسية الشائعة
| العملية | الصياغة |
|---|---|
| تعريف بنية (struct) | struct Point { int x; int y; }; |
| التعريف والوصول | struct Point p; p.x = 1; |
| الوصول عبر مؤشر | p->x = 1; (مثل (*p).x) |
| اسم نوع مستعار | typedef struct Point Point; |
| قراءة الإدخال | scanf("%d", &n); |
| تحويل سلسلة نصية إلى int | int n = atoi("42"); |
| القيمة المطلقة / الأس | abs(x) (int)، و pow(x, y) من <math.h> |
| ترتيب مصفوفة | qsort(arr, n, sizeof(int), cmp); |
صياغة C ومحدّدات التنسيق وأنماط المؤشرات التي تستخدمها أكثر من غيرها، على صفحة واحدة. ورقة C المرجعية هذه هي مرجع سريع لكتابة C - أنواع البيانات، ومحدّدات printf/scanf، والعوامل، والتحكم في التدفق، وعمليات المؤشرات والذاكرة التي تربك الكثيرين.
كل ما هنا هو C قياسية (C99/C11) ويُترجم بـ gcc أو clang. انسخ ما تحتاجه، أو جرّب أيّ مقطع برمجي مباشرة في playground الخاص بـ C - دون الحاجة إلى تثبيت أي مترجم.
الأسئلة الشائعة حول ورقة C المرجعية
هل ورقة C المرجعية هذه مجانية؟
ما الفرق بين المكدّس (stack) والكومة (heap) في C؟
malloc أو calloc، وتبقى حتى تستدعي free، وتُستخدم عندما تحتاج إلى ذاكرة تعيش أطول من الدالة الحالية أو يُعرف حجمها وقت التشغيل فقط. ونسيان free لذاكرة الكومة يسبّب تسرّب ذاكرة.لماذا تحتاج scanf إلى علامة العطف (&) بينما لا تحتاجها printf؟
scanf القيمة في متغيرك، لذا تحتاج إلى عنوان المتغير - وهذا ما يمنحها إياه &x. أمّا printf فتقرأ القيمة فقط، لذا تمرّر القيمة نفسها. والاستثناء هو السلاسل النصية: مصفوفة char تتحلّل بالفعل إلى مؤشر، لذا تمرّر scanf("%s", name) دون &.