عامل إلغاء المرجعية (*)
جزء من قسم Logic & Flow في رحلة C على Coddy — الدرس 4 من 63.
الآن بعد أن عرفت كيفية تخزين العناوين في المؤشرات، تحتاج إلى تعلم كيفية الوصول إلى القيمة الفعلية المخزنة في عنوان الذاكرة هذا. يسمح لك عامل إلغاء المرجعية (*) بـ "تتبع" المؤشر للحصول على القيمة التي يشير إليها.
عندما تضع المعامل * أمام متغير مؤشر (pointer variable)، فإنه يصل إلى القيمة المخزنة في عنوان الذاكرة الذي يحمله المؤشر. فكر في الأمر وكأنك تقول "أعطني ما بداخل الغرفة في هذا العنوان".
int age = 25;
int *ptr = &age;
printf("%d", *ptr); // يطبع 25 - قيمة ageمن المهم أن نفهم أن النجمة (*) لها معنيان مختلفان في لغة C. فعند التصريح عن مؤشر مثل int *ptr;، تشير النجمة إلى أن ptr هو مؤشر. أما عند استخدامها مع مؤشر موجود مثل *ptr، فإنها تقوم بإلغاء مرجع المؤشر للوصول إلى القيمة التي يشير إليها.
يعد عامل إلغاء المرجعية (dereference operator) ضرورياً لأنه يكمل دورة المؤشر: يمكنك تخزين عنوان في مؤشر باستخدام &، ثم استعادة القيمة الموجودة في ذلك العنوان باستخدام *. يتيح لك هذا الوصول إلى المتغيرات وتعديلها بشكل غير مباشر من خلال عناوين الذاكرة الخاصة بها.
التحدي
سهلاكتب برنامجاً بلغة C يوضح سير العمل الكامل للمؤشرات: التصريح، تعيين العنوان، وإلغاء المرجعية (dereferencing). يجب أن يقوم برنامجك بما يلي:
- التصريح عن متغير صحيح (integer) باسم
valueوتهيئته بالقيمة 75 - التصريح عن متغير عشري (float) باسم
priceوتهيئته بالقيمة 19.99 - التصريح عن مؤشر لعدد صحيح باسم
value_ptr - التصريح عن مؤشر لعدد عشري باسم
price_ptr - استخدام عامل العنوان (address-of operator) لتعيين عنوان
valueإلىvalue_ptr - استخدام عامل العنوان (address-of operator) لتعيين عنوان
priceإلىprice_ptr - استخدام عامل إلغاء المرجعية (dereference operator) لطباعة قيمة
valueمن خلالvalue_ptr - استخدام عامل إلغاء المرجعية (dereference operator) لطباعة قيمة
priceمن خلالprice_ptrبمنزلتين عشريتين بالضبط
يجب أن يعرض مخرجك القيم التي تم إلغاء مرجعيتها بالتنسيق التالي:
Value through pointer: 75
Price through pointer: 19.99يختبر هذا التحدي فهمك لكيفية قيام عامل إلغاء المرجعية باسترداد قيمة المتغير الأصلي عن طريق تتبع العنوان المخزن في المؤشر.
ورقة مرجعية
يسمح لك عامل إلغاء المرجعية (*) بالوصول إلى القيمة المخزنة في عنوان الذاكرة الذي يحمله المؤشر.
int age = 25;
int *ptr = &age;
printf("%d", *ptr); // يطبع 25 - قيمة ageعلامة النجمة (*) لها معنيان مختلفان في لغة C:
- في التصريحات مثل
int *ptr;- تشير إلى أنptrهو مؤشر - مع المؤشرات الموجودة مثل
*ptr- تقوم بإلغاء مرجعية المؤشر للوصول إلى القيمة التي يشير إليها
عامل إلغاء المرجعية يكمل دورة المؤشر: قم بتخزين عنوان باستخدام &، ثم استرجع القيمة الموجودة في ذلك العنوان باستخدام *.
جرّب بنفسك
#include <stdio.h>
int main() {
// TODO: اكتب كودك هنا
// 1. التصريح عن المتغيرات وتهيئتها
// 2. التصريح عن المؤشرات
// 3. تعيين العناوين للمؤشرات
// 4. طباعة القيم التي تشير إليها المؤشرات
return 0;
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
1أساسيات المؤشرات
ما هو المؤشر؟الإعلان عن المؤشراتعامل العنوان (&)عامل إلغاء المرجعية (*)مؤشرات NULLمراجعة: أساسيات المؤشرات4مشروع: أداة نصوص بسيطة
نظرة عامة على المشروععد الأحرف2المؤشرات والمصفوفات
أسماء المصفوفات كمؤشراتعناصر المصفوفة - المؤشراتالعمليات الحسابية على المؤشراتمقارنة المؤشراتمراجعة: التنقل في المصفوفة باستخدام المؤشرات5المؤشرات والدوال
التمرير بالقيمةتمرير المؤشرات إلى الدوالتعديل المتغيرات عبر المؤشراتمثال كلاسيكي: التبديلتمرير المصفوفات إلى الدوالملخص: وسائط المؤشرات في الدوال8الهياكل والمؤشرات
المؤشرات إلى الهياكلعامل السهم (->)تمرير الهياكل بالقيمةتمرير مؤشرات الهياكلالتخصيص الديناميكي للهياكلمراجعة: تعديل الهياكل باستخدام المؤشرات11تحديات المراجعة النهائية
مراجعة: دمج السلاسل النصية الديناميكيمراجعة: مصفوفة من الـ Structsمراجعة: عداد تكرار الكلمات3مصفوفات الأحرف والسلاسل النصية
السلاسل النصية كمصفوفات charالمُنهي الصفري (Null Terminator)إدخال السلاسل النصية باستخدام scanfاستخدام strlen()استخدام strcpy()استخدام strcat()استخدام strcmp()مراجعة: دوال السلاسل النصية الأساسية