MR.SD

الفرق بين المصفوفات والمؤشرات .. في لغة سي ++ ..

10 ردود في هذا الموضوع

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

قرأت ورأيت كثيرا ممن يعتبر ان المصفوفات هي مؤشرات .. او ان المصفوفة بحد ذاتها هي مؤشر ..

تقنيا .. هذا الامر خاطئ ..لايوجد شئ في عالم البرمجة اسمه المصفوفة هي مؤشر ..

اذا ماهي المصفوفة ..؟؟

المصفوفة هي اي متغير في لغة السي او السي ++ .. ميزتها التي تفرق انها متغير ولكن تحت اسمها عدة متغيرات ..

لنأخذ المثال التالي ..

int arr[3]={3,4,5};
cout<<arr;

ماهو اخراج هذا الكود .. ؟؟

بالتأكيد الاخراج سيكون عنوان ...

ولكن عنوان .. قلنا عنوان .. ولم نقل مؤشر .. وهذا فرق كبير بين العنوان والمؤشر ..

ولكن انت ستقول بما انه طبعنا اسم المصفوفة فقط كانت النتيجة عنوان اذا اسم المصفوفة سيكون مؤشرا ..

ولكن هذا امر خاطئ .. والدليل .. لو اخذنا الكود التالي ..

int var;
cout<<&var;

هذا الكود سيطبع ايضا عنوان .. ولكن عنوان المتغير .. والعنوان لن يطبع الا باستخدام عامل العنونة & .. اما لو كان الكود بهذه الصيغة ..

int var;
cout<<var;

فالاخراج سيكون محتوى هذا المتغير .. وليس عنوانه ..

سأوضح الامر كله الان ..

كل المتغيرات تحجز مكانا في الذاكرة ... وكل متغير محجوز في الذاكرة (بعد الحجز) يصبح له عنوان .. والمعالج CPU يتعامل مع المتغيرات بواسطة هذه العنواوين .. والتعامل هذا يكون خزن او تغيير قيمة او اي شئ اخر على تلك المتغيرات ..

فمن هنا نأتي الى امر مهم وهو ان المتغيرات كلها لها عناوين (كلها) ليس فقط تلك التي نؤشر عليها باستعمال مؤشر كما في الكود التالي ..

int* ptr=&intvar;

فالمتغير intvar له عنوان في الذاكرة يتم التعامل معه من قبل المعالج سواء تم التأشير عليه بمؤشر ام لا ..

ومن ما قلته اعلاه ..

المصفوفة هي شئ مشابه للمتغيرات .. فقط هي مجموعه من متغيرات .. تكون هذه المتغيرات من نفس النوع جميعها ..

ولكن هناك قاعدة مهمه .. وهي ان السي++ تنظر الى المصفوفة باسمها (اي عندما نكتب arr ققط) على انها مؤشر لاول موقع من تلك المصفوفة ..

فالكود الاول ..

code]int arr[3]={3,4,5};
cout<<arr;

اخراجه سيكون عنوان والعنوان هو عنوان اول موقع من المصفوفة اي ان الكود السابق يعوض عن الكود التالي ..

&arr[0]

لو كتبنا اسم المصفوفة فقط سيطبع عنوان اي انه عملية مشابهه لاستخدام عامل العنونه مع الموقع الاول من المصفوفة ..

ارجو ان يكون الحال لهنا جيد .. وكل الكلام مفهوم ..

نصل الان الى سؤال مهم ممكن ان يساله شخص يقرأ هذا الموضوع وهو ..

ما هو اخراج الكود الذي يستعمل الكود التالي ..

cout << &arr

اي انه استعمل عامل العنونه مع اسم المصفوفة ..

بالتاكيد الاخراج سيكون نفس الاخراج السابق وهو عنوان الموقع الاول من المصفوفه ..

اي انه لو استعملنا اسم المصفوفة لوحده للطباعه او اسمها مع عامل العنونه فالاخراج هو عنوان الموقع الاول منها ..

اي انه سؤشر على عنوان الموقع الاول منها ..

اي اننا نصل الى الاثبات التالي ..

The value of &arr and arr is the same

وهي بجميع الاحوال ..

address of the first element

لنأخذ المثال التالي ..

int arr[3]={3,4,5};
cout<<"First element of the array: "<<arr[0] <<endl;
cout<<"Address of the first element: "<<&arr[0] <<endl;
cout<<"Address of the array: "<<arr <<endl;
cout<<"So what is this? "<<&arr <<endl;

الاخراج سيكون كالتالي ..

اول سطر سيطبع القيمة التي في الموقع الاول .. اي انه سيطبع 3 ..

ثاني سطر سيطبع عنوان الموقع الاول ..

ثالث سطر سيطبع ايضا عنوان الموقع الاول .. اي نفس الاخراج للسطر الثاني ولكن باستعمال صيغة مختلفة ..

رابع سطر ايضا سيطبع عنوان الموقع الاول .. اي نفس اخراج السطرين الثاني والثالث ولكن باستعمال صيغة اخرى ..

لنأخذ المثال التالي ..

int arr[3]={3,4,5};
cout<<"Address of the first element: "<<&arr[0]+1 <<endl;
cout<<"Address of the array: "<<arr +1<<endl;
cout<<"So what is this? "<<&arr +1<<endl;

السطر الاول سيطبع عنوان الموقع الثاني من المصفوفه .. وهو ناتج من جمع عنوان الموقع الاول مع 1 ..

السطر الثاني سيطبع ايضا عنوان الموقع الثاني .. ولكن بصيغة مختلفه ...

السطر الثالث هنا يختلف .. لانه سيطبع اول موقع في الذاكرة بعد المصفوفة ... اي بعد انتهاء اخر موقع من هذه المصفوفة ..

بالتاكيد فيكم الان من يسال السؤال التالي ..

وهو انني كتبت قبل قليل انه عند استخدام اسم المصفوفة في الطباعة سيطبع عنوان اول موقع .. وعند استخدام اسم المصفوفة مع عامل العنونه & فانه سيطبع ايضا عنوان اول موقع .. ولكن الان لماذا اصبح هناك اختلاف عند اضافة 1 الى الاثنين ..؟؟؟

والاجابة بكل بساطة ستكون عند اضافة 1 الى &arr فانه سيطبع عنوان اول موقع بعد المصفوفه وهذا يختلف عما اذا اضفنا 1 الى arr فقط من دون استخدام عامل العنونه .. لانه عند استخدام العامل مع الاسم فانه يشير الى عنوان الموقع الاول من تلك المصفوفه وعند جمع 1 مع هذا التاشير فانه يشير الى مابعد انتهاء المصفوفة المؤشر عليها .. وهذا يختلف عند استخدام اسم المصفوفة فقط مع 1 .. لان سيطبع الموقع الثاني من تلك المصفوفة ..

امثله عن المصفوفات والمؤشرات والعلاقه بينها ..ولتوضيح ما تم ذكره اعلاه ..

المثال الاول ..

int arr[3]={1,3,4};		 //Declares an array with 3 elements
int * ptr=arr; //Initialize pointer ptr with the address of array arr
cout<<*(arr+2)<<endl;
cout<<*(ptr+2)<<endl;

/* output */
4
4

المثال الثاني ..

int arr[3]={1,3,4};		 //Declares an array with 3 elements
int * ptr=arr; //Initialize pointer ptr with the address of array arr
cout<<arr[2]<<endl;
cout<<ptr[2]<<endl;

/* output */
4
4

المثال الثالث ..

int *ptr=new int[3]; 
ptr[0]=12;
ptr[2]=3;
cout<<ptr[2];

/* output */
3

المثال الرابع ..

int ar[2]={8,2};
int var1=66;
int var2=111;
int* ptarray[5];
ptarray[0]=ar;
ptarray[1]=&ar[1]; //Address of second element of array ar
ptarray[2]=&var1;
ptarray[3]=&var2;
ptarray[4]=&ar[0];
// To keep code small I use a loop
for(int i=0;i<5;i++)
cout<<*(ptarray[i])<<endl;

/* output */
8
2
66
111
8

المثال الخامس ..

void test(char v[]);

int main(){
char a[53];
//a="If a is an array, this line should generate an error";
test(pta);
return 0;
}

void test(char v[]){
v="If v is an array, this line should generate an error";
cout<<v<<endl;
}

__________________________________________________________________________

بعد ان تقرأوا كل ما ورد اعلاه من شرح ومن اكواد .. وتفهموه وتستوعبوه .. ارجو منكم الاجابة على السؤال التالي .. وهو يتعلق بصلب الموضوع ..

لديكم الكود التالي ..

int x[4]= { 1,2,3,4};

cout << x[0]+1;

الاخراج سيكون على الشاشة .. رقم 2 ,, من اين جاء هذا الرقم ..؟؟؟؟؟

ارجو ان تكون هذه المقالة واضحه .. اردت ان اوضح شيئا لكم عن المصفوفات والمؤشرات ..

واي خطأ قد وقعت به اثناء الكتابة .. او اي تعقيب على الموضوع .. او اي شئ اخر .. مرحب به ..

والعضو الذي يرى انه فهم الموضوع ارجو ان يكتب اجابته على السؤال الذي وضعته في نهاية الشرح ..

تحياتي العطرة للجميع ..

تم تعديل بواسطه HGB
أقواس غير مغلقة في الكود
1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم ورحمة الله وبركاته....

استاذي سنان : أشكرك أولاً على جهودك الطيبه...

قرأت ورأيت كثيرا ممن يعتبر ان المصفوفات هي مؤشرات .. او ان المصفوفة بحد ذاتها هي مؤشر ..

كنت أقول ذلك ....

لم أكن أعلم أنها فعلاً خاطئة...

استاذي في المثال الخامس:

ما المقصود بـpta ؟!

الاخراج سيكون على الشاشة .. رقم 2 ,, من اين جاء هذا الرقم ..؟؟؟؟؟

بزيادة واحد على قيمة العنصر الأول...

أرجوا أن تكون إجابتي صحيحة...

دمتم في رعاية الله،،

تم تعديل بواسطه العواجي
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

شكرا سنان...

أضيفو هذه الجمله فقط لتتذكرو دائما الفرق.

Pointers = Dynamic Matricies

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم...

x[0]+1

هذه عملية حسابية وهي اضافة واحد الي العنصر الاول في المصفوفة وهذا العنصر يحتوي علي رقم واحد

فيصبح الناتج 2

.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم ,,

رائع أخي سنان,

رغم أن الموضوع يطول فيه الحديث, و لكن كلامك صحيح و غير صحيح في نفس الوقت :blink: :D

إذا تكلمت بشكل مجرد عن المصفوفات فهي ليست أكثر من مؤشرات, و يصبح كلامك غير صحيح :lol:

أما إذا تكلمنا عن كيفية تعامل لغة ++C معها فهي لا تعاملها على أنها مؤشرات و في هذه الحالة يصبح كلامك صحيحاً :D

باختصار المصفوفات هي مؤشرات تعاملها لغة ++C بطريقة خاصة,

أسجل إعجابي بموضوعك,,

تحياتي ,,

تم تعديل بواسطه Khaled.Alshaya
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

اهلا اخوتي ..

اشكركم على مشاركتكم في الموضوع ..

اخي العواجي اجابتك صحيحه 100% للسبب الذي ذكره الاخ garo ..

حيث ان العنصر الاول هو 1 وعند جمع 1 مع قيمة العنصر الاول فانها تؤدي الناتج 2 ..

واعتذر عن الخطأ الذي حصل في المثال الخامس المقصود ب pta هو مؤشر للمصفوفة ..

اهلا اخي خالد ..

بالفعل هذا الموضوع طويل وندخل بتعقيدات لو تكلمنا عنه .. ولكن المصفوفة ممكن ان تكون مؤشر في حالات .. ولكن بواقع الحال هي ليست مؤشر .. والاسباب ذكرتها في الموضوع ..

تحياتي العطرة لكم جميعا ..

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

جزاك الله كل خير على الشرح الوافي ...

كنت أبحث عن شرح لهذا الموضوع من فترة ..

LYALY

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

يقال في الإعادة إفادة ،قد أفدتني في الكثير و أتممت لي الناقص على الأقل 90 %.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

الشرح باللغة الإنجليزية المبسطة وهو مخصص للغة الـC لكن لا أظن أنه يوجد فرق بهذا الخصوص بين الـC و الـ ++C ..

هنا الرابط http://www.4shared.com/file/37816671/d2419...rified=39a43061

وإذا لم يعمل الصوت عليك بتحميل الملف بجهازك مباشرة ومشاهدته هناك.

يمكنك تشغيل الملف عن طريق برنامج Quicktime أو عن طريق المتصفح إذا كان يشغل ملفات mov .

شكراً لك أخي سنان لقد جعلتني أنشط ذاراكرتي لأن هذه الأشياء قد تنسى مع الوقت.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
زوار
This topic is now closed to further replies.

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .