مقارنة المؤشرات
جزء من قسم Logic & Flow في رحلة C على Coddy — الدرس 10 من 63.
لقد تعلمت كيفية التنقل عبر المصفوفات باستخدام حساب المؤشرات (pointer arithmetic). الآن ستكتشف أن المؤشرات يمكن أيضاً أن يتم مقارنتها باستخدام نفس عوامل المقارنة التي تستخدمها مع المتغيرات العادية: ==، !=، <، و >.
عندما تقارن بين مؤشرين، فإنك تقارن عناوين الذاكرة الخاصة بهما. وهذا مفيد بشكل خاص عندما يشير كلا المؤشرين إلى عناصر داخل نفس المصفوفة، حيث يتيح لك ذلك تحديد مواقعهما النسبية في الذاكرة.
int numbers[5] = {10, 20, 30, 40, 50};
int *start = numbers; // يشير إلى العنصر الأول
int *end = numbers + 4; // يشير إلى العنصر الأخير
if (start < end) {
printf("start comes before end in memory");
}تصبح مقارنة المؤشرات قوية بشكل خاص في شروط الحلقات. فبدلاً من استخدام متغير عداد، يمكنك مقارنة موضع المؤشر الحالي بمؤشر هدف للتحكم في وقت توقف الحلقة. ينتج عن ذلك كود أنيق وفعال للتنقل عبر المصفوفة.
الفكرة الجوهرية هي أن ptr1 < ptr2 تخبرك أن ptr1 يشير إلى عنصر يظهر في وقت سابق في المصفوفة من العنصر الذي ptr2 يشير إليه. هذه العلاقة تجعل مقارنة المؤشرات مناسبة بشكل طبيعي للتحكم في الحلقات التي تعالج المصفوفات بالتتابع.
التحدي
سهلاكتب برنامجاً بلغة C يستخدم مقارنة المؤشرات (pointer comparison) للتنقل عبر مصفوفة والعثور على العناصر الموجودة ضمن نطاق محدد. يجب على برنامجك القيام بما يلي:
- الإعلان عن مصفوفة أعداد صحيحة تسمى
scoresتحتوي على 8 عناصر وتهيئتها بالقيم {45, 78, 92, 63, 87, 34, 91, 56} - الإعلان عن مؤشرين لأعداد صحيحة:
start_ptrوend_ptr - تعيين
start_ptrليشير إلى العنصر الأول في المصفوفة - تعيين
end_ptrليشير إلى العنصر الأخير في المصفوفة باستخدام حساب المؤشرات (pointer arithmetic) - الإعلان عن مؤشر يسمى
current_ptrوتهيئته ليشير إلى العنصر الأول - استخدام حلقة while مع مقارنة المؤشرات (
current_ptr <= end_ptr) للتنقل عبر المصفوفة - داخل الحلقة:
- التحقق مما إذا كانت القيمة الحالية تقع بين 60 و 90 (شاملة)
- إذا كانت القيمة ضمن النطاق، اطبع "Value [value] is in range"
- إذا لم تكن القيمة ضمن النطاق، اطبع "Value [value] is out of range"
- زيادة
current_ptrللانتقال إلى العنصر التالي
- بعد الحلقة، استخدم مقارنة المؤشرات للتحقق من أن
current_ptrأصبح الآن خارج نهاية المصفوفة عن طريق التحقق مما إذا كانcurrent_ptr > end_ptr - إذا كان الشرط صحيحاً، اطبع "Traversal complete"
يجب أن يعرض مخرج البرنامج النتائج بالتنسيق التالي:
Value 45 is out of range
Value 78 is in range
Value 92 is out of range
Value 63 is in range
Value 87 is in range
Value 34 is out of range
Value 91 is out of range
Value 56 is out of range
Traversal completeيختبر هذا التحدي فهمك لعوامل مقارنة المؤشرات في شروط الحلقات، واستخدام حساب المؤشرات لتعيين مؤشرات الحدود، وكيف يمكن لمقارنة المؤشرات التحكم في التنقل عبر المصفوفة بشكل أكثر أناقة من الحلقات التقليدية القائمة على العدادات.
ورقة مرجعية
يمكن مقارنة المؤشرات باستخدام العوامل العلائقية: ==، و !=، و <، و >.
عند مقارنة المؤشرات، فأنت تقارن عناوين الذاكرة الخاصة بها. وهذا مفيد لتحديد المواقع النسبية للعناصر داخل نفس المصفوفة.
int numbers[5] = {10, 20, 30, 40, 50};
int *start = numbers; // يشير إلى العنصر الأول
int *end = numbers + 4; // يشير إلى العنصر الأخير
if (start < end) {
printf("start comes before end in memory");
}تعتبر مقارنة المؤشرات قوية بشكل خاص في شروط الحلقات، مما يسمح لك بالتحكم في الحلقات من خلال مقارنة مواقع المؤشرات بدلاً من استخدام متغيرات العداد:
int *current_ptr = numbers;
int *end_ptr = numbers + 4;
while (current_ptr <= end_ptr) {
// معالجة العنصر الحالي
current_ptr++; // الانتقال إلى العنصر التالي
}التعبير ptr1 < ptr2 يعني أن ptr1 يشير إلى عنصر يظهر في وقت سابق في المصفوفة من العنصر الذي يشير إليه ptr2.
جرّب بنفسك
#include <stdio.h>
int main() {
// TODO: اكتب الكود الخاص بك أدناه
return 0;
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
1أساسيات المؤشرات
ما هو المؤشر؟الإعلان عن المؤشراتعامل العنوان (&)عامل إلغاء المرجعية (*)مؤشرات NULLمراجعة: أساسيات المؤشرات4مشروع: أداة نصوص بسيطة
نظرة عامة على المشروععد الأحرف2المؤشرات والمصفوفات
أسماء المصفوفات كمؤشراتعناصر المصفوفة - المؤشراتالعمليات الحسابية على المؤشراتمقارنة المؤشراتمراجعة: التنقل في المصفوفة باستخدام المؤشرات5المؤشرات والدوال
التمرير بالقيمةتمرير المؤشرات إلى الدوالتعديل المتغيرات عبر المؤشراتمثال كلاسيكي: التبديلتمرير المصفوفات إلى الدوالملخص: وسائط المؤشرات في الدوال8الهياكل والمؤشرات
المؤشرات إلى الهياكلعامل السهم (->)تمرير الهياكل بالقيمةتمرير مؤشرات الهياكلالتخصيص الديناميكي للهياكلمراجعة: تعديل الهياكل باستخدام المؤشرات11تحديات المراجعة النهائية
مراجعة: دمج السلاسل النصية الديناميكيمراجعة: مصفوفة من الـ Structsمراجعة: عداد تكرار الكلمات3مصفوفات الأحرف والسلاسل النصية
السلاسل النصية كمصفوفات charالمُنهي الصفري (Null Terminator)إدخال السلاسل النصية باستخدام scanfاستخدام strlen()استخدام strcpy()استخدام strcat()استخدام strcmp()مراجعة: دوال السلاسل النصية الأساسية