المؤشرات والمصفوفات
جزء من قسم Logic & Flow في رحلة C++ على Coddy — الدرس 5 من 56.
تمتلك المصفوفات والمؤشرات علاقة خاصة في لغة ++C. فعندما تقوم بالتصريح عن مصفوفة، يعمل اسم المصفوفة في الواقع كمؤشر للعنصر الأول في تلك المصفوفة. يتيح لك هذا الارتباط استخدام المؤشرات للتعامل مع المصفوفات بطرق قوية.
تأمل تعريف المصفوفة التالي:
int numbers[5] = {10, 20, 30, 40, 50};
int* ptr = numbers; // يشير ptr الآن إلى numbers[0]هنا، numbers يعادل &numbers[0] - كلاهما يعطيك عنوان العنصر الأول. المؤشر ptr يشير الآن إلى نفس الموقع.
بمجرد حصولك على مؤشر لمصفوفة، يمكنك استخدام حساب المؤشرات للتنقل عبر العناصر. إضافة 1 إلى المؤشر ينقله إلى العنصر التالي من نفس النوع:
ptr++; // يشير الآن إلى numbers[1]
ptr = ptr + 2; // يشير الآن إلى numbers[3]يمكنك إلغاء مرجعية المؤشر (dereference) عند أي موضع للوصول إلى القيمة: *ptr تعطيك القيمة عند الموضع الحالي، و *(ptr + 1) تعطيك قيمة العنصر التالي.
تمكنك هذه العلاقة بين المؤشر والمصفوفة من التكرار عبر المصفوفات باستخدام المؤشرات بدلاً من الحلقات التقليدية القائمة على الفهرس، مما يوفر نهجاً بديلاً للتنقل عبر المصفوفة.
التحدي
سهلقم بإنشاء برنامج يستخدم مؤشراً (pointer) للتنقل عبر مصفوفة وطباعة كل عنصر، مما يوضح العلاقة بين المؤشرات والمصفوفات.
لقد تم تزويدك بالمصفوفة التالية:
int values[6] = {15, 23, 8, 42, 17, 31};يجب أن يقوم برنامجك بما يلي:
- إنشاء مؤشر باسم
ptrيشير إلى العنصر الأول في مصفوفةvalues - استخدام حسابات المؤشرات (pointer arithmetic) للتنقل عبر جميع عناصر المصفوفة الستة
- طباعة كل عنصر عن طريق إلغاء مرجع المؤشر (dereferencing) في كل موضع
- نقل المؤشر إلى العنصر التالي باستخدام حسابات المؤشرات (زيادة المؤشر)
اطبع كل عنصر في سطر منفصل بالتنسيق التالي:
Element: [value]يجب أن يظهر المخرج جميع العناصر الستة بالترتيب الذي تظهر به في المصفوفة، مع الوصول إليها من خلال إلغاء مرجع المؤشر بدلاً من استخدام فهرس المصفوفة (array indexing).
ورقة مرجعية
تعمل أسماء المصفوفات كمؤشرات للعنصر الأول. يمكنك تعيين اسم المصفوفة مباشرة إلى مؤشر:
int numbers[5] = {10, 20, 30, 40, 50};
int* ptr = numbers; // ptr يشير إلى numbers[0]استخدم حسابيات المؤشرات للتنقل عبر عناصر المصفوفة:
ptr++; // الانتقال إلى العنصر التالي
ptr = ptr + 2; // التحرك للأمام بمقدار عنصرينقم بإلغاء مرجعية المؤشر للوصول إلى القيم:
*ptr // قيمة العنصر الحالي
*(ptr + 1) // قيمة العنصر التالييتيح ذلك التنقل في المصفوفة بناءً على المؤشرات كبديل للحلقات القائمة على الفهرس.
جرّب بنفسك
#include <iostream>
using namespace std;
int main() {
// المصفوفة المعطاة
int values[6] = {15, 23, 8, 42, 17, 31};
// مهمة: قم بإنشاء مؤشر باسم 'ptr' يشير إلى العنصر الأول في المصفوفة
// مهمة: استخدم حلقة تكرارية للمرور عبر جميع العناصر الستة باستخدام حسابات المؤشرات
// مهمة: اطبع كل عنصر عن طريق إلغاء مرجع المؤشر (dereferencing)
// مهمة: حرك المؤشر إلى العنصر التالي باستخدام حسابات المؤشرات
return 0;
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
1المؤشرات والذاكرة
ما هو المؤشر؟معامل العنوان (Address-Of)معامل الوصول للقيمة (Dereference)المؤشرات الفارغة (Null Pointers)المؤشرات والمصفوفاتالذاكرة الديناميكية باستخدام 'new'تحرير الذاكرة باستخدام 'delete'مراجعة - تمارين على المؤشرات2المتجهات (المصفوفات الديناميكية)
مقدمة إلى std::vectorإنشاء Vectorإضافة العناصرالوصول إلى العناصرحجم الـ Vectorالتكرار باستخدام For Loopالـ Range-Based For Loopإزالة العناصرملخص - عمليات الـ Vector