همانطور که می دانيد
const
به برنامه نويس اين امکان را می دهد که مقدار يک متغير را که از
نوع
const
تعريف شده است ، در طول برنامه نتوان تغيير داد . داده هايی که
توسط اشاره گرها به توابع ارسال می شوند ، داخل تابع قابل تغيير می
باشند و ممکن است نا خواسته تغيير يابند . برای جلوگيری از تغييرات
نا خواسته ، آنها را به صورت ثابت به تابع ارسال می کنيم . به
برنامه زير توجه کنيد :
void f( const int * ); // prototype
int main()
{
int y;
f( &y ); // f attempts illegal modification
return 0;
}
// xPtr cannot modify the value of the variable
// to which it points
void f( const int *xPtr )
{
*xPtr = 100; // error: cannot modify a const object
}
برنامه فوق هنگام کامپايل شدن پيغام خطايی مبنی بر اينکه داده ثابت
قابل تغيير نمی باشد را خواهد داد .
Compiling CONSTP1.CPP:
Error CONSTP1.CPP 16: Cannot modify a const object
همانطور که مشاهده می کنيد برای ارسال آرگومان توسط اشاره گر به
صورت ثابت به تابع از دستور
const int *xptr
استفاده کرديم . و در تابع هنگام تغيير مقدار اشاره گر ثابت با
پيغام خطا مواجه شديم .
يکی ديگر از کاربردهای
const
همراه اشاره گرها ، ايجاد اشاره گر ثابتی به داده ای غير ثابت می
باشد . چنين اشاره گری همواره به يک خانه حافظه اشاره می کند و نمی
توان آن را به خانه حافظه ديگری اشاره داد ولی می توان داده داخل
همان خانه حافظه را تغيير داد . به برنامه زير توجه کنيد :
int main()
{
int x, y;
// ptr is a constant pointer to an integer that can
// be modified through ptr, but ptr always points
// to the same memory location.
int * const ptr = &x;
*ptr = 7; // allowed: *ptr is not const
ptr = &y; // error: ptr is const;
// cannot assign new address
return 0;
}
برنامه فوق هنگام کامپايل شدن پيغام خطايی می دهد ، مبنی بر اينکه
به اشاره گر ثابت آدرس جديدی را نمی توان نسبت داد .
Compiling CONSTP2.CPP:
Error CONSTP2.CPP 11: Cannot modify a const object
در برنامه فوق توسط دستور
int * const ptr=&x;
اشاره گر
ptr
به آدرس متغير
x
اشاره خواهد کرد و چون از نوع ثابت تعريف شده است نمی تواند به
آدرس ديگری اشاره کند اما مقداری را که
ptr
به آن اشاره می کند قابل تغيير است لذا با اجرای دستور
ptr=7*
خطايی رخ نمی دهد و مقدار متغير
x
برابر 7 می شود ولی با اجرای دستور
ptr=&y
می خواهيم اشاره گر به متغير
y
اشاره کند و از آنجايی که
ptr
تنها بايد به
x
اشاره کند با پيغام خطا مواجه می شويم .
کاربرد ديگری از
const
همراه اشاره گرها ، ايجاد اشاره گر ثابتی به داده ای ثابت می باشد
. چنين اشاره گری همواره به يک خانه حافظه اشاره می کند و از طريق
اين اشاره گر نيز نمی توان داده داخل آن خانه حافظه را تغيير داد .
به برنامه زير توجه کنيد :
#include <iostream.h>
int main()
{
int x = 5, y;
// ptr is a constant pointer to a constant integer.
// ptr always points to the same location;
// the integer at that location cannot be modified.
const int *const ptr = &x;
cout << *ptr << endl;
*ptr = 7; // error: *ptr is const;
// cannot assign new value
ptr = &y; // error: ptr is const;
// cannot assign new address
return 0;
}
هنگام کاپايل کردن برنامه فوق با پيغام خطايی مبنی بر اينکه مقدار
اشاره گر و آدرس اشاره گر را نمی توان تغيير داد ، مواجه می شويم .
Compiling CONSTP3.CPP:
Error CONSTP3.CPP 14: Cannot modify a const object
Error CONSTP3.CPP 16: Cannot modify a const object
در برنامه فوق توسط دستور
const int * const ptr = &x;
آدرس و مقدار اشاره گر
ptr
از نوع ثابت تعريف شده لذا هنگام تغيير مقدار خانه ای از حافظه که
ptr
به آن اشاره می کند توسط دستور
*ptr = 7;
با پيغام خطا مواجه می شويم و نيز هنگام تغيير آدرسی که
ptr
با آن اشاره می کند توسط دستور
ptr = &y;
پيغام خطای ديگری دريافت می کنيم . |