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

[تنبيه - عنوان غير مناسب : ]pointers

بدأه fanon في 22 يونيو 2010 · 38 رد · 1,444 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

عند مشكله بسييطه وهي الpointer

المعرووف لو مثلا ابي قيمه تأشر عل المصدر حقها بلغه السي شارب بسويها كذا

*int x

fبالجافا كيف ؟؟

#2
fanon كتب:

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

عند مشكله بسييطه وهي الpointer

المعرووف لو مثلا ابي قيمه تأشر عل المصدر حقها بلغه السي شارب بسويها كذا

*int x

fبالجافا كيف ؟؟

فعلا هى مشكله

لكن للاسف لا يوجد pointers فى الجافا

هذه من مميزات الجافا

اللتى تمنع من التعارض فى الذاكره

انما تستخدم دائما الdynmice define

يعنى عاوز تعرف اى حاجه

هتلاقى نفسك بتعرفها دائما بـ new

يعنى عاوز تعرف حاجه من نوع Scanner

لم تيجى تعرفها

مش تعمل كدا

Scanner input;

لان كدا لسه مش بيشير على حاجه بيشير على null

لو استخدمته كدا هتلاقى بيقولك فيه exception من نوع

java.lang.NullPointerException

لازم تعمل ليها new

هتكون كدا

Scanner input = new Scanner ( System.in );

سلام عليكم

Software Developer
Mahmoudkelany.com


 

#3

انا فهمت كلامك نوعا مااا

لكن لو عندي *int x

كيف احولها بالجافا ؟؟؟

#4
fanon كتب:

انا فهمت كلامك نوعا مااا

لكن لو عندي *int x

كيف احولها بالجافا ؟؟؟

الحمدلله على كل شىء

طب عاوز تعمل ايه بس ؟

int *x ;

عاوز تعمل بيها ايه ؟؟؟؟

تستخدمها ف ايه ؟

لان تحويلها مش هيكون بالطريقه دى لان الجافا زى ما قولت لك مش فيها pointers

يمكن يكون اللى انت عاوزه بيتعمل بطريقه تانيه فى الجافا ويمكن لا

قولى بس انت عاوز تعمل بيها ايه ؟

وان شاء الله نفيدك

تم تعديل هذه المشاركة بواسطة Mahmoud Kelany في 22 يونيو 2010 في 19:25

Software Developer
Mahmoudkelany.com


 

#5

لاحظى الكود اختى الكريمة

class IntObj {
    public int value;
}

public class Binky() {
    public static void main(String[] args) {
        IntObj  x;  // Allocate the pointers x and y
        IntObj  y;  // (but not the IntObj pointees)

        x = new IntObj();   // Allocate an IntObj pointee
                            // and set x to point to it

        x.value = 42;   // Dereference x to store 42 in its pointee

        y.value = 13;   // CRASH -- y does not have a pointee yet

        y = x;  // Pointer assignment sets y to point to x's pointee

        y.value = 13;   // Deference y to store 13 in its (shared) pointee
    }
}
00020309t.gif

1958_1963.gif
#6

الجافا لا يوجد بها pointer variables و لكن يوجد بها reference variables و الاثنان متساويان فى المفهوم اصلا

و لاحظى ان ال reference variables تشير الى كائن من نوع فئة معينة

00020309t.gif

1958_1963.gif
#7
اسراء شلبى كتب:

لاحظى الكود اختى الكريمة

class IntObj {
    public int value;
}

public class Binky() {
    public static void main(String[] args) {
        IntObj  x;  // Allocate the pointers x and y
        IntObj  y;  // (but not the IntObj pointees)

        x = new IntObj();   // Allocate an IntObj pointee
                            // and set x to point to it

        x.value = 42;   // Dereference x to store 42 in its pointee

        y.value = 13;   // CRASH -- y does not have a pointee yet

        y = x;  // Pointer assignment sets y to point to x's pointee

        y.value = 13;   // Deference y to store 13 in its (shared) pointee
    }
}

لم ما الغرض من وضع

class IntObj {
    public int value;
}

واستخدامها بعد ذلك ؟

هل الغرض منها كيفيه عمل كائن؟

ام ماذا ؟

تقبلى مرورى

معلش :wacko: :wacko:

تم تعديل هذه المشاركة بواسطة Mahmoud Kelany في 22 يونيو 2010 في 20:57

Software Developer
Mahmoudkelany.com


 

#8

لان ال x دىrefer to objects و كدة بقى هى تعتبر reference variables

و زى ما قولت ان ال reference variables تساوى فى المفهوم pointer variables

00020309t.gif

1958_1963.gif
#9
اسراء شلبى كتب:

لان ال x دىrefer to objects و كدة بقى هى تعتبر reference variables

و زى ما قولت ان ال reference variables تساوى فى المفهوم pointer variables

ما انا بدال هاخزن فيها قيمه واحده و integer

طب ما اعمل كدا وخلاص ؟

int x ; 

int y ; 

 // after some code 
// assign my  x, y values 

x = 13 ; 
y = 42 ;

ولا ايه ؟

انا وجدت الكود دا هنـــــــا

بس بردوا لحد دلوقتى مش عارف هو عامل كدا ليه ؟

ايه الغرض من كدا

لو الغرض هو انى اخزن قيمه interger طب ما اعمل زى ما انا ذكرت كدا

تقبلى مرورى

سلام عليكم

==================

اللى فهمته بعد قراءه بدقه شويه وتركيز لان مفيش تركيز خالص

لقيت هو عاوز يحافظ على مبدأ pointer

لكن كدا انا بصعبها عليا

لاعمل متغير من نوع integer كدا هاتعب فى نفسى

والحكايه اسهل من انى اعمل له class وكدا ؟

دا اللى فهمته من الشرح اللى قبل الكود مباشره

لو حد عنده كلام تانى ياريت يفيدنا

يمكن فيه وجهه نظر لم اتعرض لها من قبل

سلام عليكم

تم تعديل هذه المشاركة بواسطة Mahmoud Kelany في 22 يونيو 2010 في 21:08

Software Developer
Mahmoudkelany.com


 

#10

لاااااااااااااااااحظ الفرق

فى كودى x عبارة عن reference variables يشير الى object

لكن فى كود حضرتك عامل ال x عبارة عن integer variable

فيه فرق...!!!

00020309t.gif

1958_1963.gif
#11
اسراء شلبى كتب:

لاااااااااااااااااحظ الفرق

فى كودى x عبارة عن reference variables يشير الى object

لكن فى كود حضرتك عامل ال x عبارة عن integer variable

فيه فرق...!!!

دى كللها لااااااااحظ

طيب

هو انا لم اعمل

int x ;

هو مش دا بردوا object من Integer ?

يعنى انا ممكن اعمل كدا

int x = new Integer(10);

ممكن توضحى الفرق ؟

من استخدام الطرريقه دى والطريقه بتاعتى ؟

الهدف الاخير الوصول الى ايه ؟؟؟

وهل فعلا ساعتها فيه فرق؟ ولا لآ؟

معلش تعبتك معايا :ohmy:

تم تعديل هذه المشاركة بواسطة Mahmoud Kelany في 22 يونيو 2010 في 21:13

Software Developer
Mahmoudkelany.com


 

#12

اخووي انا شغاله على RC5 algorithm

المهم ان الفنكشن حقت التشفير بلغه السي شارب كذا

اقتباس

private void Encode(ref uint r1, ref uint r2, int rounds)

{

r1 = r1 + s[0];

r2 = r2 + s[1];

for (int i = 1; i <= rounds; i++)

{

r1 = leftRotate(r1 ^ r2, (int)r2) + s[2 * i];

r2 = leftRotate(r2 ^ r1, (int)r1) + s[2 * i + 1];

}

}

اي بياخذ الريفرنس حق r1 ,r2

كيف الطريقه بالجافا

#13

الصنف int يعتبر primitive type وليس reference type، وفي المثال، يحاول الحصول على reference type يحتوي على قيمة integer.

لكن توجد ال wrappers لهذا الغرض

int -> java.lang.Integer

float -> java.lang.Float

....

#14
herch كتب:

الصنف int يعتبر primitive type وليس reference type، وفي المثال، يحاول الحصول على reference type يحتوي على قيمة integer.

لكن توجد ال wrappers لهذا الغرض

int -> java.lang.Integer

float -> java.lang.Float

....

اخى عصام

مداخله طيبه منك

انا افهم واعرف ما قولته والحمدلله

لكن سوالى الان اريد ان اعرف ما الفرق بين استخدام كود الاخت اسراء

واستخدام الكود تبعى

هل هناك مميزات لكود الاخت اسراء عن كودى ؟

او ايه الفرق ؟

ومتشكر على المداخله والرد

تم تعديل هذه المشاركة بواسطة Mahmoud Kelany في 22 يونيو 2010 في 21:20

Software Developer
Mahmoudkelany.com


 

#15

كودك

int x ; 

int y ; 

 // after some code 
// assign my  x, y values 

x = 13 ; 
y = 42 ;

هنا قمت بعمل متغير له عنوان فى الذاكرة يشير اليه و يحتوى على قيمة معينه

اوكى..؟ من الممكن تغيرها

تعريف ال pointer ::هو عبارة عن متغير خاص special kind of variable و لكن يحتوى على عنوان متغير اخر

كودى:::

IntObj  x;
  x.value = 42;

هنا قمنا بعمل كائن هو فى الحقيقة يكون عبارة reference variables

اوكى..؟

و عنا تنفيذ السطر الاخير هنا يقوم البرنامج بوضع قيمة 42 داخل العنوان الذى يحتويه ال x

00020309t.gif

1958_1963.gif
#16
اسراء شلبى كتب:

كودك

int x ; 

int y ; 

 // after some code 
// assign my  x, y values 

x = 13 ; 
y = 42 ;

هنا قمت بعمل متغير له عنوان فى الذاكرة يشير اليه و يحتوى على قيمة معينه

اوكى..؟ من الممكن تغيرها

تعريف ال pointer ::هو عبارة عن متغير خاص special kind of variable و لكن يحتوى على عنوان متغير اخر

كودى:::

IntObj  x;
  x.value = 42;

هنا قمنا بعمل كائن هو فى الحقيقة يكون عبارة reference variables

اوكى..؟

و عنا تنفيذ السطر الاخير هنا يقوم البرنامج بوضع قيمة 42 داخل العنوان الذى يحتويه ال x

والله انا فاهم كل كلامك

لكن سوالى ليه استخدم reference variables

ايه الفرق بينه وبين ال primitive variables

فى الحاله هذه ؟

التى هي ان اخزن قيمه صحيحه

ما الفرق فى تلك الحاله فى كلتا الحالتين خزنت قيمه صحيحه ولكن هل هناك من مميزات

او فرق بين الطريقتين ؟

و اسف على الازعاج

ولو محدش فاهم سوالى او انا اقصد ايه

خلاص مفيش مشاكل

Software Developer
Mahmoudkelany.com


 

#17
herch كتب:

الصنف int يعتبر primitive type وليس reference type، وفي المثال، يحاول الحصول على reference type يحتوي على قيمة integer.

لكن توجد ال wrappers لهذا الغرض

int -> java.lang.Integer

float -> java.lang.Float

....

وش هي ال wrappers

اذا هي مش نوع ريفرنس كيف اخلي هال int يحصل عل ريفرنس من خلاال الجافا

اعذرني لكني ضيعفه نوعا ما بالبرمجه

#18
Mahmoud Kelany كتب:

والله انا فاهم كل كلامك

لكن سوالى ليه استخدم reference variables

ايه الفرق بينه وبين ال primitive variables

فى الحاله هذه ؟

التى هي ان اخزن قيمه صحيحه

ما الفرق فى تلك الحاله فى كلتا الحالتين خزنت قيمه صحيحه ولكن هل هناك من مميزات

او فرق بين الطريقتين ؟

و اسف على الازعاج

ولو محدش فاهم سوالى او انا اقصد ايه

خلاص مفيش مشاكل

انا متفق معاك تماماً ومش شايف فرق

--

Mina Fouad

Computer & Systems Engineering Dpt.

Faculty of Engineering

Alexandria University

#19
اقتباس
لكن سوالى ليه استخدم reference variables

ايه الفرق بينه وبين ال primitive variables

فى الحاله هذه ؟

طيب تقدر تقولى حضرتك هتستطيع تغير قيمة المتغير الموجودة فى class اخر ازاى؟؟

و لكن عندما تتعامل مع عنوان المتغير فى الذاكرة تستطيع ذلك بكل سهولة و فى اى مكان

لكن لو قمت بتعريف متغير اى اخر بنفس الاسم فى فئة اخرى الذاكرة لا يهمها الاسم و لكن يهمها العنوان

باستخدام reference variables انت تسطيع تغير قيمة المتغير ذاته التى تريد و راجع درس ال scope

عندما تريد تغير قيمة متغير موجود فى دالة و تريد تغير قيمتة بداخل دالة اخرى مع انهم فى نفس الفئة و لكن ال scope هنا يحكمك كيف تستطيع تغيير القيمة دون الحصول على عنوان المتغير فى الذاكرة

اتمنى تكون الصورة وضحت اخى محمود و اخى مينا

00020309t.gif

1958_1963.gif
#20

أخ محمود، هدئ أعصابك smile.gif

سؤالك على ما يبدو لي هو لماذا سنستعمل الفئة IntObj مثلا بدل int، إذا كنا في الحالتين سنقوم بتخزين نفس القيمة.

الفرق ليس في التخزين، لكن في طريقة تغيير هذه القيمة، خصوصا عند تمريرها إلى method ما.

فكما تعلم، ال primitive types يتم تمريرها by value، أي أنك عندما تمرر متغيرا int إلى method، فلا يمكنك التعديل عليه. لكن بالنسبة لل reference types فالأمر مختلف، حيث يمكنك التعديل، طبعا إذا كان الكائن mutable، أي أنه يسمح لك بالتعديل عليه.

مثال

class IntObj {

	private int val;

	IntObj(int val) {
		this.val = val;
	}

	public void setVal(int newVal) {
		val = newVal;
	}

	public int getVal() {
		return val;
	}
}

public class Test {

	public static void increment(int x) {
		x++;
	}

	public static void increment2(IntObj x) {
		x.setVal(x.getVal()+1);
	}

	public static void main(String[] args) {
		int i = 2;
		IntObj iObj = new IntObj(2);
		increment(i);
		increment2(iObj);
		System.out.println("int: " + i);	//لم تتغير القيمة
		System.out.println("IntObj: " + iObj.getVal());		//هنا تغيرت القيمة
	}
}

ملاحظة أخرى

بالنسبة للكود الذي كتبته سابقا

int x = new Integer(10);

المتغير x لا يحتوي على object من صنف Integer، بل يحتوي على القيمة 10 نفسها. هذا راجع إلى ال AutoBoxing، حيث يتم التحويل تلقائيا من Integer إلى int.

لذلك فالكود الذي الذي كتبته غير جيد، لأنك تضيف عملا زائدا لل JVM، بينما من الأبسط تمرير القيمة مباشرة

تم تعديل هذه المشاركة بواسطة herch في 22 يونيو 2010 في 21:38

1
#21
اسراء شلبى كتب:

طيب تقدر تقولى حضرتك هتستطيع تغير قيمة المتغير الموجودة فى class اخر ازاى؟؟

و لكن عندما تتعامل مع عنوان المتغير فى الذاكرة تستطيع ذلك بكل سهولة و فى اى مكان

لكن لو قمت بتعريف متغير اى اخر بنفس الاسم فى فئة اخرى الذاكرة لا يهمها الاسم و لكن يهمها العنوان

باستخدام reference variables انت تسطيع تغير قيمة المتغير ذاته التى تريد و راجع درس ال scope

عندما تريد تغير قيمة متغير موجود فى دالة و تريد تغير قيمتة بداخل دالة اخرى مع انهم فى نفس الفئة و لكن ال scope هنا يحكمك كيف تستطيع تغيير القيمة دون الحصول على عنوان المتغير فى الذاكرة

اتمنى تكون الصورة وضحت اخى محمود و اخى مينا

انا لم اتكلم عن الفرق بين

استخدم reference variables

و ال primitive variables

بوجهه عام

انا اتحدث عن الفرق فى استخدامه فى هذه الحاله فقط

ليس بوجهه عام

طب ما اانا ممكن اعمل publice int x ;

واغيره فى اى مكان انا عاوزه ؟ :wacko: :wacko:

انا عارف ان انا كدا زهقتكم معلش

طب خلاص مش مشكله هاحاول افكر فى الموضوع دا كتيرررررررر اوى

ونشوف حل له

مش عاوزين نتعبكم معانا

شكرا على ردك وتفاعلك اختى اسراء

Software Developer
Mahmoudkelany.com


 

#22

على فكره انتو جلستو تتناااقشو ....في شئ قد يكووون ماله داعي بموضوووعي

طلبت شي معييين وجلس كل واااحد يعرض وجهه نظرررره في مثاااال ..وانا جالسه اتفرج ؟؟

اخ herch اتمنى ترد عل سؤالي

#23
اقتباس
على فكره انتو جلستو تتناااقشو ....في شئ قد يكووون ماله داعي بموضوووعي

طلبت شي معييين وجلس كل واااحد يعرض وجهه نظرررره في مثاااال ..وانا جالسه اتفرج ؟؟

اخ herch اتمنى ترد عل سؤالي

هههههههههههههه

اسفين اختى الكريمة

و لكن اذا فكرتى قليلا

فى المناقشة ستجدى الاجابة على سؤالك :lol:

اقتباس
طب ما اانا ممكن اعمل publice int x ;

هل عندما تفعل ذلك تستطيع تغيير القيمة داحل اى فئة..؟ :wacko:

00020309t.gif

1958_1963.gif
#24

طيب بما ان الاجابه موجووده ..جاوبي

عندي

اقتباس

private void Encode(ref uint r1, ref uint r2, int rounds)

{

r1 = r1 + s[0];

r2 = r2 + s[1];

for (int i = 1; i <= rounds; i++)

{

r1 = leftRotate(r1 ^ r2, (int)r2) + s[2 * i];

r2 = leftRotate(r2 ^ r1, (int)r1) + s[2 * i + 1];

}

}

كيف احول الريفرنس هنا بلغه السي شاارب

بدون امثله بس عطيني الاجااابه

#25
herch كتب:

أخ محمود، هدئ أعصابك smile.gif

سؤالك على ما يبدو لي هو لماذا سنستعمل الفئة IntObj مثلا بدل int، إذا كنا في الحالتين سنقوم بتخزين نفس القيمة.

الفرق ليس في التخزين، لكن في طريقة تغيير هذه القيمة، خصوصا عند تمريرها إلى method ما.

فكما تعلم، ال primitive types يتم تمريرها by value، أي أنك عندما تمرر متغيرا int إلى method، فلا يمكنك التعديل عليه. لكن بالنسبة لل reference types فالأمر مختلف، حيث يمكنك التعديل، طبعا إذا كان الكائن mutable، أي أنه يسمح لك بالتعديل عليه.

مثال

class IntObj {

	private int val;

	IntObj(int val) {
		this.val = val;
	}

	public void setVal(int newVal) {
		val = newVal;
	}

	public int getVal() {
		return val;
	}
}

public class Test {

	public static void increment(int x) {
		x++;
	}

	public static void increment2(IntObj x) {
		x.setVal(x.getVal()+1);
	}

	public static void main(String[] args) {
		int i = 2;
		IntObj iObj = new IntObj(2);
		increment(i);
		increment2(iObj);
		System.out.println("int: " + i);	//لم تتغير القيمة
		System.out.println("IntObj: " + iObj.getVal());		//هنا تغيرت القيمة
	}
}

ملاحظة أخرى

بالنسبة للكود الذي كتبته سابقا

int x = new Integer(10);

المتغير x لا يحتوي على object من صنف Integer، بل يحتوي على القيمة 10 نفسها. هذا راجع إلى ال AutoBoxing، حيث يتم التحويل تلقائيا من Integer إلى int.

لذلك فالكود الذي الذي كتبته غير جيد، لأنك تضيف عملا زائدا لل JVM، بينما من الأبسط تمرير القيمة مباشرة

اولا هجاوب على الخطا التانى الاول فعلا دا حمل ذائد

ثانيا الكود بتاع حضرتك مقنع والحمدلله

انا كنت بكتب رد تانى على الرد بتاع الاخ عصام لكن وانا برد فهمت والحمدلله القصد من الكود بتاع الاخ عصام

معلش انا دايما كدا مغلب الكل فى كل مكان والله

بس لازم اعرف الفرق والحمدلله الاخ عصام غلبنى هههههه

جزاك الله خيرا

لكن بردوا هذه حاله ممكن ف حالات تانيه مش احتاج مثل هذه اللخبطه

على العموم كفايه كدا

انا ااساسا عندى امتحان OS ويمكن ماثر شويه

معذره عل الازعاج

ومعذره اخت اسراء

تقبلوا مرورى

سلام عليكم

Software Developer
Mahmoudkelany.com


 

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