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

ما هو تفسير هذا الكود في لغة السي

مغلق
بدأه Amjad.IT في 10 أكتوبر 2006 · 11 رد · 837 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

أريد أن أعرف ما هو ناتج هذا الكود وما هو تفسير ذلك:

لقد قمت بتنفيذه ولكن الناتج لم يمكن حسب ما توقعت، أرجو منكم أن تساعدوني في فهمه:

#include<stdio.h>
#include<conio.h>

void f1 (int *);
void f2 (int **);
void f3 (int ***);

void main () {
	clrscr();
	int x=2;
	int *ptr1 = &x;
	int **ptr2 = &ptr1;
	int ***ptr3 = &ptr2;
	printf ("%d - %d - %d - %d\n", x, *ptr1, **ptr2, ***ptr3);
	f1 (ptr1);
	f2 (ptr2);
	f3 (ptr3);
	printf ("%d - %d - %d - %d\n", x, *ptr1, **ptr2, ***ptr3);
	getch();
}

void f1 (int *ptr1) {
	*ptr1 = *ptr1 + 2;
}

void f2 (int **ptr2) {
	*ptr2 = *ptr2 +1;
}

void f3 (int ***ptr3) {
	*ptr3 = *ptr3 +2;
}

وجزاكم الله خيراً

#2

ما الناتج الذي كنت تتوقعه؟

هل كنت تتوقع

2 - 2 - 2 - 2
7 - 7 -  7 - 7

إن كنت تتوقع هذه النتيجة فهناك جزء من الكود يجب تغييره كالآتي

void f2 (int **ptr2) {
	**ptr2 = **ptr2 +1;
}

void f3 (int ***ptr3) {
	***ptr3 = ***ptr3 +2;
}

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

"First they ignore you, then they laugh at you, then they attack you, then you win"

===

اقتباس

حُكَّامُـنَا إِنْ تَصَـدّوا لِلْحِمَــى اقْتَحَمُـوا ***** وَإِنْ تَصَدَّى لَـهُ المُسْتَعْمِـرُ انْسَحَبُـوا

هُمْ يَفْرشـُونَ لِجَيْـشِ الغَــزْوِ أَعْيُنَـهُـمْ ***** وَيَدَّعُــونَ وُثُـوبَـاً قَـبْـلَ أَنْ يَثِـبُــوا

الحَاكِمُـونَ و«وَاشُنْـطُـنْ» حُكُومَتُـهُـمْ ***** وَاللامِعُــونَ وَمَـا شَعَّـوا وَلا غَرَبُــوا

القَاتِلُـــونَ نُبُــوغَ الشَّـعْــبِ تَرْضِـيَـــةً ***** لِلْمُعْتَدِيــنَ وَمَـا أَجْـدَتْـهُـمُ الـقُــرَبُ

لَهُمْ شُمُـوخُ «المُثَنَّـى» ظَاهِـرَاً وَلَهُـمْ ***** هَـوَىً إِلَـى بَابَـك الخَرْمِـيّ يُنْتَسَـبُ

البردوني "أبو تمام وعروبة اليوم" 1971

===

اقتباس
عبيد الهوى يحكمون البـلاد ***** ويحكمهــم كلّهـــم درهــــــم

و تقتـادهـم شهـوة لا تنــام ***** وهـــم فـي جـهالتهــم نــــوّم

ففــي كـــلّ ناحيــة ظـالـــم ***** غبــــــيّ يسـلـّطــــه أظلـــم

أيا من شبعتم على جوعــنا ***** وجـــوع بنينـا ألـم تتخمـــوا ؟

ألم تفهموا غضبة الكادحين ***** على الظلـم ؟ لا بدّ أن تفهموا

البردوني "نحن و الحاكمون "

#3

أشكرك على مرورك

ولكن ليس هذا ما أردت، وأنا أريد الكود كما هو بدون أي تعديل، ولكن أردت ان اعرف كيف تم ذلك؟؟

الناتج هو:

2 - 2 - 2 - 2
4 - 0 - 0 - 0

كل ما أريد معرفته هو كيف ظهرت الأصفار ومن أين أتت؟؟

انظر الى f2 ، ما الذي حدث فيه؟؟ هل تم تغيير العنوان الذي يؤشر إليه ptr1؟؟ وإلى أي عنوان أصبح يؤشر؟؟ وكذلك أيضاً بالنسبة للبقية.

#4
اقتباس
انظر الى f2 ، ما الذي حدث فيه؟؟ هل تم تغيير العنوان الذي يؤشر إليه ptr1؟؟ وإلى أي عنوان أصبح يؤشر؟؟ وكذلك أيضاً بالنسبة للبقية.

ptr2 كان يؤشر الى عنوان ptr1 ولنقل أن هذا العنوان 0x124

أي

&ptr1=0x124
أو
*ptr2=0x124

عند تنفيذ

*ptr2 = *ptr2 +1;

فسيكون الناتج

&ptr1=0x126
أو
*ptr2=0x126

أي أن ptr2 أصبح يشير لمكان أخر لذا فقيمة **ptr2 لن تكون هي قيمة x وستكون قيمة عشوائية .. وبالمثل بالنسبة لـ ptr3

بإمكان إضافة جملة printf قبل استدعاءات الدوال f1, f2 ,f3 لمعرفة قيم

ptr1,*ptr1
ptr2,*ptr2,**ptr2
ptr3,*ptr3,**ptr3,***ptr3

يفضل إستخدام %x لتحصل على قيمة بالنظام الستعشري ..

كما قلت لك مسبقاًَ قلم وورقة ستتضح لك الأمور أكثر

"First they ignore you, then they laugh at you, then they attack you, then you win"

===

اقتباس

حُكَّامُـنَا إِنْ تَصَـدّوا لِلْحِمَــى اقْتَحَمُـوا ***** وَإِنْ تَصَدَّى لَـهُ المُسْتَعْمِـرُ انْسَحَبُـوا

هُمْ يَفْرشـُونَ لِجَيْـشِ الغَــزْوِ أَعْيُنَـهُـمْ ***** وَيَدَّعُــونَ وُثُـوبَـاً قَـبْـلَ أَنْ يَثِـبُــوا

الحَاكِمُـونَ و«وَاشُنْـطُـنْ» حُكُومَتُـهُـمْ ***** وَاللامِعُــونَ وَمَـا شَعَّـوا وَلا غَرَبُــوا

القَاتِلُـــونَ نُبُــوغَ الشَّـعْــبِ تَرْضِـيَـــةً ***** لِلْمُعْتَدِيــنَ وَمَـا أَجْـدَتْـهُـمُ الـقُــرَبُ

لَهُمْ شُمُـوخُ «المُثَنَّـى» ظَاهِـرَاً وَلَهُـمْ ***** هَـوَىً إِلَـى بَابَـك الخَرْمِـيّ يُنْتَسَـبُ

البردوني "أبو تمام وعروبة اليوم" 1971

===

اقتباس
عبيد الهوى يحكمون البـلاد ***** ويحكمهــم كلّهـــم درهــــــم

و تقتـادهـم شهـوة لا تنــام ***** وهـــم فـي جـهالتهــم نــــوّم

ففــي كـــلّ ناحيــة ظـالـــم ***** غبــــــيّ يسـلـّطــــه أظلـــم

أيا من شبعتم على جوعــنا ***** وجـــوع بنينـا ألـم تتخمـــوا ؟

ألم تفهموا غضبة الكادحين ***** على الظلـم ؟ لا بدّ أن تفهموا

البردوني "نحن و الحاكمون "

#5

أشكرك جزيل الشكر

لقد قمت برسم المتغيرات سابقاً ولكن يبدو أنني أخطأت قليلاً في فهم العملية. وعندما راجعت الكود مرات عديدة تمكنت من فهمه باستخدام الورقة والقلم أيضاً، أكرر شكري لك.

ولكن عندي بعض الأسئلة

لماذا ظهرت القيم الجديدة أصفار، ولم تكن قيم عشوائية؟؟؟ (هذا ما حيرني كثيرا)

وكيف يتم وضع عناوين المتغيرات؟؟ بشكل تصاعدي ام تنازلي أم انه لا يوجد له نظام محدد، أي حسب ما يختاره الكومبايلر؟؟

لو فرضنا أنه يوجد متغير آخر هو y.

وعندما تم تغيير ptr1، أصبح يؤشر الى متغير غير معروف، هل من الممكن ان يكون ذلك المتغير y؟؟

#6

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

بالنسبة للكود الذي وضعته ستكون نتائجه

2 - 2 - 2 - 2
4 - *-*-*-*

اي اننا نتفق بالصف الاول ونتفق بالقيمة 4 بالصف الثاني وقد تختلف القيم الاخرى .

التفسير لما حدث .

قمت انت بتعريف X على انها عدد int ويأخذ القيمة 2 . وهناك ptr1 الي يؤشر على x

نقطة 1

اي ان *ptr1 تساوي X وتساوي 2 .

ptr2 يؤشر على مؤشر ptr1

اي ان ptr2** يساوي ptr1* ويساوي x ويساوي 2

كذلك الحال مع ptr3*** والي يساوي ptr2** والذي يساويptr1* والذي يساوي x والذي يساوي 2

قمت بطباعة x وptr1* و ptr2** و ptr3*** وجميعهما سيعطيانك نفس القيمة 2 وذلك وفقا للنقطة 1 .

السؤال هنا هو الدوال .

f1 تأخذ مؤشر وتجعله يساوي قيمته زائدا ً 2 اي انه سيصبح 4

ولكن من هو الذي سيصبح 4 ؟! القيمة التي يؤشر عليها ptr1 اي x

وعندما طبعنا x طبع القيمة 4 .

بغض النظر عن الطرق الصحيحه لحل المسألة او ماكان يجب عليك فعله ولم تفعله سننظر الان الى حلك وكيف خرجت الامور هكذا .

لنفرض ان عنوان x هو 1000

عنوان ptr1 هو 1100

عنوان ptr2 هو 1200

عنوان ptr3 هو 1400

ptr1 الان له عنوان ويحمل عنوان .. العنوان الذي يحمله هو عنوان x اي 1000

اي تغيير في pr1 يعتبر تغيير لـ x لانهما وجهان لعملة واحده :P

اعطيت انت ptr2 لـ f2 والتي تحمل الكود التالي في طياتها :

void f2 (int **ptr2) {
	*ptr2 = *ptr2 +1;

}

عنوان ptr2 كما قلنا انه 1200 وهو يحمل عنوان 1100 والذي يحمل عنوان 1000 ;)

اي ان ptr2** لو اردنا طباعتها ستطبع 4 ولو طبعنا ptr2* ستطبع 1200

من الكود في الدالة f2 سيؤشر ptr2** على العنوان التالي 1201

فكما تعلم بأن علي احمد يختلف عن علي ناصر :lol: مع ان لهما جميعا نفس الاسم الاول .

كذلك العنواين تختلف الان .

نفس الحال مع ptr3

حاول ان تحذف f3 و f2 وترى ماذا سيحدث!!

تقبل تحياتي

تم تعديل هذه المشاركة بواسطة time1 في 11 أكتوبر 2006 في 02:43

llback.jpg

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

#7

شكراً على التوضيح ...

اقتباس
اي ان ptr2** لو اردنا طباعتها ستطبع 4 ولو طبعنا ptr2* ستطبع 1200

من الكود في الدالة f2 سيؤشر ptr2** على العنوان التالي 1201

معنى هذا الكود

*ptr2 = *ptr2 +1;

هي إضافة sizeof(int) مرة واحدة أي أنه سيتم تعديل العنوان الى 1202 حسب الفرض بإعتبار أن sizeof(int) =2

في المؤشرات عملية الجمع والطرح تتم بالتعامل مع sizeof(pointertype) , هذه النقطة هامة ...

"First they ignore you, then they laugh at you, then they attack you, then you win"

===

اقتباس

حُكَّامُـنَا إِنْ تَصَـدّوا لِلْحِمَــى اقْتَحَمُـوا ***** وَإِنْ تَصَدَّى لَـهُ المُسْتَعْمِـرُ انْسَحَبُـوا

هُمْ يَفْرشـُونَ لِجَيْـشِ الغَــزْوِ أَعْيُنَـهُـمْ ***** وَيَدَّعُــونَ وُثُـوبَـاً قَـبْـلَ أَنْ يَثِـبُــوا

الحَاكِمُـونَ و«وَاشُنْـطُـنْ» حُكُومَتُـهُـمْ ***** وَاللامِعُــونَ وَمَـا شَعَّـوا وَلا غَرَبُــوا

القَاتِلُـــونَ نُبُــوغَ الشَّـعْــبِ تَرْضِـيَـــةً ***** لِلْمُعْتَدِيــنَ وَمَـا أَجْـدَتْـهُـمُ الـقُــرَبُ

لَهُمْ شُمُـوخُ «المُثَنَّـى» ظَاهِـرَاً وَلَهُـمْ ***** هَـوَىً إِلَـى بَابَـك الخَرْمِـيّ يُنْتَسَـبُ

البردوني "أبو تمام وعروبة اليوم" 1971

===

اقتباس
عبيد الهوى يحكمون البـلاد ***** ويحكمهــم كلّهـــم درهــــــم

و تقتـادهـم شهـوة لا تنــام ***** وهـــم فـي جـهالتهــم نــــوّم

ففــي كـــلّ ناحيــة ظـالـــم ***** غبــــــيّ يسـلـّطــــه أظلـــم

أيا من شبعتم على جوعــنا ***** وجـــوع بنينـا ألـم تتخمـــوا ؟

ألم تفهموا غضبة الكادحين ***** على الظلـم ؟ لا بدّ أن تفهموا

البردوني "نحن و الحاكمون "

#8

sizeof(int)=4

وبالفعل هذا مايتم من ناحية العناوين .. اشكرك استاذي cipher على التطرق لهذه النقطة

تحياتي لك

llback.jpg

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

#9

أشكركم جزيل الشكر على التفاعل والمساعدة

وبارك الله فيكم

لكنني لم احصل على كامل الإجابة:

لماذا ظهرت القيم الجديدة أصفار، ولم تكن قيم عشوائية؟؟؟ (هذا ما حيرني كثيرا)

لو فرضنا أنه يوجد متغير آخر هو y.

وعندما تم تغيير ptr1، أصبح يؤشر الى متغير غير معروف، هل من الممكن ان يكون ذلك المتغير y؟؟

أرجو أن لا أكون قد أثقلت عليكم بأسئلتي.

#10

من ناحية الحجز لـ y فهو غير ديناميكي .. فلا يمكن ان يكون نفس العنوان .. اما بشأن الارقام انا عن نفسي مااطلع لي اصفار بل طلع لي ارقام طويلة جدا وعشوائيه

llback.jpg

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

#11
اقتباس
sizeof(int)=4

هي تعتمد على النظام في DOS كانت 2 وفي Windows أصبحت 4 ... لذا أنا ذكرت في رد سابق لي sizeof(pointertype) وهي بشكل عام ...

اقتباس
وعندما تم تغيير ptr1، أصبح يؤشر الى متغير غير معروف، هل من الممكن ان يكون ذلك المتغير y؟؟

قد يؤشر على عنوان y لكن هذا ليس شيئاً ضرورياً ويحكم ذلك العديد من الأشياء ... فلا يمكن أن تعتمدها كقاعدة ...

"First they ignore you, then they laugh at you, then they attack you, then you win"

===

اقتباس

حُكَّامُـنَا إِنْ تَصَـدّوا لِلْحِمَــى اقْتَحَمُـوا ***** وَإِنْ تَصَدَّى لَـهُ المُسْتَعْمِـرُ انْسَحَبُـوا

هُمْ يَفْرشـُونَ لِجَيْـشِ الغَــزْوِ أَعْيُنَـهُـمْ ***** وَيَدَّعُــونَ وُثُـوبَـاً قَـبْـلَ أَنْ يَثِـبُــوا

الحَاكِمُـونَ و«وَاشُنْـطُـنْ» حُكُومَتُـهُـمْ ***** وَاللامِعُــونَ وَمَـا شَعَّـوا وَلا غَرَبُــوا

القَاتِلُـــونَ نُبُــوغَ الشَّـعْــبِ تَرْضِـيَـــةً ***** لِلْمُعْتَدِيــنَ وَمَـا أَجْـدَتْـهُـمُ الـقُــرَبُ

لَهُمْ شُمُـوخُ «المُثَنَّـى» ظَاهِـرَاً وَلَهُـمْ ***** هَـوَىً إِلَـى بَابَـك الخَرْمِـيّ يُنْتَسَـبُ

البردوني "أبو تمام وعروبة اليوم" 1971

===

اقتباس
عبيد الهوى يحكمون البـلاد ***** ويحكمهــم كلّهـــم درهــــــم

و تقتـادهـم شهـوة لا تنــام ***** وهـــم فـي جـهالتهــم نــــوّم

ففــي كـــلّ ناحيــة ظـالـــم ***** غبــــــيّ يسـلـّطــــه أظلـــم

أيا من شبعتم على جوعــنا ***** وجـــوع بنينـا ألـم تتخمـــوا ؟

ألم تفهموا غضبة الكادحين ***** على الظلـم ؟ لا بدّ أن تفهموا

البردوني "نحن و الحاكمون "

#12

على العموم شكرا على مشاركتكم الطيبة وتفاعلكم، وجزاكم الله خيراً.

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

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