السلام عليكم
تعتبر مشكله ال pointer من اكبر المشاكل التى تواجه مبرمجى السى و السى بلس بلس, فى الحقيقه المشكله ليست pointer ولكن reference التى تسبب سوء الفهم.
دعونى ابداء ببعض الامثله:
انظر لهذين المثالين:
void incr1(int* a){(*a)++;}
void incr2(int& a){a++;}
والان لإستدعاء incr1 او incr2 نقوم بالتالى :
incr1(&x);
incr2(x);
فى الحاله الاولى نستخدم pointer ولذالك نظطر لوضع العنصر a بعلامة * حتى نصل للمحتوى العنصر وفى اغلب الاحيان يفهم مبرمج السى والسى بلس بلس الداله الاولى دون اى مشقه, ولكن عندما يرى الداله الثانيه يصاب بالذهول ويفقد ما فهمه فى الداله الاولى. او على الاقل هذا ما كان يحدث لى , ربما يرجع ذالك لانى تعاملت معى الاسمبلى وفى الاسمبلى لا توجد الحاله الثانيه.
والان دعونى اعطيكم مثال ثلاث يعقد المسئله اكثر:
int* P=&i;
هذا دليل على ان p* معناها i&, هل اتضحت الصوره, لو p* هى نفسها i& إذاً لابد ان تكون ++(*a) تساوى ++(a&) , ولكن حسب المثال الاول فهذين التعبرين غير متساويين ؟؟؟!!!
دعونى اشرح لكم لماذا هذا الاختلاف الغير منطقى :
المشكله تكمن فى ان & لها معنين فى لغة السى على حسب مقعها من علامة =, لاحظ معى التالى:
i=5;
int* P=&i;
هذه الجمله تعنى ان i تحتوى على رقم معين من نوع int و i& هو العنوان الذى يحوى الرقم و P هى من نوع بوينتر يعنى بالعربى عنوان, هنا لا توجد اى مشكله والموضوع منطقى حتى الان ولكن لاحظ الان هذه الجمله:
i=5;
int &P=i;
هناك تكمن المشكله, ماهى P فى هذه الحاله, هل هى pointer بالتاكيد لا لانها ستحصل على قيمه i, فى هذه الحاله P هى reference, وماهو معناها؟؟
بكل إختصار وكى لا اطيل عليكم P و i كلاهما عنوان لنفس الذاكره حيث انك لو قمت بالعمليه التاليه:
P=6;
فانت بطريقه غير مباشره غيرت محتوى i والان i ايضاً تساوى 6.
لو عدنا الان للمثال الاول :
void incr1(int& a){a++;}
incr2(x);
لعرفنا من المثال ان ما قمنا به ما هو إلى إعطاء x إسم جديد الا وهو a وذالك باستخدام & بالطريقه الثانيه.
ملاحظه هامه :
int &P; //Error Error
فى لغه السى غير مسموح تعين reference بدون ان تذكر المقابل, لابد ان يكون هناك مقابل ل P& على النحو التالى:
int &P=i;
,ولابد ان يكون المقابل من نوع متغير ولا يجوز ان تضع قيمه وإنما متغير فقط.
هذه المعلومات لا توجد مشروحه بنفس الطريقه فى اى كتاب قراته ولا اى سايت حاولت التعلم منه, ولكن هى مجهود شخصى منى, وقد اكون على خطاء, ولكن كل التجارب التى قمت بها اوصلتنى لنفس النتيجه, لذالك ارجو من من لديه اى إضافه ان لا يبخل علينا بها.
ملحوظه:
كل هذه المعلومات مستخلصه فى كتاب Bjarne Stroustrup ولكنه لا يوضح العلاقه بين reference عندما تكون من ناحية الشمال لعلامة = او من ناحية اليمين وعلامة ال pointer.
والسلام عليكم