التعامل مع المؤشرات Pointers في C++
1.مواقع الذاكرةيمكن أن نعتبر شكل الذاكرة مثل صناديق البريد ٬ حيث تمثل كل خانة موقع في الذاكرة و تقوم بتخزين قيمة
٬ كل موقع في الذاكرة له عنوان ٬ و يتم تمثيل عناوين (char او float او حقيقة int وحيدة ( قد تكون صحيحة
الذاكرة باستخدام النظام الست عشري من باب التسهيل كون انه في الاصل يمثل باستخدام النظام الثنائي ٬فعلى
سبيل المثال لتمثيل الخانة رقم 15 باستخدام النظام الثنائي فإننا سوف نحتاج إلى اربع خانات هي 1111 على
. F عكس النظام الست عشري الذي يمثلها بخانة واحدة هي
2. حجم الأنماط في الذاكرة
قبل أن نخوض بالمؤشرات لا بد من التذكير بطريقة عنونة المتحولات بالذاكرة .
عندما نقوم بتعريف المتحولات في البرنامج ٬ فإنها تأخذ حيزا في الذاكرة بما يتناسب مع حجمها
1 Char
2 Int
4 long
4 float
8 double
فعلى سبيل المثال :
void main()
{
float F=32.5;
char C="A";
int I= 2;
}
فسيتم حجز 4 حجرات للمتحول F وحجرة للمتحول Cوحجرتين للمتحول I
3.الحجز الاستاتيكي
فكما رأينا فإنه يتم حجز حجم المتحولات تبعا لنمطها وهذا الحجز يسمى بالحجز الساكن الستاتيكي ويوصف بالساكن لأن الذاكرة المكرسة له تبقى محجوزة له طوال مدة تنفيذ البرنامج ,
فالمترجم هنا يعرف تماما كمية الذاكرة التي تحتاجها المتحولات , ويخصص المترجم حجرات المتحولات العامة والثوابت ضمن
مقطع المعطيات (data segment) ومقطع المعطيات هذا عبارة عن مساحة من الذاكرة محدودة الطول , يحدد ويقررحجمها المترجم بناء على عدد ونوع المتحولات العامة والثوابت المصرح عنها بالبرنامج , أما المتحولات المحلية (Local Variable) والبارمترات فالمترجم يخصص لها حجرات في الذاكرة عندما يتطلب تنفيذ البرنامج ذلك , ولكن يحجز المترجم بشكل أولي كمية من الذاكرة المكدس (Stack) من أجل هذه المتحولات –وطول مقطع مكدس ثابت ويحدد أثناء الترجمة للبرنامج
المكدس ثابت ويحدد أثناء الترجمة للبرنامج –
فالخلاصة أن الحجز الستاتيكي يتم تحديد كمية الذاكرة المخصصة أثناء ترجمة البرنامج وقبل تنفيذه ,لأن هذه الكمية
ثابته لا تتغير .
4.الحجز الديناميكي
لنفرض أننا نريد برنامج من أجل ترتيب معطيات عددية يدخلها المستخدم ولا أعرف هذه الكمية والكمية ليست
ثابته فمن أجل ذلك يوجد طريقتين
الأولى : أن أحجز مصفوفة ذات حجم كبير بحيث تكفي لتخزين القيم المتوقعة وهنا سنحجز كمية كبيرة من الذاكرة
عن طريق الحجز الاستاتيكي
الثانية : عن طريق استخدام المؤشرات والحجز الديناميكي
إن المبدأ الاساسي للتعامل مع المتحولات الديناميكية هوتخصيص ذاكرة ديناميكية للبرنامج يتم الحجز ضمنها لهذه
المتحولات ولاستخدامها وبعد الانتهاء يتم تحرير الحجز ( إعادة الذاكرة المحجوزة لاستخدامات اخرى ) فيما بعد.
إذا نحن الان سنتعامل مع طريقة جديدة مع الذاكرة وهي تخصيص حجرات الذاكرة أثناء التنفيذ ( تنفيذ البرنامج )
وليس أثناء الترجمة (compile) ترجمة البرنامج .
ولكن كيف يمكننا التعامل هذه المتحولات الديناميكية وكيف سوف نصرح عنها ؟
تتم طريقة الحجز باستخدام مؤشرات (عناوين ) إلى الذاكرة - الديناميكية – والتي تسمى الكومة Heap وستتم بهذه الطريقة بسبب فكرة الاخذ والاعادة منها وإليها , والخلاصة أن استخدام المتحولات الديناميكية لا يتم مباشرة بل عن
طريق مؤشر.
5. عناوين المتحولات في الذاكرة
لكل خلية من خلايا ذاكرة الحاسب عنوان محددّ, والعنوان هو رقم يبدأ من 0 وينتهي بالقيمة العظمى لسعة الذاكرة.
لكي نستطيع ان نعرف عنوان متحول في الذاكرة نقوم بإضافة الإشارة & قبل المتحول و هي تعني عنوان المتحول (Address Of )
٬لاحظ :
#include "iostream"
#include "conio"
void main()
{
int x;
cout << "Enter Number: ";
cin >> x;
cout << "\nThe Number is:" << x << endl; //هذا يظهر محتوى المتغير او المتحول
cout << "\nand The address in memory is: "<< &x << endl; // هذا يظهر عنوان المتغير او المتحول في الذاكرة
}
#include "conio"
void main()
{
int x;
cout << "Enter Number: ";
cin >> x;
cout << "\nThe Number is:" << x << endl; //هذا يظهر محتوى المتغير او المتحول
cout << "\nand The address in memory is: "<< &x << endl; // هذا يظهر عنوان المتغير او المتحول في الذاكرة
}
المؤشرات والتصريح عنها
الذي يحتويه و بالتالي فهو يشير إلىمتحول اّخر ...
يتم التصريح عن المؤشر في البرنامج بتحديد نوع المعطيات التي يشير اليها (اي هل يشير إلى قيمة من نوع int-char-float) ثم اضافة الرمز نجمة * ثم اسم المؤشر.
امثلة
int *iPtr;
float *fptr;
double *dptr;
المتحول fptr هو عبارة عن مؤشر من النوع الحقيقي , أي أن العنوان المخزن في المتحول يفهم على أنه عنوان بداية مساحة من الذاكرة بطول أربعة بايتات ومحتويات هذه الحجرات أعداد صحيحة .
المتحول dptr هو عبارة عن مؤشر من النوع المضاعف , أي أن العنوان المخزن في المتحول يفهم على أنه عنوان بداية مساحة من الذاكرة بطول ثمانية بايتات ومحتويات هذه الحجرات أعداد من النمط المضاعف .
(الرمز & يعيد عنوان المتغير في الذاكرة) ٬ لاحظ هذا المثال :
int y = 5;
int *yPtr;
yPtr = &y; // y تأخذ عنوان yPtr
برنامج بسيط
#include <iostream>
using namespace std;
int main(){
int x = 1, y = 5;
cout<<endl<<&x<<endl<<&y;
int * ptr;
ptr = &x;
cout<<endl<<ptr;
ptr = &y;
cout<<endl<<ptr;
return 0;
}
هناك تعليقان (2):
السلام عليكم و رحمه الله و بركاته
كيف اجد عناوين اى برنامج و معرفه العنوان الحقيقى للقيمه المراد تغيرها ( لانه فى البرامج بعض العناوين المستخرجه لا تغير اى قيمه )+ فى الالعاب
+ هل يمكن تغير مكان تخزين العناوين المحجوزه(الحقيقيه (لانه فى بعض البرامج طلب لتغير قيم معرفه لغة ال sql )
وبالنسبه لانى منكذا سنه كانت الاعاب الاون لين هى ما احب و لكن بعد معرفتى لتغير القيم بالبرامج و جربيت لم انجح و المشكله انه يعرف بعض من يغير فى القيم و يحزف من اللعبه
اسف لا اعرف فى البرمجه (ولكنى رضيت ام ابيت سوف ادرس لغه السى و السى++
درس جيد ومقتضب
إرسال تعليق
EmoticonEmoticon