تخطَّ إلى المحتوى

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 الكامل بالعربي.