const int* / int *const
المؤشر لثابت مقابل المؤشر الثابت const int* / int *const
مكان const حول * يحدّد أيّ قيمة محمية من التعديل: القيمة المُشار إليها، أو عنوان المؤشّر نفسه.
لكل مؤشّر قيمتان: العنوان الذي يخزّنه، والقيمة الموجودة في ذاك العنوان. const int *p تعني «القيمة المُشار إليها ثابتة» — تقدر تُعيد توجيه p لعنوان آخر لكن لا تقدر تعدّل *p. أما int *const p فتعني «المؤشّر نفسه ثابت» — لا يمكن تغيير العنوان الذي يخزّنه p بعد التهيئة، لكن *p قابلة للتعديل.
قاعدة عملية للقراءة: اقرأ التصريح من اليمين لليسار. const int *const p يجمع الاثنين معًا: لا عنوان جديد ولا قيمة جديدة. هذا الشكل الأخير شائع بمعاملات الدوال التي تستقبل مصفوفة للقراءة فقط.
الصياغة
const int *p; // مؤشر لقيمة ثابتة، p نفسه متغيّر int *const p = &x; // مؤشر ثابت، *p متغيّرة const int *const p = &x; // الاثنان ثابتان
📄 مثال
int a = 1, b = 2; const int *p1 = &a; p1 = &b; // مسموح: تغيير العنوان // *p1 = 5; // خطأ ترجمة: القيمة ثابتة int *const p2 = &a; *p2 = 5; // مسموح: تعديل القيمة // p2 = &b; // خطأ ترجمة: العنوان ثابت
أهم النقاط
| العنصر | الوظيفة |
|---|---|
| const int *p | مؤشر لقيمة ثابتة — القيمة محمية، العنوان قابل للتغيير |
| int *const p | مؤشر ثابت — العنوان محمي، القيمة قابلة للتغيير |
| const int *const p | الاثنان ثابتان — مؤشر ثابت لقيمة ثابتة |
💡 نصائح عملية
- استخدم const int *param بمعاملات الدوال التي تقرأ مصفوفة فقط دون تعديلها
- اقرأ التصريح من اسم المتغيّر باتجاه اليسار لمعرفة أي جزء ثابت بالضبط
⚠️ أخطاء شائعة
- الخلط بين الشكلين وافتراض أن مكان const لا يهم
- محاولة تعديل *p رغم أنه مصرّح كـ const int * فيُرفض وقت الترجمة
خصائص ذات صلة
🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار C الكامل بالعربي.