ايه الفرق بين Passing arrays by reference و passing arrays by value?
و ايه معنى كل واحدة؟
ايه الفرق بين Passing arrays by reference و passing arrays by value?
و ايه معنى كل واحدة؟
عندما تنشئ مصفوفة .. مثلاً بهذا الشكل :
int A[50];
فإن المتغير A هو مؤشر يشير إلى أول عنصر في المصفوفة .. بمعنى أنه كلمة A في الكود هي هي كلمة
&A[0]
و أما الوصول إلى عناصر المصفوفة فتكون كلمة
A[5]
هي هي كلمة
A+5
أي عندما نتخيل أن هذا مؤشر فمعنى تلك الكلمة أننا نريد أن نضيف على العنوان الذي في هذا المؤشر 5 أماكن .. فمثلاً المؤشر الذي من نوع عدد صحيح إذا كانت A قيمتها العنوان 777 فإن A+5 ستعني 797 لأننا أضفنا 20 بايت لأن كل مكان في العدد الصحيح هو 4 بايت ..
عندما نمرر مصفوفة للدالة فإننا نقول:
void Func(int R[]);
ثم عندما نريد إستدعاء الدالة نقول
Func(A);
فنحن قد ذكرنا للدالة عنوان أول عنصر و هي ستصل لباقي العناصر عن طريق المصفوفة
فإذا كانت قيمة R هي هي قيمة A بعد أن مررناها للدالة فإننا عندما نريد الكتابة على
R[5]
و طبعاً قيمة R تساوي قيمة A تساوى 777 (كما معنا في هذا المثال) و لذلك فنحن سنكتب على R+5 أي على 797 .. تماماً كأننا نكتب على A+5 ..
أما في تمرير المتغيرات العادية .. نقول:
void Func(int R);
و عندما نستدعي الدالة و نمرر لها المتغير u الذي قيمته مثلاً 8 نقول :
Func(u);
عندئذ لم نذكر أي عناوين في الذاكرة .. فقيمة u ستمرر إلى المتغير R .. و لنفرض أن المتغير R في المكان 999 و المتغير u في 900 فإننا عندما نكتب على قيمة R فإننا نكتب على المكان 999 و ليس 900
و ليس هناك طريقة لتمرير مصفوفة بالقيمة .. لأن المصفوفة تتعامل مع المؤشرات و العناوين
و لذلك يمكننا أن نحجز مصفوفة عن طريق المؤشر .. فنقول
int *A; A = new int[20];
حيث أن الأمر new سيقوم بحجز 20 مكان للأعداد الصحيحة .. أي 80 بايت ثم يرجع لنا عنوان أول بايت في هذه ال80 بايت .. مثلاً أرجع لنا قيمة 80000 .. هكذا أصبح A يحمل قيمة 80000 لذلك عندما نقول
A[5]
فإنها تعني A+5 أي 80000+5*4 يعني المكان رقم 80020 و هو عنوان موجود في النطاق الذي قمنا بحجزه و تستطيع الكتابه عليه ..
ايه الفرق بين Passing arrays by Reference و passing arrays by value?
و ايه معنى كل واحدة؟
الفرق هو كاالتالي
passage by refrence
انا ابعت عنوان المتغير للدالة واي تغيير في المتغير داخلها هو تغير لقيمة المتتغير في كل البرنامج
امااااااا في التاني فانا ابعت قيمتها فقط واي تغيير داخل الدالة لا يمس قيمة المتغير خارجها.
تم تعديل هذه المشاركة بواسطة djug في 8 ديسمبر 2008 في 22:29 — السبب: تصغير حجم الخط....يرجى الكتابة بخط عادي في الم
#include <stdio.h>
#include <stdlib.h>
void myFunc(int *Tab);
int Tab[3]={1,2,3};
void main ()
{
myFunc(Tab);
}
void myFunc(int *Tab)
{
printf("%d\n",Tab[0]);
printf("%d\n",Tab[1]);
printf("%d\n",Tab[2]);
free(Tab);
}هذا مثال كتبته لك لتفهم المبدا
لاحظ ان التعامل مع المؤشر يكون كالتعامل مع الجدول
تجنب ارسال جدول بحجم كبير BY VALUE لان الجدول سيكون ضخما و سوف تضيع ذاكرة كبيرة دون فائدة
ملاحظة لا تنسى ان تحرر المؤشر عند الخروج من الدالة :lol:
العمل كثير و الوقت قليل أعاننا الله