تیم برنامه نویسی گروه تمدن

مرجع کامل فارسی برنامه نویسی به زبان سی پلاس پلاس

  • Increase font size
  • Default font size
  • Decrease font size

اشاره گر،متغير پويا وپارامتر مرجع

فرستادن به ایمیل چاپ مشاهده در قالب پی دی اف
به نام خدا

اشاره گرها

1. مفهوم اشاره گرها

2. پياده سازي اشاره گرها

متغير پويا

پارامتر مرجع

 

مفهوم اشاره گرها:

اشاره گرها يكي از پركاربردترين مفهومات در برنامه نويسي مي باشند و يادگيري آن از اهميت زيادي برخوردار مي باشد.

اشاره گرها براي دسترسي به حافظه heap مي باشند.يكي از امتيازات سي پلاس پلاس نسبت به زبان هايي چون جاوا، امكان استفاده از اشاره گرها و به اصطلاح بازي كردن با آن هاست.براي روشن شدن موضوع تمام دقت خود را به اين نوشته متمركز كنيد:

وقتي شما يك متغير مثلاً به اسم a تعريف مي كنيد،‌ داراي دو مؤلفه مي باشد. يكي محتواي آن خانه از حافظه و ديگري آدرس آن خانه در حافظه. شكل زير كه نشان دهنده يك خانه از حافظه است، بيان گر اين موضوع است:

ptr1

اگر فرض كنيم كه a از نوع int باشد وقتي شما مي گوييد a  را با عدد 2 جمع كن و درa بريز، محتواي خانه a به علاوه 2 مي شود و آدرس آن ثابت مي ماند. در حافظه امكان دارد خانه هايي با محتواي يكسان وجود داشته باشند اما خانه هايي متفاوت با آدرس هاي يكسان وجود ندارند.

از اين جا مفهوم اشاره گر روشن مي شود. وقتي يك اشاره گر تعريف مي كنيم،‌ اين اشاره گر به آدرس خانه a اشاره مي كند و به دليل اينكه اين آدرس منحصر به فرد است مي توانيم محتويات a را دستخوش تغيير قرار دهيم.

اشاره گر هم مانند تمام چيزها در حافظه فضايي اشغال مي كند،‌ پس داراي يك آدرس است و يك محتوا. اما محتواي اشاره گرها آدرسي است كه آن اشاره گر به آن خانه از حافظه اشاره مي كند. شكل زير مطلب قبل را به بيان ساده نشان مي دهد:

 

ptr2

 

=> محتواي اشاره گر=آدرس a

(البته به اين دليل كه اشاره گر هم يك خانه از حافظه است و آدرسي دارد مي توانيد اشاره گر ديگري تعريف كنيد كه به آدرس اشاره گر قبلي اشاره داشته باشد)

 


پياده سازي اشاره گرها:

همان طور كه در قبل گفتيم،‌مباحثي كه در بحث اشاره گر مطرح است يكي خانه اي است كه قرار است اشاره گر به آن اشاره كند (براي مثال a) و ديگري خود اشاره گر(به عنوان مثال p). و همين طور بايد بگوييم كه چگونه مي توان به آدرس يك خانه و محتواي آن به طور جداگانه دسترسي داشت.

به طور كلي اگر در كنار يك متغير علامت & (كه همان و لاتين است) را قرار دهيم،‌خروجي معادل آدرس آن متغير است. پس a& برابر آدرس خانه a‌مي باشد. و اگر كنار يك اشاره گر علامت * (كه همان ستاره است) قرار دهيم. خروجي معادل مي شود با محتواي خانه اي كه اشاره گر به آن اشاره دارد. پس p* برابر با مقدار a مي شود (با اين فرض كه قبلاً گفته ايم كه p به a اشاره مي كند). اين پارگراف را چند بار بخوانيد، چون اگر متوجه اين موضوع شويد، تمام مباحث اشاره گر ها ساده خواهند بود.

نحوه تعريف اشاره گرها: نكته اي قابل توجه اين است كه نوع داده اي اشاره گر ها مي بايست با نوع داده اي متغيرهايي كه قرار است آن اشاره گرها به آن ها اشاره كنند يكسان باشند. بنابراين اگر a‌از نوع داده اي int است،‌اشاره گر p نيز مي بايست از نوع داده اي int ‌باشد. براي اينكه به كامپايلر بگوييم يك متغير از نوع اشاره گر است بايستي در موقع تعريف در كنار پارامتر آن * بياوريم.

;نام اشاره گر*     نوع داده اي

int *p;

براي نسبت دادن اشاره گر p به متغير a دو راه وجود دارد:

راه اول در موقع تعريف اشاره گر)

int a;
int *p=&a;

راه دوم بعد از تعريف اشاره گر)

int a;
int *p;
p=&a;

با توجه به آنچه در قبل گفته شد،‌براي دسترسي به محتواي a‌مي نويسيم p*.

مثال:متغيري از نوع صحيح با مقدار اوليه 2 تعريف كنيد و سپس به واسطه اشاره گر 5 واحد به آن اضافه كنيد  و سپس تمام اطلاعات آن  را چاپ نماييد.:

int main(){
int a=2;
int *ptr;
ptr=&a;
(*ptr)+=5;

cout<<"a: "<cout<<"*ptr: "<<*ptr<cout<<"&a: "<<&a<cout<<"ptr: "<
cout

system("pause");
return 0;
}//end programme

مشاهده خواهيد كرد كه برنامه بعد از اجرا مقدار 7 را نمايش خواهد داد. پس تغييرات در p* با تغييرات در a  يكسان است. و آدرس a نيز با مقدار p برابر است.


متغير پويا:

در كامپيوتر ما دو نوع حافظه داريم. 1. حافظه ايستا يا satatic   و2. حافظه پويا  يا dynamic

اگر متغيري را به طور ايستا تعريف كنيم،‌طول عمر آن متغير از زمان اجراي برنامه ايجاد مي شود و تا پايان يافتن آن باقي مي ماند. يعني قبل از اين كه برنامه در اختيار كاربر قرار بگيرد، خانه حافظه آن شكل گرفته است. اما متغيرهاي پويا در حافظه پويا شكل مي گيرند و مي توان در زمان اجراي برنامه آن ها را توليد و يا از بين برد. اين امر مزيت هاي زيادي دارد كه مهمترين آن ها از قبيل تعريف آرايه پويا بدون تعيين سايز اوليه، تعريف ليست پيوندي، درخت در ساختمان داده مي باشد كه در بخش هاي آينده توضيح خواهم داد.

براي توليد يك متغير پويا بايستي به اصطلاح آن را new كنيد. شما يك اشاره گر مي سازيد و آن را new مي كنيد. به يكي از دو شكل در مثال هاي زير:

//example 1:
int *x;
x= new int;


//example 2:
int *x= new int;

واضح و مشخص است كه نوع داده اي از هر نوعي مي تواند باشد.

براي از بين بردن يك متغير پويا بايد آن را به اصطلاح delet كنيد .براي اين كار كافي است كلمه delete را در كنار نام متغير پويايي كه از قبل تعريف كرده ايد بياوريد،‌مانند زير:

delete x;

!!!البته اگر شما تا آخر برنامه هم آن را delete نكنيد، خودِ برنامه پس از پايان يافتن برنامه آن را delete مي كند. اما در برنامه هاي بزرگ براي جلوگيري از به هدر رفتن حافظه اين امر ضروري است.

نحوه استفاده:

حال كه شما اين متغير پويا را ساختيد ديگر لازم نيست از * و & استفاده كنيد. مي توانيد مستقيماً با متغير پويا كار كنيد.


 

پارامتر مرجع:

پارامتر مرجع به عنوان جانشين يك متغير تعريف مي شود و تغيير در آن مانند تغيير در متغير اصلي است. همچنين تغيير در متغير اصلي باعث تغيير آن مي شود. شايد بپرسيد كاربرد آن چيست! در واقع كاربرد آن زماني كه مبحث تابع را توضيح دهيم براي شما مشخص مي شود. پارامتر مرجع به طور مستقيم در توابع نقش بازي مي كند و تغييراتي كه در تابع ايجاد مي شود اين پارامتر را نيز دچار تغيير مي كند.(توضيحات كامل در قسمت توابع آمده است)

نحوه تعريف پارامتر مرجع به اين صورت است:

; نام متغير=نام پارامتر مرجع&      نوع داده اي

int j;
int &i=j;

توجه به اين نكته مهم مي باشد كه متغيري كه پارامتر مرجع جانشين آن است مي بايست در همان لحظه تعريف به پارامتر مرجع شناسانده شود. همچنين بايد توجه داشت وقتي يك پارامتر مرجع را جانشين يك متغير مي كنيم ديگر نمي توانيم جانشين متغيري ديگر كنيم.

به قطعه كد زير كه مفهوم پارامتر مرجع را مشخص مي كند توجه كنيد:

int main(){
int j=0;
int &i=j;
i+=2;
cout<j--;
cout<}//end programme

تحليل مثال: در خط سوم يك پارامتر مرجع تعريف كرده ايم و آن را به j نسبت داده ايم. در خط چهارم به پارامتر مرجع 2 واحد اضافه كرده ايم و در خط پنجم مشاهده مي شود كه متغير نيز 2 واحد بيشتر شده است. بنابراين تغيير در پارامتر مرجع با تغيير در متغير يكي است. در خط ششم از متغير يك واحد كم كرده ايم و در خط هفتم مي بينيم كه از پارامتر مرجع نيز يك واحد كم شده است. بنابراين تغيير در متغير مانند تغيير در پارامتر مرجع مي باشد.

در صورت داشتن هر گونه سوال و یا اشکال  مي توانيد آن را از طریق  افزودن نظر در همین بخش عنوان نمایید.

آخرین بروز رسانی مطلب در شنبه ، 25 خرداد 1392 ، 01:50  

افزودن نظر

دوست عزیز و کاربر گرامی
نظرات بعد از بررسی در سایت درج خواهند شد.
مطمئنا از شنیدن انتقادهای شما خوشحال خواهیم شد.
دلیل فیلتر کردن نظرات صرفا جلوگیری از نظرات مغایر با اسلام و جمهوری اسلامی ایران می باشد. امیدواریم ما را به خاطر این کار درک نمایید. با تشکر






کد امنیتی
بازنشانی