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

[ تمت الإجابة ]two dimensional array

مغلق
بدأه nkernel في 29 يونيو 2012 · 7 رد · 621 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

شباب السلام عليكم عندي مشكل وأرجو أن أجد عندكم الحل

int tab[2][2]={1,2,3,4};
printf("%p",tab);
printf("%p",*tab);

النتيجة

0xbfc5523c
0xbfc5523c

لماذا tab and *tab يعطي نفس النتيجة

#2

السلام عليكم

يمكنني القول بأن tab هو مؤشر لمؤشر يشير إلى

&tab[0][0]

لاحظ أن

*tab = &tab[0][0]
and
**tab = tab[0][0] = 1

بانتظار إجابة بقية الأعضاء.

تم تعديل هذه المشاركة بواسطة أحمد الشنقيطي في 30 يونيو 2012 في 00:12

1
#3

لقد فتحت برامج Dia وقمت برسم فكرة الفرق بين اسم المصوفة واسم مؤشر المصفوفة قد تكون الصورة ابلغ من النص.

ان كان هناك اي استفسار ؟

post-247365-058721100 1341209894_thumb.p

هذا والله ولى التوفيق

المرفقات
Screenshot at 20120701.png

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

#4

@محمد عودة

حسب الصورة فإن :

tab = 0xfffaaa
and
*tab = 0xfffccc

هذا مثال يُوضح الصورة :

#include<stdio.h>
int main() {
    int x = 1, *p1 = &x, **p2 = &p1;
    printf("%p\t%p\n",&p2,p2);
    printf("%p\t%p\n",&p1,p1);
    printf("%p\t%d\n",*p2,**p2);
    return 0;
}

المُخرجات :

0022FF14        0022FF18

0022FF18 0022FF1C

0022FF1C 1

Process returned 0 (0x0) execution time : 0.183 s

Press any key to continue.

لاحظ أن p2 و *p2 مُختلفان !

السؤال الآن : لماذا يكون tab و *tab مُتساويان ؟؟

تم تعديل هذه المشاركة بواسطة أحمد الشنقيطي في 2 يوليو 2012 في 14:22 — السبب: إضافة المثال.

#5

أشكر الاخوة على الرد

الشرح

#6

و هل أجاب الأخ Salem على هذا السؤال ؟ :

اقتباس
لماذا يكون tab و *tab مُتساويان ؟؟
#7

يبدو أن الأخ أحمد الشنقيطي لم يدقق جيدا في الاجابة

اقتباس
لماذا يكون tab و *tab مُتساويا

ببساطة لو اعتبرنا tab مؤشر فان قيمة tab) tab*)&

لكن لو اعتبرنا tab مصفوفة فان قيمة tab هي نفسها قيمة tab*

لان tab كتلة واحدة وبالتالي لا يمكن وضع tab في عنوان و tab* في عنوان عكس المؤشر فان عنوانه وعنوان القيمة التي يشر اليها منفصلين

لذا فان من الخطأ اعتبار المصفوفه مثل المأشر لأ المأشر يمكن تغيير قيمته

int main()
{
int*p;
int tab[2][2]={1,2,3,4};
p=tab;
printf("%d",*p);
p=p+1;
printf("%d",*p);

}

عكس المصففة

int main()
{
int*p;
int tab[2][2]={1,2,3,4};
printf("%d",**tab);
tab=tab+1;
printf("%d",**tab);


}

باختصار يمكن اعتبار tab كسلم وتدريجاته كعناصر tab فأنت لاتستطيع فصل السلم عن التدريجات

#8
اقتباس
لكن لو اعتبرنا tab مصفوفة فان قيمة tab هي نفسها قيمة tab*

المتغير tab عبارة عن مؤشر و المؤشر لا يملك قيمة بل عنوانا !

اقتباس
لان tab كتلة واحدة وبالتالي لا يمكن وضع tab في عنوان و tab* في عنوان عكس المؤشر فان عنوانه وعنوان القيمة التي يشر اليها منفصلين

اتضحت الفكرة, أشكرك على الشرح :)

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

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