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

ماهي فائدة المراجع ؟؟ references ؟؟؟؟؟(درس)

مغلق
بدأه Ferrum في 1 يناير 2007 · 3 رد · 1,094 مشاهدة · في لغة C و ++C
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

الكثير يتسائل ماهي فائدة المراجع ؟؟

خلونا نبتدي بكود بسيط

#include <iostream>
#include <conio.h>

using namespace std;


int func(int x)
{
	 if (x >0)
	 cout << "You entered a positive number." << endl;
	 else if (x < 0)
	 cout << "You entered a negative number." << endl;
	 else 
	 cout << "You entered a zero." << endl;   
	  return x;   
}


int main()
{
	int response = 0;
	cout << "Enter a number please: "; cin >> response;
	func(response); //Passing value in function 


	getch();
	return 0;
}

اهني لما مررنا قيمة المتغيرresponse إلى الدالة func ، اخذنا نسخة من المتغير response (ركز كل تفكيرك على كلمة نسخة حتى تفهم المراجع في هذا الدرس البسيط)

تخيل انت قاعد تكتب ورقة ، رحت مكتبة و سويت ألف نسخة للورقة ، عشان تشتغل عليها و تعدل ، و خليت النسخة الأصلية محفوظة عندك. هكذا تعمل تمرير قيمة إلى دالة ، فأحنا لما مررنا قيمة response مررنا نسخة منه و ليس المتغير reponse بكبر راسه ، هذا يعني أن لما تنتهي الدالة func و نرجع إلى main ترجع قيمة response إلى صفر كما حددناها بالأول

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

ألقي نظرة على هذا الكود :

#include <iostream>
#include <conio.h>

using namespace std;

void swapOne(int x, int y)
{
int temp = x;
x = y;
y = temp;
}

void swapTwo(int& x, int& y) /*Notice that any value passed through x and y 
means the WHOLE thing is passed, not just a copy of it */
{
int temp = x;
x = y;
y = temp;
}


int main()
{
   int myScore = 10;
   int yourScore =  20;


	cout << "Calling swapOne" << endl;
	swapOne(myScore, yourScore);
	cout << "myScore = " << myScore << endl;
	cout << "yoruScore = " << yourScore << endl << endl;


	cout << "Calling swapTwo" << endl;
	swapTwo(myScore, yourScore);
	cout << "myScore = " << myScore << endl;
	cout << "yourScore = " << yourScore << endl << endl;
	getch();
	return 0;
}

في الدالة مررنا قيمة myScore و yourScore بدون مراجع ، و بهالطريقة ، مررنا فقط نسخة من المتغيرات إلى الدالة ، لكن في الدالة القيمة تتبدل..... نعم لن تصدق ففي الدالة swapOne قيم المتغيرين تتبدال ، فتصبح قيمة myScore عشرون و قيمة yourScore عشرة ، و لكن عندنا تنتهي الدالة ، "تحترق النسخة" وو ترجع القيم إلى أماكنها ، لتأكيد هذا الكلام ، لما نرسل المتغيرين إلى الكائن cout بعدما أرسلناهم إلى الدالة swapOne نرى القيم نفس ما هي

اما الدالة swapTwo فتأخد المتغيرين بالمراجع ، اي تأخذ المرجع كله برمة راسه ، و تاخذه و تعالجه ، هنا في الدالة swpaTwo تتبادل القيم ، تماما كما حدث في الدالة swapOne بس احنا قلنا "تم تمرير المتغير برمة رأسه"

يعني لما يطلع المتغير من الداالة يأخذ تغيره معاه ، و لنأكد ذلك أرسلت المتغيرين إلى الكائن cout بعدما عالجتهم في الدالة swapTwo ، و راح تلاحظ ان القيم تبادلت اماكنها ;)

خلاصة الدرس : المراجع تستخدم لأخذ القيمة و تمريرها إلى دالة ليتم معالجتها و إخراجها إلى الدالة الرئيسية main بشكل ثاني تماما :) هذه العملية تسمى "تمرير عن طريق مرجع" Passing By Reference

بعكس إذا ادخلت قيمة إلى دالة بدون مرجع ، فسيتم اخذ نسخة من القيمة ، و هذه العملية تسمى تمرير بالقيمة Passing By Value

أتمنى استفدتوا من الدرس :)

تحياتي ،،،

فيرم

:::كوت بو 6:::

IDE : Microsoft Visual Studio 2005 Pro

#2

السلام عليكم

شكرا أخي الكريم والله يبارك فيك درس جيد جدا

اقتباس
بكبر راسه
:lol:
اقتباس
بس احنا قلنا "تم تمرير المتغير برمة رأسه"

يعني لما يطلع المتغير من الداالة يأخذ تغيره معاه

فقط مجرد تعقيب بسيط , يتم ارسال عنوان (the address of)المتغير في الذاكرة الى الدالة

وشكرا مرة أخرى وأرجوا ان نرى المزيد من الدروس القيمة ان شاء الله

والله أعلم

سبحانك اللهم وبحمدك أشهد ان لا اله الا أنت

أستغفرك وأتوب اليك

الهم صلي وسلم وبارك على سيدنا وحبيبنا محمد

#3

يعطيك العافية أخوي...فعلاً هذا شيء مهم ويفوووووووووووووت علينا دائماً..

أحب أزيد بالنسبة لل array

اذا أرسلنا الarray وغيرنا قيمها..راح تتغير جميع القيم..لأن اسم الarray عبارة عن عنوان

مثال:

void change(int arr[]){
  for(int i=0;i<3;i++)
  arr=0;
}

int main(){
  int arr[3]={2,3,4};
  for(int i=0;i<sizeof(arr);i++)
	cout<<arr<<"-";

  change(arr);
  cout<<endl;
// هنا سيت عرض أرقام المصفوفة كما هي 2-3-4
  for(int i=0;i<sizeof(arr);i++)
	cout<<arr<<"-";
// هنا سيتم تغيير محتوى المصفوفة الى 0-0-0
  return 0;
}

ونفس الشيء بالنسبة للpointers ..

تحيــــــــــــــاتي

What a Wonderful World

#4

بالفعل :) ، فإذا حبيتي تمرير array و تخافين عليها التغيير تمررينها بمرجع او مؤشر :)

:::كوت بو 6:::

IDE : Microsoft Visual Studio 2005 Pro

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

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