English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

دليل تعليمي أساسي لغة C

تحكم العملية في لغة C

الوظائف في لغة C

العدد في لغة C

المراجع في لغة C

السلاسل في لغة C

مبادئ التركيز في لغة C

ملفات لغة C

C أخرى

دليل مرجع لغة C

المراجع في لغة C

في هذا الدليل، ستتعلم عن الإشارات. ما هو الإشارة وكيفية استخدامها وأي أخطاء شائعة قد تجد نفسك تواجهها عند استخدامها في أمثلة.

المرادفات هي ميزة قوية في لغات البرمجة C وC++، قبل تعلم المرادفات، دعونا نتعرف على العناوين في برمجة C.

عناوين لغة C

إذا كان هناك متغير var في البرنامج، فإن &var ستحصل على عنوانه في الذاكرة.

تم استخدام العناوين مرارًا وتكرارًا عند استخدام دالة scanf().

scanf("%d", &var);

في هذا المثال، يتم تخزين القيمة المدخلة من المستخدم في عنوان المتغير var. لنأخذ مثالاً عمليًا.

#include <stdio.h>
int main()
{
  int var = 5;
  printf("var: %d\n", var);
  // ملاحظة: استخدم & قبل var
  printf("address of var: %p", &var);  
  return 0;
}

نتيجة الإخراج

var: 5 
عنوان var: 2686778

ملاحظة:قد تحصل على عنوان آخر عند تشغيل الكود أعلاه.

المراجع في لغة C

المعادلة (متغير المعادلة) هي متغير خاص يستخدم لتخزين العناوين وليس القيم.

نحو المعادلة

هذه هي الطريقة التي نعلن بها المؤشرات.

int* p;

في هذا المثال، تم إعلان مؤشر نوع int p.

يمكنك أيضًا إعلان المؤشرات بالطريقة التالية.

int * p1;
int * p2;

لنأخذ مثالاً آخر لإعلان مؤشر.

int* p1, p2;

في هذا المثال، تم إعلان مؤشر p1 ومتغير عادي p2.

تخصيص عنوان للمؤشر

لنأخذ مثالاً.

int *pc, c;
c = 5;
pc = &c;

في هذا المثال، تم تخصيص 5 إلى متغير c. وتم تخصيص عنوان c إلى مؤشر pc.

الحصول على القيمة التي يشير إليها المعادلة

للحصول على قيمة المحتوى الذي يشير إليه المعادلة، نستخدم عملاً التشغيل بالاشارة ( * ). مثلاً:

int *pc, c;
c = 5;
pc = &c;
printf("%d", *pc); // خروج: 5

في هذا المثال، تم تخصيص عنوان c إلى مؤشر pc. لاستخراج القيمة المخزنة في هذا العنوان، استخدمنا *pc.

تغيير القيمة التي يشير إليها المعادلة

لنأخذ مثالاً.

int *pc, c;
c = 5;
pc = &c;
c = 1;
printf("%d", c); // خروج: 1
printf("%d", *pc); // خروج: 1

لقد قمنا بتخصيص عنوان c إلى مؤشر pc.

ثم، نغير قيمة c إلى 1. لأن عنوان pc وc نفسه، لذا *pc يحصل على 1.

لنأخذ مثالاً آخر.

int *pc, c;
c = 5;
pc = &c;
*pc = 1;
printf("%d", *pc); // خروج: 1
printf("%d", c); // خروج: 1

لقد قمنا بتخصيص عنوان c إلى مؤشر pc.

ثم، نغير قيمة *pc إلى 1. لأن عنوان pc وc نفسه، لذا c يساوي 1.

لنأخذ مثالاً آخر.

int* pc, c, d;
c = 5;
d = -15;
pc = &c; printf("%d", *pc); // خروج: 5
pc = &d; printf("%d", *pc); // خروج: -15

في البداية، يتم تخصيص عنوان c لتقديم المؤشر pc = &c;. لأن c هو 5، لذا يقدم لنا *pc 5.

ثم، يتم تخصيص عنوان d لتقديم المؤشر pc = &d;. لأن d هو -15، لذا يقدم لنا *pc -15.

مثال: كيف يعمل المؤشر

لنأخذ مثالاً عملياً.

#include <stdio.h>
int main()
{
   int *pc, c;
   
   c = 22;
   printf("عنوان c: %p\n", &c);
   printf("قيمة c: %d\n\n", c); // 22
   
   pc = &c;
   printf("عنوان مؤشر pc: %p\n", pc);
   printf("محتوى مؤشر pc: %d\n\n", *pc); // 22
   
   c = 11;
   printf("عنوان مؤشر pc: %p\n", pc);
   printf("محتوى مؤشر pc: %d\n\n", *pc); // 11
   
   *pc = 2;
   printf("عنوان c: %p\n", &c);
   printf("قيمة c: %d\n\n", c); // 2
   return 0;
}

نتيجة الإخراج

عنوان c: 003FFBF8
قيمة c: 22
عنوان مؤشر pc: 003FFBF8
محتوى مؤشر pc: 22
عنوان مؤشر pc: 003FFBF8
محتوى مؤشر pc: 11
عنوان c: 003FFBF8
قيمة c: 2

استخدام البرنامج

  1. int *pc, c;

    في هذا يتم إنشاء مؤشر pc ومتغير عادي c، كلاهما من النوع int. لأن pc و c لم يتم تخصيصهما في البداية، فإن مؤشر pc يشير إلى عنوان لا يوجد فيه عنوان أو عنوان عشوائي. المتغير c يحتوي على عنوان، لكنه يحتوي على قيمة رمادية عشوائية.  

  2. c = 22;

    هذا يعني تخصيص 22 لفئة المتغير c، أي أن 22 يتم تخزينه في ذاكرة المتغير c.
     

  3. pc = &c;

    سيتم تخصيص عنوان المتغير c لمؤشر pc.
     

  4. c = 11;

    سيتم تخصيص 11 لفئة المتغير c.
     

  5. *pc = 2;

    سيقوم هذا بتغيير قيمة الموقع الذي يشير إليه المؤشر pc إلى 2.

ال أخطاء الشائعة عند استخدام المؤشرات

افترض أنك ترغب في أن يشير المؤشر pc إلى عنوان c. ثم،

int c, *pc;
//pc هو عنوان، لكن c ليس كذلك
pc = c; // خطأ
//&c هو عنوان، لكن *pc ليس كذلك
*pc = &c; // خطأ
//&c و pc هما العناوين
pc = &c;
//قيمة c و *pc
*pc = c;

هذا مثال شائع يجد فيه محدثو جملة النصوص البسيطة حيرة.

#include <stdio.h>
int main() {
   int c = 5;
   int *p = &c;
   printf("%d", *p); // 5
   return 0; 
}

لماذا لم يظهر خطأ عند الاستخدام int *p = &c;؟

هذا هو السبب

int *p = &c;

يساوي

int *p:
p = &c;

في هذين الحالتين، قمنا بإنشاء مرجع p (ليس *p) وأعطينا له قيمة &c.

لتفادي هذا الارتباك، يمكننا استخدام الجملة التالية:

int* p = &c;

الآن تعرفت ما هو المرجع، وسوف تتعلم في الدرس التالي علاقة المرجع والعدد.