یک متغیر اشاره گر (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 pge;
age =19;
ptr = &age; // get address of the AgeOfMary variable
cout << “ptr points to ” << *ptr << endl;
cout << “age is ” << age << endl;
برای اشاره گر ptr که به متغیر age اشاره کند موارد زیر صدق می کند:
• ptr* و age هردو به محتوای متغیر age ارجاع می کنند.
• ptr و age& هر دو به آدرس متغیر age هستند.
عملگر * هم به عنوان عملگر مرجع و هم عملگر ضرب استفاده می شود. کامپایلر از نحوه به کار بردن عملگر * در دستور تشخیص می دهد منظور کدام است. وقتی عملگر * بعد از اسم اشاره گری می آید منظور محلی که است که اشاره گر به آن دارد اشاره می کند.
هر بایت حافظه دارای آدرس جداگانه ای است. بنابراین متغیرهائی مانند نوع int، float و … که چندبایت در حافظه مصرف می کنند چند آدرس را اشغال می کنند. آدرس یک متغیر در حقیقت آدرس اولین بایت آن است.