مقارنة المؤشرات
جزء من قسم المنطق وتدفق التنفيذ في رحلة C على Coddy. الدرس 10 من 63.
لقد تعلمت كيفية التنقل عبر المصفوفات باستخدام حساب المؤشرات. والآن ستكتشف أن المؤشرات يمكن أيضًا مقارنتها باستخدام عوامل المقارنة نفسها التي تستخدمها مع المتغيرات العادية: ==، !=، <، و>.
عندما تقارن بين مؤشرين، فأنت تقارن بين عنواني الذاكرة الخاصين بهما. ويكون هذا مفيدًا بشكل خاص عندما يشير كلا المؤشرين إلى عناصر ضمن المصفوفة نفسها، إذ يتيح لك تحديد موضعيهما النسبيين في الذاكرة.
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 يستخدم مقارنة المؤشرات لاجتياز مصفوفة والعثور على العناصر الواقعة ضمن نطاق محدد. يجب أن يقوم برنامجك بما يلي:
- صرّح عن مصفوفة أعداد صحيحة باسم
scoresتحتوي على 8 عناصر، وتهيئتها بالقيم {45, 78, 92, 63, 87, 34, 91, 56} - صرّح عن مؤشرين إلى أعداد صحيحة:
start_ptrوend_ptr - اجعل
start_ptrيشير إلى العنصر الأول في المصفوفة - اجعل
end_ptrيشير إلى العنصر الأخير في المصفوفة باستخدام حساب المؤشرات - صرّح عن مؤشر باسم
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يختبر هذا التحدي فهمك لعوامل مقارنة المؤشرات في شروط الحلقات، واستخدام حساب المؤشرات لتعيين مؤشرات الحدود، وكيف يمكن لمقارنة المؤشرات التحكم في اجتياز المصفوفة بفعالية أكبر من الحلقات التقليدية المعتمدة على العدّاد.
جرّب بنفسك
#include <stdio.h>
int main() {
// TODO: اكتب شيفرتك أدناه
return 0;
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المنطق وتدفق التنفيذ
1أساسيات المؤشرات
ما هو المؤشر؟الإعلان عن المؤشراتعامل العنوان (&)عامل إلغاء المرجعية (*)مؤشرات NULLمراجعة: أساسيات المؤشرات4مشروع: أداة نصوص بسيطة
نظرة عامة على المشروععد الأحرف2المؤشرات والمصفوفات
أسماء المصفوفات كمؤشراتعناصر المصفوفة - المؤشراتالعمليات الحسابية على المؤشراتمقارنة المؤشراتمراجعة: التنقل في المصفوفة باستخدام المؤشرات5المؤشرات والدوال
التمرير بالقيمةتمرير المؤشرات إلى الدوالتعديل المتغيرات عبر المؤشراتمثال كلاسيكي: التبديلتمرير المصفوفات إلى الدوالملخص: وسائط المؤشرات في الدوال8الهياكل والمؤشرات
المؤشرات إلى الهياكلعامل السهم (->)تمرير الهياكل بالقيمةتمرير مؤشرات الهياكلالتخصيص الديناميكي للهياكلمراجعة: تعديل الهياكل باستخدام المؤشرات11تحديات المراجعة النهائية
مراجعة: دمج السلاسل النصية الديناميكيمراجعة: مصفوفة من الـ Structsمراجعة: عداد تكرار الكلمات3مصفوفات الأحرف والسلاسل النصية
السلاسل النصية كمصفوفات charالمُنهي الصفري (Null Terminator)إدخال السلاسل النصية باستخدام scanfاستخدام strlen()استخدام strcpy()استخدام strcat()استخدام strcmp()مراجعة: دوال السلاسل النصية الأساسيةتدرّب بنفسك: مترجم C عبر الإنترنت