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

مؤشر إلى مؤشر والمصفوفات متعدد الأبعاد

بدأه Islamic_Empire في 20 سبتمبر 2008 · 5 رد · 928 مشاهدة · في لغة C و ++C
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بحثت في المنتدى عن أي معلومات بشأن موضوع مؤشر إلى مؤشر Pointer to a pointer ما هي خواصه استخداماته ..... إلخ عدا عن ذكر استخدامه في تحديد حجم متغير للمصفوفات متعدد الأبعاد

فهل من مجيب؟

قرأت عدة مواضيع عن المصفوفات وعلاقتها بالمؤشرات :

طبعا نعلم بأن اسم المصفوفة هو نفسه مؤشر لأول عنصر , و لكن ماذا عن المصفوفات متعددة الأبعاد Multidimentional arrays قمت ببعض التجارب على نفس المبدأ ولكن فشلت

فهل لدى الإخوة أي معلومات بهذا الشأن أو أي مرجع

انتظر اجابتكم

#2
	int a=2,b=2;
	int **x=new int*[a];

	for(int i=0;i<a;i++)
		x=new int;

	for(i=0;i<a;i++)
	for(int j=0;j<b;j++)
		{
			cout<<"["<<i+1<<"]["<<j+1<<"] :";
			cin>>x[j];
		}

	for(i=0;i<a;i++)
	for(int j=0;j<b;j++)
	cout<<"Value ["<<i+1<<"]["<<j+1<<"] :"<<x[j]<<endl;
llback.jpg

اشهد ان لا إله إلا الله وان محمدا ً رسول الله

#3

اهلا اخي .

استخدم Pointer to Pointer عندما احتاج ان امرر المؤشر بالاشارة وذلك حتى اقدر اغير عنوانه وليس قيمته

Pass pointer by reference or another pointer

وقد تكون الفكرة غريبة نوعا ما ، لكنها مماثلة تماما لتمرير المتغير بالقيمة او الاشارة

Pass variable by reference

خلينا نشوف مثال بسيط لغرض توضيح الفكرة:

[color= #993333;]int head[color= #339933;]=[color= #cc66cc;]10,tail[color= #339933;]=[color= #cc66cc;]5;

[color= #993333;]int main[color= #009900;]([color= #009900;])

[color= #009900;]{

     [color= #993333;]int[color= #339933;]* p[color= #339933;]=&head;

     [color= #000000; font-weight: bold;]function[color= #009900;](p[color= #009900;]);

[color= #009900;]}

 

[color= #993333;]void [color= #000000; font-weight: bold;]function[color= #009900;]([color= #993333;]int [color= #339933;]*p[color= #009900;])

[color= #009900;]{

   [color= #339933;]*p[color= #339933;]=[color= #cc66cc;]4;   [color= #666666; font-style: italic;]// head=4

    [color= #666666; font-style: italic;]// now , how can i change p to point to tail?

   [color= #666666; font-style: italic;]// p=&tail  will change the local p pointer not the p in the main function !

[color= #009900;]}

كما يتضح من الكود ، لا يمكن تغيير عنوان المؤشر الاصلي ، فقط يمكن تغير القيمة التي يشير اليها .

وحل هذه المشكلة هو :

[color= #993333;]int head[color= #339933;]=[color= #cc66cc;]10,tail[color= #339933;]=[color= #cc66cc;]5;

[color= #993333;]int main[color= #009900;]([color= #009900;])

[color= #009900;]{

     [color= #993333;]int[color= #339933;]* p[color= #339933;]=&head;

     [color= #000000; font-weight: bold;]function[color= #009900;]([color= #339933;]&p[color= #009900;]);

[color= #009900;]}

 

[color= #993333;]void [color= #000000; font-weight: bold;]function[color= #009900;]([color= #993333;]int [color= #339933;]**p[color= #009900;])

[color= #009900;]{

   [color= #339933;]**p[color= #339933;]=[color= #cc66cc;]4;   [color= #666666; font-style: italic;]// head=4

   [color= #339933;]*p[color= #339933;]=&tail   [color= #666666; font-style: italic;]// p in the main function point to tail

    [color= #666666; font-style: italic;]// problem is solved

[color= #009900;]}

او من الممكن ان نستخدم Pointer to reference ، كالاتي:

[color= #993333;]int head[color= #339933;]=[color= #cc66cc;]10,tail[color= #339933;]=[color= #cc66cc;]5;

[color= #993333;]int main[color= #009900;]([color= #009900;])

[color= #009900;]{

     [color= #993333;]int[color= #339933;]* p[color= #339933;]=&head;

     [color= #000000; font-weight: bold;]function[color= #009900;](p[color= #009900;]);

[color= #009900;]}

 

[color= #993333;]void [color= #000000; font-weight: bold;]function[color= #009900;]([color= #993333;]int [color= #339933;]*&p[color= #009900;])

[color= #009900;]{

   [color= #339933;]*p[color= #339933;]=[color= #cc66cc;]4;

    p[color= #339933;]=&tail  

    [color= #666666; font-style: italic;]// problem is solved :)

[color= #009900;]}

وهذه الامثلة طبعا ليست عملية ،وعليك ان تفهم الفكرة الى ان تجد تطبيقا لها ،مثلا في برنامج عن Trees يستخدم الاستدعاء الذاتي للدوال ، فانه يجب ان استخدم مؤشر الى المؤشر root الموجود في اعلى الشجرة ، حتى استطيع ان انفذ العمليات عليها من ادخال وحذف وبحث...الخ.

ويكثر استخدامها مع هياكل البيانات .

_________________

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

شكرا.

تم تعديل هذه المشاركة بواسطة SudaNix في 21 سبتمبر 2008 في 10:37

#4

فهمت الفكرة الاولى اخ سودانيك اما بشأن موضوع pointer to reference فلم أفهمها الصراحة هل بإمكانك شرح معنى الكود بشكل مبسط , أعني ماذا يحدث بالضبط

وشكرا للكود أخ time1 مفهوم بحمد الله

#5

اهلا اخي ..

اولا يوجد خطأ لفظي في ردي السابق ، والصحيح هو reference to pointer وليس العكس.

وكل ما قمت به هو عمل reference للمؤشر .

ونحن نعلم ان الاشارات reference هي مجرد alias "اسم مرادف" للشيء الذي نؤشر اليه.

نرجع الى الكود :

 

[color= #993333;]int head[color= #339933;]=[color= #cc66cc;]10,tail[color= #339933;]=[color= #cc66cc;]5;

[color= #993333;]int main[color= #009900;]([color= #009900;])

[color= #009900;]{

     [color= #993333;]int[color= #339933;]* p[color= #339933;]=&head;

     [color= #000000; font-weight: bold;]function[color= #009900;](p[color= #009900;]);

[color= #009900;]}

 

[color= #993333;]void [color= #000000; font-weight: bold;]function[color= #009900;]([color= #993333;]int [color= #339933;]*&p[color= #009900;])

[color= #009900;]{

   [color= #339933;]*p[color= #339933;]=[color= #cc66cc;]4;

    p[color= #339933;]=&tail  

    [color= #666666; font-style: italic;]// problem is solved 

[color= #009900;]}

نبدا من الدالة function ، حيث يرسل لها مؤشر p من الدالة main ، هذا المؤشر المرسل لم يتم استقباله كمؤشر عادي

وانما تم استقباله كـ reference وهذا يتم بسهولة عن طريق وضع العلامة & بعد نوع البيانات .

مثلا لو كانت القيمة المرسلة هي int ، فان الدالة ستستقبله كـ reference كالاتي :

int &

اما لو كانت القيمة المرسلة هي مؤشر "كما في مثالنا" ، فان الدالة ستستقبله كـ reference كالاتي

int* &

لاحظ ان العلامة & تسبق نوع البيانات Data type.

وداخل جسم الدالة سنستخدم p كانها مؤشر عادي ، وبما انها هي alias للمؤشر الموجود في main ، اذا اي تغير فيه

سيطرأ على المؤشر الموجود في الـ main .

واعتذر لو ان الشرح ليس واضح ، لانها يصعب توضيحها باللفظ .

سلام.

#6

لا شكرا اخي شرحك واضح ربما فقط كان من الافضل تسمية ال referenced pointer في الدالة الثانية باسم مختلف

ولكن وصلت الفكرة

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…