آموزش سریع و کامل اشاره گر ها (Pointers) ، ارجاع ها (Reference) قسمت 1 - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

وبـــلاگ هــفت خــط کــد


آموزش های برنامه نویسی
۱۵۳ نفر آنلاین
۰ عضو و ۱۵۳ مهمان در سایت حاضرند

آموزش سریع و کامل اشاره گر ها (Pointers) ، ارجاع ها (Reference) قسمت 1

+8 امتیاز
234 بازدید

قسمت 1

توی این قسمت فقط میخوام چیستی اشاره گر ها و ارجاع ها و طرز کار با اون رو بگم

متغییر : همان طور که میدانید متغییر ها یک فضا در حافظه هستند به طوری که یک مقدار (متن ، عدد ، آبجکت و ...) درون خود (حافظه) ذخیره میکنند.

  • حالت کلی تعریف یک متغییر ساده
Type Var_Name [=Value] ;
مثال : int a=2;

 

  • هنگامی که یک متغییر را تعریف میکنیم یک فضا در حافظه برای آن رزرو میشود و یک مقدار پیش فرض و آشغال هم برای آن در نظر گرفته میشود حال هنگامی که این متغییر مقداردهی میشود این مقدار حافظه عوض میشود به مثال توجه کنید :

وضعیت حافظه قبل از تعریف متغییر

وضعیت حافظه بعد از تعریف متغییر

وضعیت حافظه بعد از مقدار دهی

 

  • توجه داشته باشید ما عدد 1393 رو به متغییر دادیم (حالا چه جوری در حافظه قرار گرفت؟) عدد 1393 در مبنای هکس(16) برابره با 71 05 حالا با توجه به اینکه ساختمان داده زبان سی مثل stack هست (LastFirst) به صورت برعکس در حافظه قرار میگیره یعنی 05 71 و در همین حد برای شما کافیه چون میخوایم اشاره گر رو بگیم نه متغییر.

 

  • متغییر ها سه خصوصیت دارند :
  1.                    نوع متغییر        (Variable Type)
  2.                   اسم متغییر          (Variable Name)
  3.                   آدرس حافظه       (Memory Address)

 

 

عملگر ارجاع (Reference Operator) یا عملگر آدرس ( & ) :

این عملگر به دو شکل استفاده میشود و دو کار متفاوت برای ما انجام میدهد

  1. یک نوع ارجاع برای ما میسازد ( در ادامه درباره نوع ارجاع توضیح داده میشود).
  2. آدرس حافظه را برمیگرداند.
  • ارجاع : به صورت ساده یعنی اینکه برای یک آدرس حافظه چند نام مستعار تعریف کنیم
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
*/
  • عملگر آدرس : این عملگر آدرس (شروع) حافظه متغییر را بر میگرداند.

 

&Var_Name ;

Var_Name        نام متغیر

: مثال
int Fire360Boy = 1234 ;
cout << &Fire360Boy ;

/*
output : 
0x0025a1cc
*/

نکات ارجاع ها :

  • توجه کنید که ارجاع ها مانند ثابت ها باید هنگام تعریف مقداردهی شوند با این تفاوت که ثابت ها یک رشته یا لیترال میگیرند ولی ارجاع ها یک متغییر میگیرند.
  • از یک متغییر میتوان چند ارجاع ساخت به طوری که آدرس تمام این ارجاع ها برابر و مساوی آدرس متغییر مرجع هست.
  • مقدار تمام ارجاع ها برابر مقدار مرجع میباشد و هر کدام از (ارجاع یا مرجع) تغییر کنید بقیه هم تغییر میکنند.

 

 

 

عملگر اشاره گر (Pointer Operator) یا عملگر ستاره (Astrisk Operator) ( * ) :

این عملگر به دو شکل استفاده میشود و دو کار متفاوت برای ما انجام میدهد

  1. یک اشاره گر برای ذخیره یک آدرس ایجاد میکند.
  2. مقداری که درون یک آدرس حافظه قرار دارد را برمیگرداند.
  • اشاره گر : یک متغییر برای ذخیره یک آدرس ایجاد میکند .
Type* ptrName ;
ptrName        نام اشاره گر

Type    نوع متغیر اشاره گر

: مثال
int Fire360Boy = 1234 ;
int *ptrFire360Boy ;
ptrFire360Boy = &Fire360Boy ;

cout << ptrFire360Boy ;

/*
0x0025a1cc
*/
  • عملگر مقدار : این عملگر (*) مقدار یک اشاره گر(آدرس) را بر میگرداند.

 

*Var_Name ;

Var_Name        نام متغیر

: مثال
int Var = 1234 ;
int *ptrVar ;
ptrVar = &var ;
cout << *ptrVar ;

/*
output : 
1234
*/

نکات اشاره گر ها :

  • عملگر آدرس و اشاره گر عکس هم عمل میکنند (آدرس : متغییر (مقدار) رو تبدیل به آدرس میکنه و اشاره گر آدرس رو تبدیل به مقدار میکنه) یعنی
    &*a

    برابر

    *&a

    برابر

    a

    میباشد.

  • اشاره گر ها خود یک آدرس دارند که با عملگر & میتوان به آن آدرس دست پیدا کرد.

به مثال ها توجه کنید

#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 ;
}

سوال شده شهریور 29, 1393  بوسیله ی Fire360Boy (امتیاز 3,342)   3 18 42

لطفا وارد شوید یا ثبت نام کنید برای جواب دادن به این سوال.

...