English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
في هذا الدليل، ستتعلم عن الإشارات. ما هو الإشارة وكيفية استخدامها وأي أخطاء شائعة قد تجد نفسك تواجهها عند استخدامها في أمثلة.
المرادفات هي ميزة قوية في لغات البرمجة 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
ملاحظة:قد تحصل على عنوان آخر عند تشغيل الكود أعلاه.
المعادلة (متغير المعادلة) هي متغير خاص يستخدم لتخزين العناوين وليس القيم.
هذه هي الطريقة التي نعلن بها المؤشرات.
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
استخدام البرنامج
int *pc, c;
في هذا يتم إنشاء مؤشر pc ومتغير عادي c، كلاهما من النوع int. لأن pc و c لم يتم تخصيصهما في البداية، فإن مؤشر pc يشير إلى عنوان لا يوجد فيه عنوان أو عنوان عشوائي. المتغير c يحتوي على عنوان، لكنه يحتوي على قيمة رمادية عشوائية.
c = 22;
هذا يعني تخصيص 22 لفئة المتغير c، أي أن 22 يتم تخزينه في ذاكرة المتغير c.
pc = &c;
سيتم تخصيص عنوان المتغير c لمؤشر pc.
c = 11;
سيتم تخصيص 11 لفئة المتغير c.
*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;
الآن تعرفت ما هو المرجع، وسوف تتعلم في الدرس التالي علاقة المرجع والعدد.