فصل هشتم استاندارد رشته های کاراکتری و فایل ها در » در++ C

<!-- /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:"Times New Roman";} @page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:35.4pt; mso-footer-margin:35.4pt; mso-paper-source:0;} div.Section1 {page:Section1;} -->

mohsen_mahyar@yahoo.com

فصل هفتم

      C++ در« اشاره گرها 1 و ارجاع ها 2 »

7 مقدمه ‐1

حافظۀ رایانه را می توان به صورت یک آرایۀ بزرگ در

در RAM نظر گرفت. برای مثال رایانه ای با 256 مگابایت

حقیقت حاوی آرایه ای به اندازۀ 268،435،456

228 ) خانه است که اندازۀ هر خانه یک بایت است. این =)

خانه ها دارای ایندکس صفر تا 268،435،455 هستند.

به ایندکس هر بایت، آدرس حافظۀ آن می گویند. آدرس های

حافظه را با اعداد شانزده دهی نشان می دهند. پس رایانۀ مذکور

0 می باشد. هر وقت که x0fffffff 0 تا x دارای محدوده آدرس 00000000

نوع » : متغیری را اعلان می کنیم، سه ویژگی اساسی به آن متغیر نسبت داده می شود

و n و نام int نوع int n; آن. مثلا اعلان « آدرس حافظه » و « نام متغیر » و « متغیر

در آن قرار می گیرد را به یکدیگر مرتبط n آدرس چند خانه از حافظه که مقدار

را n 0 است. بنابراین می توانیم x0050cdc می سازد. فرض کنید آدرس این متغیر 0

0x00000000

0x00000001

0x00000002

0x00000003

0x00000004

0x00000005

0x00000006

0x00000007

0x0064fdc5

0x0064fdc6

0x0064fdc7

0x0064fdc8

0x0ffffffe

 

0x0fffffff

1 – Pointers 2 – References

فصل هفتم / اشاره گرها و ارجا ع ها 215

مانند شکل زیر مجسم کنیم:

خود متغیر به شکل جعبه نمایش داده شده. نام متغیر،

در بالای جعبه است و آدرس متغیر در سمت چپ جعبه و ،n

در زیر جعبه نشان داده شده. در بیشتر ،int ، نوع متغیر

چهار بایت از حافظه را اشغال می نماید. int رایانه ها نوع

بنابراین همان طور که در شکل مقابل نشان داده شده است،

یک بلوک چهاربایتی از حافظه را اشغال می کند که n متغیر

0 است. x0050cdc 0 تا 3 x0050cdc شامل بایت های 0

توجه کنید که آدرس شی، آدرس اولین بایت از بلوکی است که شی در آن جا ذخیره

مقداردهی اولیه شود، آنگاه بلوک حافظه int n= شده. اگر متغیر فوق به شکل ; 32

به شکل زیر خواهد بود. مقدار

32 در چهار بایتی که برای آن

متغیر منظور شده ذخیره می شود.

در این فصل به بررسی و نحوۀ استفاده از آدر سها خواهیم پرداخت.

7 عملگر ارجاع ‐1

& برای بدست آوردن آدرس یک متغیر می توان از عملگر ارجاع 1 C++ در

را n آدرس متغیر &n نیز می گویند. عبارت « علمگر آدرس » استفاده نمود. به این عملگر

به دست می دهد.

7 چاپ آدرس یک متغیر ‐ * مثال 1

int main()

{ int n=44;

cout << " n = " << n << endl; // prints the value of n

cout << "&n = " << &n << endl; // prints the address of n

}

n = 44

&n = 0x00c9fdc3

0x0050cdc0

n

int

0x0050cdb8

0x0050cdb9

0x0050cdc0

0x0050cdc1

0x0050cdc2

0x0050cdc3

0x0050cdc4

0x0050cdc5

0x0050cdb8

0x0050cdb9

0x0050cdc0

0x0050cdc1

0x0050cdc2

0x0050cdc3

0x0050cdc4

0x0050cdc5

32 0x0050cdc0 32

n

int

1 – Reference operator

 

216 برنامه سازی پیشرفته

0 است. می توان x00c9fdc در این اجرا برابر با 3 n خروجی نشان می دهد که آدرس

فهمید که این مقدار باید یک آدرس باشد زیرا به شکل شانزده دهی نمایش داده شده.

0 می توان تشخیص داد. معادل دهدهی عدد بالا x اعداد شانزد هدهی را از روی علامت

مقدار 13,237,699 می باشد.

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

استفاده های مهم تری دارد. یک کاربرد آن را در فصل پنجم گفته ایم: ساختن پارامترهای

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

است؛ اعلان متغیرهای ارجاع.

7 ارجاع ها ‐2

یک اسم مستعار یا واژۀ مترادف برای متغیر دیگر است. نحو اعلان « ارجاع » یک

یک ارجاع به شکل زیر است:

type& ref_name = var_name;

نام متغیری var_name نام مستعار است و ref_name ، نوع متغیر است type

است که می خواهیم برای آن نام مستعار بسازیم. برای مثال در اعلان :

int& rn=n; // r is a synonym for n

باید قبلا اعلان شده باشد. n است. البته n یک ارجاع یا نام مستعار برای rn

7 استفاده از ارجاع ها ‐ * مثال 2

اعلان م یشود: n به عنوان یک ارجاع به rn در برنامۀ زیر

int main()

{ int n=44;

int& rn=n; // rn is a synonym for n

cout << "n = " << n << ", rn = " << rn << endl;

--n;

cout << "n = " << n << ", rn = " << rn << endl;

rn *= 2;

cout << "n = " << n << ", rn = " << rn << endl;

}

فصل هفتم / اشاره گرها و ارجا ع ها 217

n = 44, rn = 44

n = 43, rn = 43

n = 86, rn = 86

نام های متفاوتی برای یک متغیر است. این دو همیشه مقدار یکسانی دارند. اگر rn و n

نیز افزایش یافته است. n ، افزایش یابد rn نیز کاسته شده و اگر rn ، کاسته شود n

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

مقدار اولیۀ یک ارجاع، یک متغیر است نه یک لیترال. بنابراین کد زیر اشتباه است:

int& rn=44; // ERROR: 44 is not a variable;

گرچه برخی از کامپایلرها ممکن است دستور بالا را مجاز بدانند ولی با نشان دادن یک

به حافظۀ آن متغیر، ارجاع rn هشدار اعلام می کنند که یک متغیر موقتی ایجاد شده تا

داشته باشد.

درست است که ارجاع با یک متغیر مقداردهی می شود، اما ارجاع به خودی خود

یک متغیر نیست. یک متغیر، فضای ذخیره سازی و نشانی مستقل دارد، حال آن که

ارجاع از فضای ذخیره سازی و نشانی متغیر دیگری بهره می برد.

7 ارجاع ها متغیرهای مستقل نیستند ‐ * مثال 3

int main()

/ 0 نظر / 86 بازدید