C++ المؤشرات مع الأمثلة
ما هي المؤشرات؟
In C++يشير المؤشر إلى متغير يحمل عنوان متغير آخر. مثل المتغيرات العادية، تحتوي المؤشرات على نوع بيانات. على سبيل المثال، يمكن لمؤشر من النوع عدد صحيح أن يحمل عنوان متغير من النوع عدد صحيح. يمكن لمؤشر نوع الحرف أن يحمل عنوان متغير نوع الحرف.
يجب أن ترى المؤشر كتمثيل رمزي لعنوان الذاكرة. باستخدام المؤشرات، يمكن للبرامج محاكاة الاستدعاء حسب المرجع. يمكنهم أيضًا إنشاء ومعالجة هياكل البيانات الديناميكية. في C++يشير متغير المؤشر إلى متغير يشير إلى عنوان محدد في الذاكرة يشير إليه متغير آخر.
العناوين في C++
لفهم C++ المؤشرات، يجب أن تفهم كيف تقوم أجهزة الكمبيوتر بتخزين البيانات.
عندما تقوم بإنشاء متغير في الخاص بك C++ البرنامج، يتم تخصيص بعض المساحة في ذاكرة الكمبيوتر. يتم تخزين قيمة هذا المتغير في الموقع المخصص.
لمعرفة الموقع في ذاكرة الكمبيوتر حيث يتم تخزين البيانات، C++ يوفر & عامل (مرجع). يقوم هذا العامل بإرجاع العنوان الذي يشغله المتغير.
على سبيل المثال، إذا كان x متغيرًا، فسيُرجع &x عنوان المتغير.
بناء جملة إعلان المؤشر
إعلان C++ يأخذ بناء الجملة التالي:
datatype *variable_name;
- نوع البيانات هو النوع الأساسي للمؤشر الذي يجب أن يكون صالحًا C++ نوع البيانات.
- يجب أن يكون اسم المتغير هو اسم متغير المؤشر.
- إن علامة النجمة المستخدمة أعلاه لإعلان المؤشر تشبه علامة النجمة المستخدمة لإجراء عملية الضرب. إنها علامة النجمة التي تميز المتغير كمؤشر.
فيما يلي مثال لإعلانات المؤشر الصالحة في C++:
int *x; // a pointer to integer double *x; // a pointer to double float *x; // a pointer to float char *ch // a pointer to a character
عامل المرجع (&) وعامل التأخير (*)
يقوم عامل المرجع (&) بإرجاع عنوان المتغير.
يساعدنا عامل إلغاء المرجع (*) في الحصول على القيمة المخزنة في عنوان الذاكرة.
فمثلا:
إذا كان لدينا متغير اسمه num، فسيتم تخزينه في العنوان 0x234 وتخزين القيمة 28.
سوف يقوم عامل المرجع (&) بإرجاع 0x234.
سوف يقوم عامل إلغاء المرجع (*) بإرجاع القيمة 5.
مثال 1:
#include <iostream>
using namespace std;
int main() {
int x = 27;
int *ip;
ip = &x;
cout << "Value of x is : ";
cout << x << endl;
cout << "Value of ip is : ";
cout << ip<< endl;
cout << "Value of *ip is : ";
cout << *ip << endl;
return 0;
}
الإخراج:
كيف يعمل هذا:
فيما يلي لقطة شاشة للكود:
شرح الكود:
- قم باستيراد ملف رأس iostream. سيسمح لنا ذلك باستخدام الوظائف المحددة في ملف الرأس دون حدوث أخطاء.
- قم بتضمين مساحة الاسم std لاستخدام فئاتها دون استدعائها.
- استدعاء الدالة الرئيسية (). يجب إضافة منطق البرنامج داخل نص هذه الوظيفة. يمثل { بداية نص الوظيفة.
- قم بتعريف متغير صحيح x وتخصيص قيمة له بـ 27.
- قم بتعريف متغير المؤشر *ip.
- قم بتخزين عنوان المتغير x في متغير المؤشر.
- طباعة بعض النص على وحدة التحكم.
- اطبع قيمة المتغير x على الشاشة.
- طباعة بعض النص على وحدة التحكم.
- اطبع عنوان المتغير x. تم تخزين قيمة العنوان في المتغير ip.
- طباعة بعض النص على وحدة التحكم.
- طباعة القيمة المخزنة على عنوان المؤشر.
- يجب أن يقوم البرنامج بإرجاع القيمة عند التنفيذ الناجح.
- نهاية نص الدالة main().
المؤشرات والمصفوفات
تعمل المصفوفات والمؤشرات بناءً على مفهوم ذي صلة. هناك أشياء مختلفة يجب ملاحظتها عند العمل مع المصفوفات التي تحتوي على مؤشرات. يشير اسم المصفوفة نفسه إلى العنوان الأساسي للمصفوفة. هذا يعني أنه لتعيين عنوان مصفوفة لمؤشر، يجب عدم استخدام علامة العطف (&).
فمثلا:
p = arr;
ما ورد أعلاه صحيح لأن arr يمثل عنوان المصفوفات. هنا مثال آخر:
p = &arr;
ما ورد أعلاه غير صحيح.
يمكننا ضمنيًا تحويل المصفوفة إلى مؤشر. على سبيل المثال:
int arr [20]; int * ip;
فيما يلي عملية صالحة:
ip = arr;
بعد الإعلان أعلاه، سيكون ip وarr متكافئين، وسيتشاركان في الخصائص. ومع ذلك، يمكن تعيين عنوان مختلف لـ ip، لكن لا يمكننا تعيين أي شيء للوصول إليه.
مثال 2:
يوضح هذا المثال كيفية اجتياز مصفوفة باستخدام المؤشرات:
#include <iostream>
using namespace std;
int main() {
int *ip;
int arr[] = { 10, 34, 13, 76, 5, 46 };
ip = arr;
for (int x = 0; x < 6; x++) {
cout << *ip << endl;
ip++;
}
return 0;
}
الإخراج:
فيما يلي لقطة شاشة للكود:
شرح الكود:
- قم بتعريف متغير مؤشر عدد صحيح IP.
- قم بتعريف مصفوفة باسم arr وقم بتخزين 6 أعداد صحيحة فيها.
- تعيين آر إلى الملكية الفكرية. سيصبح ip وarr متساويين.
- إنشاء حلقة. تم إنشاء متغير الحلقة x للتكرار على عناصر المصفوفة من الفهرس 0 إلى 5.
- اطبع القيم المخزنة على عنوان IP الخاص بالمؤشر. سيتم إرجاع قيمة واحدة لكل تكرار، وسيتم إجراء ما مجموعه 6 تكرارات. النهاية هي أ C++ الكلمة الأساسية التي تعني خط النهاية. يتيح لك هذا الإجراء تحريك المؤشر إلى السطر التالي بعد طباعة كل قيمة. ستتم طباعة كل قيمة في سطر فردي.
- لتحريك المؤشر إلى موضع int التالي بعد كل تكرار.
- نهاية للحلقة.
- يجب أن يقوم البرنامج بإرجاع شيء ما عند التنفيذ الناجح.
- نهاية نص الوظيفة الرئيسية ().
مؤشر فارغ
إذا لم يكن هناك عنوان محدد ليتم تعيينه، فيمكن تعيين قيمة NULL لمتغير المؤشر. يجب أن يتم ذلك أثناء الإعلان. يُعرف هذا المؤشر بمؤشر فارغ. قيمته صفر ويتم تعريفه في العديد من المكتبات القياسية مثل iostream.
مثال 3:
#include <iostream>
using namespace std;
int main() {
int *ip = NULL;
cout << "Value of ip is: " << ip;
return 0;
}
الإخراج:
فيما يلي لقطة شاشة للكود:
شرح الكود:
- قم بتعريف متغير المؤشر ip وتعيين قيمة NULL له.
- اطبع قيمة متغير المؤشر ip بجانب بعض النص على وحدة التحكم.
- يجب أن يقوم البرنامج بإرجاع القيمة عند اكتماله بنجاح.
- نهاية نص الدالة main().
مؤشرات المتغيرات
التكنولوجيا مع C++يمكنك معالجة البيانات مباشرة من ذاكرة الكمبيوتر.
يمكن تخصيص مساحة الذاكرة أو إعادة تخصيصها حسب رغبة الشخص. أصبح هذا ممكنًا بواسطة متغيرات المؤشر.
تشير متغيرات المؤشر إلى عنوان محدد في ذاكرة الكمبيوتر يشير إليه متغير آخر.
ويمكن إعلانها على النحو التالي:
int *p;
أو،
int* p;
في المثال you، قمنا بتعريف متغير المؤشر p.
وسوف تحمل عنوان الذاكرة.
العلامة النجمية هي عامل إلغاء المرجع الذي يعني مؤشرًا إلى.
يشير المؤشر p إلى قيمة عددية في عنوان الذاكرة.
مثال 4:
#include <iostream>
using namespace std;
int main() {
int *p, x = 30;
p = &x;
cout << "Value of x is: " << *p;
return 0;
}
الإخراج:
فيما يلي لقطة شاشة للكود:
شرح الكود:
- قم بتعريف متغير المؤشر p ومتغير x بقيمة 30.
- قم بتعيين عنوان المتغير x إلى p.
- اطبع قيمة متغير المؤشر p بجانب بعض النصوص على وحدة التحكم.
- يجب أن يقوم البرنامج بإرجاع القيمة عند اكتماله بنجاح.
- نهاية نص الدالة main().
تطبيق المؤشرات
وظائف في C++ لا يمكن إرجاع سوى قيمة واحدة. علاوة على ذلك، يتم تخصيص جميع المتغيرات المعلنة في الدالة على مكدس استدعاء الدالة. بمجرد إرجاع الدالة، يتم تدمير جميع متغيرات المكدس.
يتم تمرير الوسائط إلى الدالة بالقيمة، وأي تعديل يتم إجراؤه على المتغيرات لا يغير قيمة المتغيرات الفعلية التي يتم تمريرها. يساعد المثال التالي في توضيح هذا المفهوم:
مثال 5:
#include <iostream>
using namespace std;
void test(int*, int*);
int main() {
int a = 5, b = 5;
cout << "Before changing:" << endl;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
test(&a, &b);
cout << "\nAfter changing" << endl;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
return 0;
}
void test(int* n1, int* n2) {
*n1 = 10;
*n2 = 11;
}
الإخراج:
فيما يلي لقطة شاشة للكود:
شرح الكود:
- قم بإنشاء نموذج أولي لدالة تسمى test والتي ستأخذ معلمتين صحيحتين.
- استدعاء الدالة الرئيسية (). سنضيف منطق البرنامج داخل جسمه.
- قم بتعريف متغيرين صحيحين a وb، قيمة كل منهما 5.
- طباعة بعض النص على وحدة التحكم. سيحرك endl (خط النهاية) المؤشر لبدء الطباعة في السطر التالي.
- اطبع قيمة المتغير a على وحدة التحكم بجانب النص الآخر. سيحرك endl (خط النهاية) المؤشر لبدء الطباعة في السطر التالي.
- اطبع قيمة المتغير b على وحدة التحكم بجانب النص الآخر. سيحرك endl (خط النهاية) المؤشر لبدء الطباعة في السطر التالي.
- قم بإنشاء دالة باسم test() والتي تأخذ عناوين المتغير a وb كمعلمات.
- طباعة بعض النص على وحدة التحكم. سيقوم \n بإنشاء سطر فارغ جديد قبل طباعة النص. سيحرك endl (خط النهاية) المؤشر لبدء الطباعة في السطر التالي بعد طباعة النص.
- اطبع قيمة المتغير a على وحدة التحكم بجانب النص الآخر. سيحرك endl (خط النهاية) المؤشر لبدء الطباعة في السطر التالي.
- اطبع قيمة المتغير b على وحدة التحكم بجانب النص الآخر. سيحرك endl (خط النهاية) المؤشر لبدء الطباعة في السطر التالي.
- يجب أن يقوم البرنامج بإرجاع القيمة عند اكتماله بنجاح.
- نهاية نص الدالة main().
- تحديد اختبار الوظيفة (). يجب أن تأخذ الدالة متغيرين صحيحين للمؤشر *n1 و*n2.
- تعيين متغير المؤشر *n1 بقيمة 10.
- تعيين متغير المؤشر *n2 بقيمة 11.
- نهاية نص اختبار الوظيفة ().
على الرغم من أنه تم تعيين قيم جديدة للمتغيرين a وb داخل اختبار الوظيفة، بمجرد اكتمال استدعاء الوظيفة، فإن نفس الشيء لا ينعكس في الوظيفة الخارجية الرئيسية.
يساعد استخدام المؤشرات كوسائط دالة على تمرير العنوان الفعلي للمتغير في الوظيفة، وستنعكس جميع التغييرات التي يتم إجراؤها على المتغير في الوظيفة الخارجية.
في الحالة المذكورة أعلاه، تحتوي الدالة "test" على عنوان المتغيرين "a" و"b". يمكن الوصول إلى هذين المتغيرين مباشرة من خلال الدالة "test"، وبالتالي فإن أي تغيير يتم إجراؤه على هذه المتغيرات ينعكس في الدالة المستدعية "main".
مزايا استخدام المؤشرات
فيما يلي إيجابيات/فوائد استخدام المؤشرات
- المؤشرات هي المتغيرات التي تخزن عنوان الآخرين المتغيرات في C++.
- يمكن تعديل أكثر من متغير وإرجاعه بواسطة الدالة باستخدام المؤشرات.
- يمكن تخصيص الذاكرة وإلغاء تخصيصها ديناميكيًا باستخدام المؤشرات.
- تساعد المؤشرات في تبسيط تعقيد البرنامج.
- تتحسن سرعة تنفيذ البرنامج باستخدام المؤشرات.
ملخص
- يشير المؤشر إلى عنوان الاحتفاظ المتغير لمتغير آخر.
- يحتوي كل مؤشر على نوع بيانات صالح.
- المؤشر هو تمثيل رمزي لعنوان الذاكرة.
- تسمح المؤشرات للبرامج بمحاكاة الاستدعاء حسب المرجع وإنشاء هياكل البيانات الديناميكية ومعالجتها.
- المصفوفات وتستخدم المؤشرات مفهومًا ذا صلة.
- يشير اسم المصفوفة إلى قاعدة المصفوفة.
- إذا كنت تريد تعيين عنوان مصفوفة لمؤشر، فلا تستخدم علامة العطف (&).
- إذا لم يكن هناك عنوان محدد لتعيين متغير المؤشر، فقم بتعيينه NULL.







