یک متغير اشاره گر (pointer variable) متغیری است که حاوی آدرس داده ، متغیر دیگر يا تابع است. برای ذخیره آدرس اولین مرحله اعلان متغیر اشاره گر است. اعلان متغير اشاره گر تقریبا مشابه متغيرهای ديگر است تنها باید قبل از نام متغیر علامت ستاره (*) برای نشان داده اینکه یک اشاره گر است اضافه شود. هنگام تعريف اشاره گر نوع داده ای که به آن اشاره می کند باید مشخص شود. اعلان اشاره گر از فرم کلی زیر تبعیت می کند:
typename *ptrname;
typename نوع داده است که اشاره گر به آن اشاره می کند. علامت (*) عملگری است که بیان می کند متغیر اشاره گری به داده ای از نوع typename است. اشاره گر می تواند همراه با متغیر های غیراشاره گری هم اعلان شود.
مثال. متغیر ptr اشاره گری به یک داده صحیح است.
int *ptr;
int* ptr;
مثال. در اعلان زیر age از نوع صحيح و ptr اشاره گری به داده صحيح است.
int *ptr, age;
بعد از اعلان متغیر اشاره گر باید آنرا به جائی اشاره داد يعنی آدرس مکانی از حافظه که حاوی داده مورد نظر است را به اشاره گر اختصاص داد. اگر یک اشاره گر فقط اعلان شود و مقداردهی نشود ممکن است به محل دلخواهی از حافظه اشاره کند و استفاده از آن بدون توجه به اين مسئله می تواند مشکلات مهمی روی سیستم تولید کند. یک تکنیک کلی مقداردهی اشاره گر با مقدار NULL يا صفر است.
راه ديگر برای مقداردهی اشاره گر ذخیره آدرس متغیر دیگر در آن است. وقتی برنامه ای اجرا می شود کلیه اجزای آن در حافظه قرار می گیرد. بنابراین هر جز از برنامه از جمله متغیرها دارای آدرس هستند. عملگر & (address-of operator) آدرس این اجزا را می دهد. عملگر & آدرس عملوند خود را برمی گرداند که می توان این آدرس را درون یک متغیر اشاره گر ذخیره کرد.
مقداردهی یک اشاره گر می تواند فرم کلی زیر را داشته باشد:
pointer = &variable;
مثال. دستور زیر آدرس متغیر age را به اشاره گر ptr اختصاص می دهد.
ptr = &age;
مثال. در برنامه زير اشاره گر j آدرس متغیر i را نشان می دهد.
#include <iostream.h>
int main(){
int i;
int* j;
j = &i;
i = 4;
cout << "i is " << i;
cout << "\n j is " << j;
return 0;
}
اشاره گرها نوعدار هستند یعنی باید به کامپایلر بگوئید که نوع متغیری که اشاره گر به آن اشاره می کند چیست. نوع اشاره گر و متغیری که به آن اشاره می کند باید یکسان باشد.
مثال.. دستورات زير خطا تولید می کند چون نمی توان اشاره گر int را به نوع char اشاره داد.
char c='0';
int *p=&c;
بعد از مقداردهی از طریق متغیر اشاره گر می توان با داده کار کرد. برای دسترسی به محلی که اشاره گر اشاره می کند از عملگر * استفاده می شود. عملگر* محتوای آدرسی از حافظه را برمی گرداند و عملگر مرجع (indirection operator) نامیده می شود چون در واقع یک ارجاع به آدرسی در حافظه است.
مثال. متغیر اشاره گر ptr به داده صحیح اشاره می کند. توجه کنید چگونه از typedef برای نامگذاری نوع اشاره گر استفاده شده است.
typedef int* IntPtr;
IntPtr ptr;
int age;
age =19;
ptr = &age; // get address of the AgeOfMary variable
cout << "ptr points to " << *ptr << endl;
cout << "age is " << age << endl;
Pointer To Integer
برای اشاره گر ptr که به متغیر age اشاره کند موارد زیر صدق می کند:
• ptr* و age هردو به محتوای متغیر age ارجاع می کنند.
• ptr و age& هر دو به آدرس متغیر age هستند.
عملگر * هم به عنوان عملگر مرجع و هم عملگر ضرب استفاده می شود. کامپایلر از نحوه به کار بردن عملگر * در دستور تشخیص می دهد منظور کدام است. وقتی عملگر * بعد از اسم اشاره گری می آید منظور محلی که است که اشاره گر به آن دارد اشاره می کند.
هر بایت حافظه دارای آدرس جداگانه ای است. بنابراین متغیرهائی مانند نوع int، float و ... که چندبایت در حافظه مصرف می کنند چند آدرس را اشغال می کنند. آدرس یک متغیر در حقیقت آدرس اولین بایت آن است.
مثال. آدرس اولین بایت متغیر به اشاره گر اختصاص داده می شود بنابراین ptrint برابر با 1000، ptrchar برابر با 1003 و ptrfloat برابر با آدرس 1006 می شود.
int i = 12252;
char c = 90;
float f = 1200.156004;
int *ptrint;
char *ptrchar;
float *ptrfloat;
...
ptrint = &i;
ptrchar = &c;
ptrfloat = &f;
Pointer To Multi Byte Data
typename *ptrname;
typename نوع داده است که اشاره گر به آن اشاره می کند. علامت (*) عملگری است که بیان می کند متغیر اشاره گری به داده ای از نوع typename است. اشاره گر می تواند همراه با متغیر های غیراشاره گری هم اعلان شود.
مثال. متغیر ptr اشاره گری به یک داده صحیح است.
int *ptr;
int* ptr;
مثال. در اعلان زیر age از نوع صحيح و ptr اشاره گری به داده صحيح است.
int *ptr, age;
بعد از اعلان متغیر اشاره گر باید آنرا به جائی اشاره داد يعنی آدرس مکانی از حافظه که حاوی داده مورد نظر است را به اشاره گر اختصاص داد. اگر یک اشاره گر فقط اعلان شود و مقداردهی نشود ممکن است به محل دلخواهی از حافظه اشاره کند و استفاده از آن بدون توجه به اين مسئله می تواند مشکلات مهمی روی سیستم تولید کند. یک تکنیک کلی مقداردهی اشاره گر با مقدار NULL يا صفر است.
راه ديگر برای مقداردهی اشاره گر ذخیره آدرس متغیر دیگر در آن است. وقتی برنامه ای اجرا می شود کلیه اجزای آن در حافظه قرار می گیرد. بنابراین هر جز از برنامه از جمله متغیرها دارای آدرس هستند. عملگر & (address-of operator) آدرس این اجزا را می دهد. عملگر & آدرس عملوند خود را برمی گرداند که می توان این آدرس را درون یک متغیر اشاره گر ذخیره کرد.
مقداردهی یک اشاره گر می تواند فرم کلی زیر را داشته باشد:
pointer = &variable;
مثال. دستور زیر آدرس متغیر age را به اشاره گر ptr اختصاص می دهد.
ptr = &age;
مثال. در برنامه زير اشاره گر j آدرس متغیر i را نشان می دهد.
#include <iostream.h>
int main(){
int i;
int* j;
j = &i;
i = 4;
cout << "i is " << i;
cout << "\n j is " << j;
return 0;
}
اشاره گرها نوعدار هستند یعنی باید به کامپایلر بگوئید که نوع متغیری که اشاره گر به آن اشاره می کند چیست. نوع اشاره گر و متغیری که به آن اشاره می کند باید یکسان باشد.
مثال.. دستورات زير خطا تولید می کند چون نمی توان اشاره گر int را به نوع char اشاره داد.
char c='0';
int *p=&c;
بعد از مقداردهی از طریق متغیر اشاره گر می توان با داده کار کرد. برای دسترسی به محلی که اشاره گر اشاره می کند از عملگر * استفاده می شود. عملگر* محتوای آدرسی از حافظه را برمی گرداند و عملگر مرجع (indirection operator) نامیده می شود چون در واقع یک ارجاع به آدرسی در حافظه است.
مثال. متغیر اشاره گر ptr به داده صحیح اشاره می کند. توجه کنید چگونه از typedef برای نامگذاری نوع اشاره گر استفاده شده است.
typedef int* IntPtr;
IntPtr ptr;
int age;
age =19;
ptr = &age; // get address of the AgeOfMary variable
cout << "ptr points to " << *ptr << endl;
cout << "age is " << age << endl;
Pointer To Integer
برای اشاره گر ptr که به متغیر age اشاره کند موارد زیر صدق می کند:
• ptr* و age هردو به محتوای متغیر age ارجاع می کنند.
• ptr و age& هر دو به آدرس متغیر age هستند.
عملگر * هم به عنوان عملگر مرجع و هم عملگر ضرب استفاده می شود. کامپایلر از نحوه به کار بردن عملگر * در دستور تشخیص می دهد منظور کدام است. وقتی عملگر * بعد از اسم اشاره گری می آید منظور محلی که است که اشاره گر به آن دارد اشاره می کند.
هر بایت حافظه دارای آدرس جداگانه ای است. بنابراین متغیرهائی مانند نوع int، float و ... که چندبایت در حافظه مصرف می کنند چند آدرس را اشغال می کنند. آدرس یک متغیر در حقیقت آدرس اولین بایت آن است.
مثال. آدرس اولین بایت متغیر به اشاره گر اختصاص داده می شود بنابراین ptrint برابر با 1000، ptrchar برابر با 1003 و ptrfloat برابر با آدرس 1006 می شود.
int i = 12252;
char c = 90;
float f = 1200.156004;
int *ptrint;
char *ptrchar;
float *ptrfloat;
...
ptrint = &i;
ptrchar = &c;
ptrfloat = &f;
Pointer To Multi Byte Data