الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

الجزء الثالث من شرح الدوال

مغلق
بدأه السهم الناري في 13 مايو 2003 · 0 رد · 520 مشاهدة · في ارشيف قسم C/C++
مشاركة: واتساب X فيسبوك تيليجرام
#1

بسم الله الرحمن الرحيم

الحمد لله والصلاة والسلام على رسول الله أما بعد:

ارجوا أن يكون الدرسين الماضيين قد تم الاستفادة منهما، وكم أتمنى أن يكون هنالك تفاعل أكثر سواء من القراء أو المبرمجين الذين عندهم تصحيح معلومة أو إضافة مثال، فلست معصوم من الخطأ و لا كن أحاول أن انقل المعلومة لجميع أبناء الأمة العربية حتى تعم الفائدة...والله ولي التوفيق....

* نعود لدرس اليوم وهو استخدام المؤشرات مع الدوال:

أولاً هنالك طريقتان لتمرير المتغيرات للدوال وهي:

1-التمرير بالقيمة pass by value.

2-التمرير بالمؤشرات pointer أو التمرير بالإشارات reference.

أما بالنسبة للطريقة الأولى فالحاصل هو :

" عندما تمرر بالقيمة فكأنك تقوم بأخذ نسخة من المتغير و استخدامها في جسم الدالة وعندما يعود البرنامج للسطر التالي لسطر استدعاء الدالة تكون قيمة المتغير هي نفسها بعد الاستخدام أي لم تتغير".

وباختصار أقول هو كأنك أخذت نسخة من المتغير المراد تمريره وتعمل في جسم الدالة ما تريد وإذا رجعت للدالة الرئيسيةmain تبقى قيمة المتغير كما هي لم تتغير بتغيرها في جسم الدالة.

ومثال على ذلك خذ البرنامج التالي نريد طباعة قيمة متغير وليكن x قبل الاستدعاء وفي جسم الدالة وبعد عملية الاستدعاء:

#include

void  sum(int x)
{
	  x+=5;
	cout <<"n Number is After Function Sum = " << x;

}

int main()
{
	int x;

	cout <<"please enter numbern";
	cin >> x;

	cout <<"n Number is Before Main Function = " << x;
	sum(x);
	cout <<"n Number is After Main Function = " << x;

	cout <<"nnn";
	return 0;
}

لا حظ معي أنك لو قمت مثلاً بإدخال قيمة x بخمسة أي x=5 فأن ما يحدث أن القيمة ستمرر وتكون قيمة x قبل استدعاء الدالة هي نفسها قيمةx بعد عملية جسم الدالة لم تتغير مع أننا قمنا بإضافة 5 لقيمة المتغير الممرر للدالة أي جعلنا x=10 جرب ذلك بنفسك.

*أما التمرير بالمؤشرات فلابد أن نمهد قليل للمؤشرات:

ماهو المؤشر؟

هو عبارة عن متغير مثله مثل أي متغير أخر ولكن يختلف في أنه يخزن بداخله عنوان موجود في الذاكرة.

أي نستطيع القول بأن المؤشرات ماهي إلا متغيرات تخزن بداخلها عناوين متغيرات موجودة في الذاكرة.

كيف نعرف المؤشر؟

نعرف المؤشر بذكر نوعه متبوعاً بعلامة الضرب * ثم اسم المؤشر:

مثال :

int   *plength;
float   *parea;
double  *pont;

كيف نقوم بتخزين عنوان متغير ما بداخل مؤشر؟

نقوم وضع المؤشر ثم علامة = ثم متبوعة بعلامة & ثم اسم المتغير المراد تخزين عنوانه.

مثال :

Plength=&x;
Parea=&y;
Pont=&m;

من الأمثلة السابقة قد تقول ما معنا & و ما معنا * والجواب على ذلك هو أن :

& " تعني عنوان المتغير الموجود في الذاكرة لأن الذاكرة مجزئة لعدة أجزاء وكل مكان منها له رقم عنوان معين و هذا يدل عليه"

• " هذه تميز أن المراد تعريفه هو مؤشر وليس متغير عادي".

ولها استخدام أخر هو مثلاً عندما نكتب الجملة التالية :

int  * pointer = & x;
* pointer = 5 ;

الجملة الثانية معناها كأنك تقول " ضع 5 في المكان (الموضع)الذي تشير إليه في الذاكرة"، أو ضع 5 في المتغير الذي عنوانه موجود في الذاكرة .

و كأنك تكتب الجملة التالية x=5;

*ملاحظة لن ولم أغطي موضوع المؤشرات و إن استطعت إن شاء الله إن أضعه في درس لاحق بإذن الله سأفعل .

المهم هو أنن عرفنا كيف نعرف المؤشر و الآن جاهزين للتمرير بالمؤشرات بالنسبة للدوال و لنعود إلى مثالنا السابق ونحوله إلى تمرير بالمؤشرات بدلاً من القيمة ونلاحظ الفرق الذي سيحدث:

#include

void  sum(int  * pionX)
{
    *pionX=*pionX + 5;
	cout <<"n Number is After Function Sum = " << *pionX;

}

int main()
{
	int x;


	cout <<"please enter numbern";
	cin >> x;

	cout <<"n Number is Before Main Function = " << x;
	sum(&x);
	cout <<"n Number is After Main Function = " << x;

	cout <<"nnn";
	return 0;
}

من المثال السابق عرفنا مؤشر في تعريف الدالة وهو poinX ثم في جسم الدالة مررنا العنصر بالعنوان &x لأننا عرفنا مؤشر في الإعلان عن الدالة و ستلاحظ عندما تدخل أي قيمة أن المتغير بعد استخدامه يأخذ القيمة التي حصل عليها في جسم الدالة أي بعد استدعاء الدالة ستتغير قيمة المتغير الممرر جرب ذلك بنفسك ...

آسف للإطالة ولكن سنكمل الدرس في الأيام القادمة إن شاء الله.

الدرس القادم سنتناول أمثلة على التمرير بالمؤشرات وسندرس التمرير بالاشارات....

اللهم علمنا ما ينفعنا وأنفعنا بما علمتنا أنك أنت العليم الحكيم

سبحان الله وبحمده سبحان الله العظيم

لاحول ولاقوة الا بالله( كنز من كنوز الجنة ).

هذا الموضوع مغلق.

مواضيع مشابهة