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

سؤال في المؤشرات

بدأه 3mr في 8 يوليو 2008 · 18 رد · 1,386 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

شباب انا كنت عايز استفهم حاجة كدا منكم وارجو الاقى الفائدة بأذن الله

دلوقتى بنسبة للمؤشرات,

انا لو عايز اقول مثلا

#include<iostream>

using namespace std;

void main()
{
 int a=10;
 int *ptr=new int;


*ptr=a; // هنا المؤشر *ptr هيساوى محتويات المتغير a

 }

وفى مثال اخر

#include<iostream>

using namespace std;

void main()
{
 int a=10;
 int *ptr=new int;


ptr=&a; // هنا احنا قولنا انى المؤشر ptr هياخد عنوان المتغير a

 cout<<ptr<<endl;
}

طيب لنفترض انى لدى عنوان فى الذاكرة ثابت من النوع ستاتيك واريد ان ادخل فى هذا العنوان قيمة كيف انفذ ذالك ارجو من الاخوة الرد عليه
اشكركم

من طلب العلى سهر اليالى

#2

طيب تريد تصنع مؤشر لمتغير ثابت هناك حلين

1- الطريقة الأولى وهي صنع مؤشر لإستقبال المتغير الثابت

وهي على الشكل التالي const int*m=constant pointer

2- الطريقة الثانية وهي عملية القسر بإستخدام const-cast

وهي تقوم بقسر الثوابت (const) والمتقلبات (volatile) وهي تفيد في اذا ماكان لديك مؤشر ليس لمتغير ثابت وتريد ان تظيف اليه عنوان لمتغير ثابت

وطريقتها

int *m=const_cast<int*>(&r) مثال

إن شاء الله اكون قدرت افهم سؤالك

تم تعديل هذه المشاركة بواسطة مصفوفة في 8 يوليو 2008 في 23:33

بسم الله الرحمن الرحيم

مدونة دوال

كيوتي العربي

#3

اخى مصفوفة ارى انك لم تفهم السؤال جيدا ^^

سؤالى مثلا انا عندى عنوان فى الذاكرة

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

لنفطرض انى هذا العنوان 0x00136489

وانا اريد ان اقول

int a=0x00136489

هل هذة الجمله صحيحة فى لفة السى++ ولا هناك طريقة غير ذالك

طبعا انا بعدما عرفت العنوان باسم a علشان اقدر اتعامل معاة

بمعنى, لما اقول

a=50

المترجم يأخد ال50 دى ويحطها فى العنوان اللى انا كتبه دا

ارجو ان تكون فهمتنى

مشكور على المتابعة

من طلب العلى سهر اليالى

#4

لا خطأ حبيبي

ماعندهعم هذا الشيئ بس عندك 0x00000000 وتعني NULL

غير كذا لا يوجد

بسم الله الرحمن الرحيم

مدونة دوال

كيوتي العربي

#5

يعنى مفيش اى طريقة فى السى++ لاعمل الموضوع دا؟

من طلب العلى سهر اليالى

#6

هل تقصد هكذا ؟

main()
{
	int *a;
	a=(int *)0x0012ff74;
	*a=50;
	cout<<*a;
	return 0;
}

تم تعديل هذه المشاركة بواسطة time1 في 9 يوليو 2008 في 02:04

llback.jpg

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

#7
اقتباس
ماعندهعم هذا الشيئ بس عندك 0x00000000 وتعني NULL

من افتاك بهذا ؟؟

الأخ time جاب المفيد .

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#8

حل أخونا time1 جدا جميل نحول العنوان الى عنوان من النوع int ونضيفه

مشكور أخي time1

بسم الله الرحمن الرحيم

مدونة دوال

كيوتي العربي

#9

الف شكر على الافادة :)

من طلب العلى سهر اليالى

#10

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

الطريقة صحيحة في حالة العنوان غير محجوز او محمي

tvquran_6.gif

#11

تقصد العكس :lol:

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#12

هذه طريقة ممتازة لإدراج أخطاء متعلقة بالذاكرة في برنامجك!

#13

ما الذي تقصده ؟؟

لن تسبب مشاكل اذا كنت تعرف ماذا تفعل !!

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#14

لأنها طريقة ممتازة لإدخال بيانات إلي أجزاء من الذاكرة ليست ملكك وليست مهيأة لك من قبل نظام التشغيل ، وبالتالي فهناك احتمال كبير جدًا أن تكتب فوق ذاكرة برنامج آخر وتفسد ثبات النظام.

#15
اقتباس
لأنها طريقة ممتازة لإدخال بيانات إلي أجزاء من الذاكرة ليست ملكك وليست مهيأة لك من قبل نظام التشغيل
اقتباس
لن تسبب مشاكل اذا كنت تعرف ماذا تفعل !!
اقتباس
بالتالي فهناك احتمال كبير جدًا أن تكتب فوق ذاكرة برنامج آخر وتفسد ثبات النظام

لا يحدث ذلك في انظمة الـMultitasking ,, لكل عملية ذاكرة افتراضية خاصة بها .

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#16
GamingMasteR كتب:
لا يحدث ذلك في انظمة الـMultitasking ,, لكل عملية ذاكرة افتراضية خاصة بها .

في اللينوكس نعم ، لأن هناك تفرقة بين برامج المستخدم وبرامج المدير ، لكن في الويندوز إكس بي مثلاً يميل معظم المستخدمين لتسجيل الدخول كمدير وليس كمستخدم عادي ، وبالتالي ذاكرة النواة متاحة لجميع البرامج.

#17

بصراحة لا استطيع ان اتكلم بنصف كلمة في نظام يونكس لأني لم اتعامل معه من قبل برمجياً ,, لكن هذه الجملة لم افهمها منك أرجو توضيحها :

اقتباس
لكن في الويندوز إكس بي مثلاً يميل معظم المستخدمين لتسجيل الدخول كمدير وليس كمستخدم عادي ، وبالتالي ذاكرة النواة متاحة لجميع البرامج.

انت تقصد ان ذاكرة النواة مفتوحة للمستخدم المدير في XP ؟؟؟

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#18

حسنًا ، ليست مفتوحة ، لكن يمكن المرور إليها ،

ببعض البحث الآن وجدت أن الكتابة إلي مكان في الذاكرة ليس ملكك يؤدي إلي إعلان خطأ من قبل نظام التشغيل ثم إنهاء البرنامج ، بينما في النظم الأقدم التي كانت تعمل في الوضع الحقيقي مثل هذه العملية ستؤدي إلي الكتابة فوق ذاكرة برامج أخري.

وعلي أي حال ليس هناك فائدة من الكتابة إلي عنوان بعينه في الذاكرة ، وهذه طريقة لا تنتج سوي الأخطاء ، اللهم إلا إذا كنت تكتب نظام تشغيل مثلاً.

#19

في نظم NT يوجد ذاكرة افتراضية خاصة بكل بروسس لا يمكنه تخطيها أبدا إلا عن طريق ثغرات او اشياء اخرى ,, لكن مباشرة لا يمكن !

اقتباس
وعلي أي حال ليس هناك فائدة من الكتابة إلي عنوان بعينه في الذاكرة ، وهذه طريقة لا تنتج سوي الأخطاء ، اللهم إلا إذا كنت تكتب نظام تشغيل مثلاً.

مرة اخرى ,, توجد فائدة اذا كنت تعرف ماذا تفعل :D

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

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