تعديل المتغيرات عبر المؤشرات
جزء من قسم Logic & Flow في رحلة C على Coddy — الدرس 27 من 63.
الآن يمكنك تسخير القوة الحقيقية للمؤشرات: تعديل المتغير الأصلي من خلال دالة. عندما تمرر مؤشراً إلى دالة، يمكن للدالة استخدام عامل إلغاء المرجعية (dereference operator) لتغيير القيمة المخزنة في عنوان الذاكرة هذا.
داخل الدالة، تقوم بإلغاء مرجع المؤشر باستخدام عامل التشغيل * للوصول إلى قيمة المتغير الأصلي وتعديلها. تُسمى هذه التقنية التمرير بالمرجع (pass-by-reference) لأنك تقوم بتمرير مرجع لموقع المتغير في الذاكرة.
void doubleValue(int *ptr) {
*ptr = *ptr * 2; // إلغاء المرجعية لتعديل القيمة الأصلية
}
int main() {
int x = 5;
doubleValue(&x); // تمرير عنوان x
// x الآن تساوي 10!
return 0;
}المفتاح هو استخدام *ptr على الجانب الأيسر من عملية الإسناد لتعديل القيمة في عنوان الذاكرة الذي يحتفظ به المؤشر. يتيح ذلك للدوال تغيير المتغيرات بشكل دائم من الدالة المستدعية، مما يفتح إمكانيات برمجية قوية لا يمكن تحقيقها ببساطة من خلال التمرير بالقيمة (pass-by-value).
التحدي
سهلاكتب برنامجاً بلغة C يوضح كيفية تعديل المتغيرات من خلال المؤشرات (pointers) عن طريق إنشاء دالة تقوم بمضاعفة قيمة عدد صحيح ثلاث مرات.
يجب أن يقوم برنامجك بما يلي:
- إنشاء دالة تسمى
tripleValueتأخذ مؤشراً لعدد صحيح كمعامل لها - داخل دالة
tripleValue، استخدم عامل إلغاء المرجعية (dereference operator) لضرب القيمة الموجودة في عنوان الذاكرة في 3 - داخل دالة
tripleValue، اطبع القيمة الجديدة بالتنسيق التالي:Value tripled to: [value] - في دالة
main، قم بالتصريح عن متغير عدد صحيح يسمىnumberوقم بتهيئته بالقيمة 8 - اطبع القيمة الأصلية بالتنسيق التالي:
Original value: [value] - استدعِ دالة
tripleValueومرر عنوان المتغيرnumberباستخدام عامل العنوان (address-of operator) - بعد استدعاء الدالة، اطبع القيمة النهائية للمتغير
numberبالتنسيق التالي:Final value: [value]
يجب أن يوضح مخرج البرنامج أن الدالة نجحت في تعديل المتغير الأصلي من خلال المؤشر:
Original value: 8
Value tripled to: 24
Final value: 24يوضح هذا التحدي قوة التمرير بالمرجع (pass-by-reference) باستخدام المؤشرات، حيث يمكن للدالة تعديل المتغير الأصلي بشكل دائم عن طريق إلغاء مرجعية المؤشر وتغيير القيمة في ذلك الموقع من الذاكرة.
ورقة مرجعية
يمكنك تعديل المتغير الأصلي من خلال دالة باستخدام المؤشرات. تُسمى هذه التقنية التمرير بالمرجع (pass-by-reference) لأنك تقوم بتمرير مرجع لموقع المتغير في الذاكرة.
داخل الدالة، قم بإلغاء مرجع المؤشر باستخدام عامل التشغيل * للوصول إلى قيمة المتغير الأصلي وتعديلها:
void doubleValue(int *ptr) {
*ptr = *ptr * 2; // إلغاء المرجع لتعديل القيمة الأصلية
}
int main() {
int x = 5;
doubleValue(&x); // تمرير عنوان x
// x الآن هي 10!
return 0;
}استخدم *ptr على الجانب الأيسر من عملية التعيين لتعديل القيمة في عنوان الذاكرة الذي يحمله المؤشر. يتيح ذلك للدوال تغيير المتغيرات بشكل دائم من الدالة المستدعية.
جرّب بنفسك
#include <stdio.h>
// TODO: اكتب دالة tripleValue الخاصة بك هنا
int main() {
// TODO: اكتب الكود الخاص بك هنا
// تعريف وتهيئة متغير number
// طباعة القيمة الأصلية
// استدعاء دالة tripleValue
// طباعة القيمة النهائية
return 0;
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
1أساسيات المؤشرات
ما هو المؤشر؟الإعلان عن المؤشراتعامل العنوان (&)عامل إلغاء المرجعية (*)مؤشرات NULLمراجعة: أساسيات المؤشرات4مشروع: أداة نصوص بسيطة
نظرة عامة على المشروععد الأحرف2المؤشرات والمصفوفات
أسماء المصفوفات كمؤشراتعناصر المصفوفة - المؤشراتالعمليات الحسابية على المؤشراتمقارنة المؤشراتمراجعة: التنقل في المصفوفة باستخدام المؤشرات5المؤشرات والدوال
التمرير بالقيمةتمرير المؤشرات إلى الدوالتعديل المتغيرات عبر المؤشراتمثال كلاسيكي: التبديلتمرير المصفوفات إلى الدوالملخص: وسائط المؤشرات في الدوال8الهياكل والمؤشرات
المؤشرات إلى الهياكلعامل السهم (->)تمرير الهياكل بالقيمةتمرير مؤشرات الهياكلالتخصيص الديناميكي للهياكلمراجعة: تعديل الهياكل باستخدام المؤشرات11تحديات المراجعة النهائية
مراجعة: دمج السلاسل النصية الديناميكيمراجعة: مصفوفة من الـ Structsمراجعة: عداد تكرار الكلمات3مصفوفات الأحرف والسلاسل النصية
السلاسل النصية كمصفوفات charالمُنهي الصفري (Null Terminator)إدخال السلاسل النصية باستخدام scanfاستخدام strlen()استخدام strcpy()استخدام strcat()استخدام strcmp()مراجعة: دوال السلاسل النصية الأساسية