علاقمندان به زبان های برنامه نویسی روزتون بخیر. با آموزش زبان برنامه نویسی پاسکال (Pascal) از وب سایت آموزشی پی وی لرن همراهتون خواهیم بود. اشاره گرها یا Pointers در زبان پاسکال (Pascal) را دنبال خواهیم نمود.
یادگیری اشاره گرها در پاسکال آسان و سرگرم کننده است. برخی از کارهای برنامه نویسی پاسکال با اشاره گرها راحت تر انجام می شوند و سایر کارها مانند اختصاص حافظه پویا بدون استفاده از اشاره گرها قابل انجام نیست. بنابراین یادگیری اشاره گرها برای تبدیل شدن به یک برنامه نویس کامل پاسکال ضروری می باشد. حال بیایید یادگیری آن ها را به صورت ساده و آسان شروع کنیم.
همان طور که می دانید ، هر متغیر یک مکان حافظه است و هر مکان حافظه آدرس خود را تعریف کرده است که با استفاده از نام متغیر اشاره گرها، که نشان دهنده یک آدرس در حافظه است ، قابل دسترسی می باشد.
یک اشاره گر یک متغیر پویا است ، که مقدار آن آدرس متغیر دیگری است یعنی آدرس مستقیم محل حافظه است. مانند هر متغیر یا ثابت ، قبل از استفاده از آن برای ذخیره کردن آدرس متغیر باید اشاره گرها را اعلام کنید. فرم کلی اعلان یک متغیر اشاره گر به شکل زیر است.
1 2 | type ptr-identifier = ^base-variable-type; |
نوع اشاره گر با پیشوند نماد (^) با نوع پایه (base-type) تعریف می شود. نوع پایه (base-type) انواع آیتم های داده را مشخص می کند. هنگامی که یک متغیر اشاره گر از نوع خاصی تعریف می شود ، می تواند موارد داده فقط از آن نوع را نشان دهد. هنگامی که یک نوع اشاره گر تعریف شد ، می توانیم از اعلان var برای اعلان متغیرهای نشانگر استفاده کنیم.
1 2 | var p1, p2, ... : ptr-identifier; |
در زیر چندین اعلام اشاره گر معتبر وجود دارد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | type Rptr = ^real; Cptr = ^char; Bptr = ^ Boolean; Aptr = ^array[1..5] of real; date-ptr = ^ date; Date = record Day: 1..31; Month: 1..12; Year: 1900..3000; End; var a, b : Rptr; d: date-ptr; |
متغیرهای اشاره گر با استفاده از همان نماد (^) ارجاع داده می شوند. به عنوان مثال ، متغیر مرتبط ارجاع شده با اشاره گر rptr^ ، rptr است. این به صورت زیر قابل دسترس است.
1 | rptr^ := 234.56; |
مثال زیر این مفهوم را نشان می دهد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | program exPointers; var number: integer; iptr: ^integer; begin number := 100; writeln('Number is: ', number); iptr := @number; writeln('iptr points to a value: ', iptr^); iptr^ := 200; writeln('Number is: ', number); writeln('iptr points to a value: ', iptr^); end. |
هنگامی که کد فوق کامپایل و اجرا شد ، نتیجه زیر را ایجاد می کند.
1 2 3 4 | Number is: 100 iptr points to a value: 100 Number is: 200 iptr points to a value: 200 |
در Pascal می توانیم آدرس متغیر را با استفاده از عملگر آدرس (@) به متغیر اشاره گر اختصاص دهیم. ما از این نشانگر برای دستکاری و دسترسی به آیتم داده استفاده می کنیم. اما اگر به دلایلی نیاز به کار با خود آدرس حافظه داشته باشیم ، باید آن را در متغیر نوع word ذخیره کنیم.
بگذارید مثال بالا را برای پرینت آدرس حافظه ذخیره شده در اشاره گر iptr توسعه دهیم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | program exPointers; var number: integer; iptr: ^integer; y: ^word; begin number := 100; writeln('Number is: ', number); iptr := @number; writeln('iptr points to a value: ', iptr^); iptr^ := 200; writeln('Number is: ', number); writeln('iptr points to a value: ', iptr^); y := addr(iptr); writeln(y^); end. |
هنگامی که کد فوق کامپایل و اجرا شد ، نتیجه زیر را ایجاد می کند.
1 2 3 4 5 | Number is: 100 iptr points to a value: 100 Number is: 200 iptr points to a value: 200 45504 |
مبحث اشاره گرها یا Pointers در زبان پاسکال (Pascal) را با اشاره گرهای NIL ادامه می دهیم.
همیشه عمل خوبی است است که مقدار NIL را به متغیر اشاره گر اختصاص دهید در صورتی که آدرس دقیقی برای اختصاص دادن ندارید. این کار در زمان اعلام متغیر انجام می شود. یک اشاره گر که به NIL اختصاص داده می شود به هیچ کجا اشاره نمی کند. برنامه زیر را در نظر بگیرید.
1 2 3 4 5 6 7 8 9 10 11 12 | program exPointers; var number: integer; iptr: ^integer; y: ^word; begin iptr := nil; y := addr(iptr); writeln('the vaule of iptr is ', y^); end. |
هنگامی که کد فوق کامپایل و اجرا شد ، نتیجه زیر را ایجاد می کند.
1 | The value of ptr is 0 |
برای چک کردن اشاره گر nil می توانید از عبارت if به شرح زیر استفاده کنید.
1 2 | if(ptr <> nill )then (* succeeds if p is not null *) if(ptr = nill)then (* succeeds if p is null *) |
اشاره گرها دارای مفاهیم بسیار ساده اما آسانی هستند و برای برنامه نویسی پاسکال بسیار مهم هستند. چند مفهوم برای اشاره گر مهم است که باید برای یک برنامه نویس پاسکال واضح باشد.
ردیف | مفهوم و توضیحات |
---|---|
۱ | اشاره گر حسابی – Pointer arithmetic چهار عملگر حسابی یا محاسباتی وجود دارد که می توان از آن ها در اشاره گرها استفاده کرد: افزایش ، کاهش ، + ، –
|
۲ | آرایه اشاره گرها – Array of pointers برای نگه داشتن تعدادی اشاره گر می توانید آرایه ها را تعیین کنید.
|
۳ | اشاره گر به اشاره گر – Pointer to pointer پاسکال به شما امکان می دهد تا یک اشاره گر روی یک اشاره گر و غیره داشته باشید.
|
۴ | انتقال نشانگرها به زیر برنامه ها در پاسکال ارسال آرگومان توسط مرجع یا آدرس ، هر دو باعث می شوند که آرگومان منتقل شده در زیر برنامه کالینگ (calling) با زیر برنامه فراخوانی تغییر یابد.
|
۵ | بازگشت اشاره گر از زیر برنامه ها در پاسکال پاسکال به یک زیر برنامه اجازه می دهد تا یک اشاره گر را برگرداند. |
با مبحث اشاره گرها یا Pointers در زبان پاسکال (Pascal) همرااه بودیم. در بخش بعد به بررسی Records یا رکوردها می پردازیم. با آموزش زبان برنامه نویسی پاسکال (Pascal) همراه باشید.