اشاره گرها یکی از مباحث دشوار و مهم،از سری مباحث سی پلاس پلاس بحساب میاد .
اشاره گرها روش قدرتمند و انعطاف پذیری برای کار با انواع داده ها در برنامه نظير آرايه ها، رشته ها و ساختمان ها و حافظه پویا می باشد. اشاره گر متغيری است که آدرس متغير ديگری را نگه می دارد که اصطلاحا میگوییم به آن متغير اشاره می کند. با دوتا عملگر ،عملگر * (address-of operator) و & (indirection operator) در این مبحث حسابی کارداریم.
یک متغير اشاره گر( pointer variable) متغیری است که حاوی آدرس داده ، متغیر دیگر يا تابع است. برای ذخیره آدرس اولین مرحله اعلان متغیر اشاره گر است. اعلان متغير اشاره گر تقریبا مشابه متغيرهای ديگر است فقط قبل از نام متغیر از علامت (*) استفاده میشه همچنین هنگام تعريف اشاره گر نوع داده ای که به آن اشاره می کند باید مشخص شود که سختار ان به صورت زیر می باشد:
typename *ptrname;
typename نوع داده است که اشاره گر به آن اشاره می کند. علامت (*) عملگری است که بیان می کند متغیر اشاره گری به داده ای از نوع typename است.
بعد از اعلان متغیر اشاره گر باید آدرس مکانی از حافظه که حاوی داده مورد نظر است را به اشاره گر اختصاص داد
که عملگر & (address-of operator) آدرس این اجزا را می دهد که ساختار ان به شکل زیر هست:
pointer = &variable;
در مثال زیر به طوری دیگر براتون با جزئیات مطرح کردیم:
string food = “Pizza”; // نوع متغیر از نوع رشته اعلان شده
string* ptr = &food; // اعلان اشاره گر
// خروجی که در اشاره گر غذا هست رو نمایش میده که همان پیتزا
cout << food << “\n”;
// خروجی ادرس متغیر ما یعنی ادرس پیتزا که در حافظه هست رو نمایش میده
cout << &food << “\n”;
// خروجی ادرس متغیر ما توسط عملگر ptr خروجی میده
cout << ptr << “\n”;
خروجی به صورت زیر می باشد:
Pizza
0x6dfed4
0x6dfed4
حالا ما میتونیم مقدار اشارهگر رو اصلاح هم کنیم مثلا در کد زیر اومدیم به جای پیتزا همبرگر به اشاره گر مقدادرهی کردیم.
string food = “Pizza”;
string* ptr = &food;
cout << food << “\n”;
cout << &food << “\n”;
cout << *ptr << “\n”;
*ptr = “Hamburger”;
cout << *ptr << “\n”;
cout << food << “\n”;
خروجی شده :
Pizza
0x6dfed4
Pizza
Hamburger
Hamburger
عملیات های محاسباتی نظیر جمع، تفریق، افزایش و کاهش که در مباحث گذشته هم زیاد باهاش کارکردیم را می توانیم روی متغيرهای اشاره گر هم انجام بدیم اما یکم متفاوت تر چرا؟؟چون اشاره گر آدرسی در حافظه است وقتی محاسباتی روی آن انجام می گیرد رفتار متفاوتی نشان می دهد. خب حالا بریم ببینیم چه تفاوتی داره که هی میگیم.در اشاره گر ها وقتی عمل جمع عددی با متغير اشاره گر صورت می گيرد اشاره گر به اندازه حاصلضرب عدد در تعداد بایت های نوع داده ای که اشاره می کند جلو می رود همیان امر برای عمل تفريق هم صدق می کند یعنی اگر مقداری از متغير اشاره گر کم شود در محاسبات تعداد بايت های نوع داده محسوب می شود.
همونطور هم که یادگرفتید عملگر افزایش (++) مقدار متغیر را یکی اضافه می کند ولی درمحاسبات اشاره گرها متغير اشاره گر را به تعداد بایت های نوع داده آن حرکت می دهد. به شکل زیر دقت کنید تعداد بایت هی نوع داده مربوطه رو به نمایش گذاشته حالا اگر یک اشاره گر به عدد float داشته باشید چون نوع float چهار بایت دارد با افزایش اشاره گر 4 واحد به آن اضافه می شود . بنابراین به 4 بایت بعدی حافظه اشاره می کند و دیگر به همان 4 بایت قبلی اشاره نمی کند.و همین طور این امر برای بقیه نوع داده ها صدق میکند.
مثال: اگر float را چهاربايت درنظر بگيريم، اشاره گر p هشت بايت به جلو حرکت می کند.
Float a;
float p;
p=&a;
p=p+2;
تفاضل اشاره گرها فاصله بین ان دو اشاره گر رو به ما نشون میده که ساختار ان به شرح زیر هست:
مثلا اگر *aو b *هر دو اشاره گر باشند عبارت زير اختلاف فاصله آنها را به ما میده.
a-*b*
نکته. اگر اشاره گر به محل ناشناخته ای از حافظه حرکت کند و عملی روی آن انجام دهید ممکن است عملیات برنامه های دیگر کامپیوتر را با اشکال مواجه کنید.
در قسمت اموزش توابع ما گفتیم تابع سه نوع خروجی داره یا مقدار داره یا مقدار نداره که ازنوع void و سومین نوع گفتیم چند مقدار برمیگرداند که تو بخش اشاره گرها بهش میپردازیم .
خب حالا بریم ببینیم نوع سوم خروجی تابع ماکه چند مقدار برمیگردونه به چه صورته.
در مثال زیر اومدیم دو تا عدد رو با روش متغیر کمکی توسط تابع swap که برای تعویض مقدار دو متغیر استفاده میشه ه کار بردیم.
#include <iostream>
using namespace std;
void swapNums(int &x, int &y) {
int z = x;
x = y;
y = z;
}
int main() {
int firstNum = 10;
int secondNum = 20;
cout << “Before swap: ” << “\n”;
cout << firstNum << secondNum << “\n”;
swapNums(firstNum, secondNum);
cout << “After swap: ” << “\n”;
cout << firstNum << secondNum << “\n”;
return 0;
}
خروجی:
Before swap:
1020
After swap:
2010
خبر ویژه این جلسه برای شما عزیان صندوقچه کد هایی رو درنظر گرفتیم که میتونید کلی تمارین مثال های رایج و پروژه های مهم دست پیدا کنید که به زودی بعد از اتمام جلسات در سایت برای شما بارگذاری میشود. از مزایای این امر میتونیم به اشنایی با کدها و رفع اشکال های دوره و همچنین افزایش تسلط شما و … اشاره داشته باشیم .
متخصصین جوان پاورایی با هدف سهولت در فرایند یادگیری ، مهارت افزایی شما عزیزان با بازار کار مربوطه در تمامی مراحل همراه ،پشتیبان و خدمت رسان شما عزیزان هستند.