قسمت 1
توی این قسمت فقط میخوام چیستی اشاره گر ها و ارجاع ها و طرز کار با اون رو بگم
متغییر : همان طور که میدانید متغییر ها یک فضا در حافظه هستند به طوری که یک مقدار (متن ، عدد ، آبجکت و ...) درون خود (حافظه) ذخیره میکنند.
-
حالت کلی تعریف یک متغییر ساده
-
هنگامی که یک متغییر را تعریف میکنیم یک فضا در حافظه برای آن رزرو میشود و یک مقدار پیش فرض و آشغال هم برای آن در نظر گرفته میشود حال هنگامی که این متغییر مقداردهی میشود این مقدار حافظه عوض میشود به مثال توجه کنید :
وضعیت حافظه قبل از تعریف متغییر
وضعیت حافظه بعد از تعریف متغییر
وضعیت حافظه بعد از مقدار دهی
-
توجه داشته باشید ما عدد 1393 رو به متغییر دادیم (حالا چه جوری در حافظه قرار گرفت؟) عدد 1393 در مبنای هکس(16) برابره با 71 05 حالا با توجه به اینکه ساختمان داده زبان سی مثل stack هست (LastFirst) به صورت برعکس در حافظه قرار میگیره یعنی 05 71 و در همین حد برای شما کافیه چون میخوایم اشاره گر رو بگیم نه متغییر.
-
متغییر ها سه خصوصیت دارند :
-
نوع متغییر (Variable Type)
-
اسم متغییر (Variable Name)
-
آدرس حافظه (Memory Address)
عملگر ارجاع (Reference Operator) یا عملگر آدرس ( & ) :
این عملگر به دو شکل استفاده میشود و دو کار متفاوت برای ما انجام میدهد
-
یک نوع ارجاع برای ما میسازد ( در ادامه درباره نوع ارجاع توضیح داده میشود).
-
آدرس حافظه را برمیگرداند.
-
ارجاع : به صورت ساده یعنی اینکه برای یک آدرس حافظه چند نام مستعار تعریف کنیم
Type& Alias_Name = Ref_Name ;
|
Alias_Name نام مستعار |
Ref_Name نام متغییری که میخواهیم به آن رجوع کنیم |
Type نوع متغیر
|
: مثال |
int Fire360Boy = 1234 ;
int& ref_F360B = Fire360Boy ;
cout << "Fire360Boy : " << Fire360Boy << endl ;
cout << "ref_F360B : " << ref_F360B << endl ;
/*
output :
1234
1234
*/
|
-
عملگر آدرس : این عملگر آدرس (شروع) حافظه متغییر را بر میگرداند.
: مثال |
int Fire360Boy = 1234 ;
cout << &Fire360Boy ;
/*
output :
0x0025a1cc
*/
|
نکات ارجاع ها :
-
توجه کنید که ارجاع ها مانند ثابت ها باید هنگام تعریف مقداردهی شوند با این تفاوت که ثابت ها یک رشته یا لیترال میگیرند ولی ارجاع ها یک متغییر میگیرند.
-
از یک متغییر میتوان چند ارجاع ساخت به طوری که آدرس تمام این ارجاع ها برابر و مساوی آدرس متغییر مرجع هست.
-
مقدار تمام ارجاع ها برابر مقدار مرجع میباشد و هر کدام از (ارجاع یا مرجع) تغییر کنید بقیه هم تغییر میکنند.
عملگر اشاره گر (Pointer Operator) یا عملگر ستاره (Astrisk Operator) ( * ) :
این عملگر به دو شکل استفاده میشود و دو کار متفاوت برای ما انجام میدهد
-
یک اشاره گر برای ذخیره یک آدرس ایجاد میکند.
-
مقداری که درون یک آدرس حافظه قرار دارد را برمیگرداند.
-
اشاره گر : یک متغییر برای ذخیره یک آدرس ایجاد میکند .
ptrName نام اشاره گر |
Type نوع متغیر اشاره گر
|
: مثال |
int Fire360Boy = 1234 ;
int *ptrFire360Boy ;
ptrFire360Boy = &Fire360Boy ;
cout << ptrFire360Boy ;
/*
0x0025a1cc
*/
|
-
عملگر مقدار : این عملگر (*) مقدار یک اشاره گر(آدرس) را بر میگرداند.
: مثال |
int Var = 1234 ;
int *ptrVar ;
ptrVar = &var ;
cout << *ptrVar ;
/*
output :
1234
*/
|
نکات اشاره گر ها :
به مثال ها توجه کنید
#include <iostream>
using namespace std;
void main()
{
int a = 10;
int b = 20;
int &c = a ;
int &d = a ;
int *e = &b;
int *f = &a;
cout << "a : " << a << "\t&a : " << &a << endl ;
cout << "b : " << b << "\t&b : " << &b << endl ;
cout << "c : " << c << "\t&c : " << &c << endl ;
cout << "d : " << d << "\t&d : " << &d << endl ;
cout << "e : " << e << "\t&e : " << &e << "\t*e : " << *e << endl ;
cout << "f : " << f << "\t&f : " << &f << "\t*f : " << *f << endl ;
}
شبیه سازی swap :
#include <iostream>
using namespace std;
void swap_(auto* x , auto *y)
{
auto z;
z = *y;
*y = *x;
*x = z;
cout << "\nSwap x And y\n";
}
void main()
{
int x = 10 ;
int y = 17 ;
cout << "x : " << x << endl << "y : " << y << endl ;
swap_(&x, &y);
cout << "x : " << x << endl << "y : " << y << endl ;
}