شباب السلام عليكم عندي مشكل وأرجو أن أجد عندكم الحل
int tab[2][2]={1,2,3,4};
printf("%p",tab);
printf("%p",*tab);النتيجة
0xbfc5523c 0xbfc5523c
لماذا tab and *tab يعطي نفس النتيجة
شباب السلام عليكم عندي مشكل وأرجو أن أجد عندكم الحل
int tab[2][2]={1,2,3,4};
printf("%p",tab);
printf("%p",*tab);النتيجة
0xbfc5523c 0xbfc5523c
لماذا tab and *tab يعطي نفس النتيجة
السلام عليكم
يمكنني القول بأن tab هو مؤشر لمؤشر يشير إلى
&tab[0][0]
لاحظ أن
*tab = &tab[0][0] and **tab = tab[0][0] = 1
بانتظار إجابة بقية الأعضاء.
تم تعديل هذه المشاركة بواسطة أحمد الشنقيطي في 30 يونيو 2012 في 00:12
C++ and Java, say, are presumably growing faster than plain C, but I bet C will still be around. ― Dennis Ritchie
~OoO~________--------------------------------------------________~OoO~
من مواضيعي :
لقد فتحت برامج Dia وقمت برسم فكرة الفرق بين اسم المصوفة واسم مؤشر المصفوفة قد تكون الصورة ابلغ من النص.
ان كان هناك اي استفسار ؟
هذا والله ولى التوفيق
@محمد عودة
حسب الصورة فإن :
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 — السبب: إضافة المثال.
C++ and Java, say, are presumably growing faster than plain C, but I bet C will still be around. ― Dennis Ritchie
~OoO~________--------------------------------------------________~OoO~
من مواضيعي :
و هل أجاب الأخ Salem على هذا السؤال ؟ :
اقتباسلماذا يكون tab و *tab مُتساويان ؟؟
C++ and Java, say, are presumably growing faster than plain C, but I bet C will still be around. ― Dennis Ritchie
~OoO~________--------------------------------------------________~OoO~
من مواضيعي :
يبدو أن الأخ أحمد الشنقيطي لم يدقق جيدا في الاجابة
اقتباسلماذا يكون 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 فأنت لاتستطيع فصل السلم عن التدريجات
اقتباسلكن لو اعتبرنا tab مصفوفة فان قيمة tab هي نفسها قيمة tab*
المتغير tab عبارة عن مؤشر و المؤشر لا يملك قيمة بل عنوانا !
اقتباسلان tab كتلة واحدة وبالتالي لا يمكن وضع tab في عنوان و tab* في عنوان عكس المؤشر فان عنوانه وعنوان القيمة التي يشر اليها منفصلين
اتضحت الفكرة, أشكرك على الشرح :)
C++ and Java, say, are presumably growing faster than plain C, but I bet C will still be around. ― Dennis Ritchie
~OoO~________--------------------------------------------________~OoO~
من مواضيعي :
هذا الموضوع مغلق.