به آموزش زبان C (قسمت نهم – Pointers) خوش اومدید.
اشاره گرها یه Pointers هم نوعی متغیر هستند که نقش مهمی را در زبان برنامه نویسی C ایفا می کنند. آنها در چند مورد استفاده می شوند:
- در رشته ها (strings)
- در تخصیص حافظه پویا
- ارسال آرگومانهای توابع به وسیله رفرنس
- ساخت ساختارهای داده پیچیده
- اشاره کردن به توابع
- ساخت ساختارهای داده ویژه (مانند Tree, Tries و غیره)
و موارد دیگر…
اما اشاره گر یا pointer چیست:
یک اشاره گر اساسا یک متغیر integer ساده است که آدرس حاظه ای که به یک مقدار اشاره می کند را در خود نگه میدارد، به جای اینکه مقدار واقعی متغیر را در خود نگه دارد.
همانطور که می دانید حافظه کامپیوترها یک محل ذخیره دادگان متوالی (سریالی) است، و یک اشاره گر به یک بخش خاص از حافظه اشاره می کند. برنامه ما می تواند از اشاره گرها استفاده کند به نحویکه به یک مقدار زیادی از حافظه اشاره کند – بسته به اینکه ما چه مقدار می خوایم از آن نقطه که به آن اشاره شده بخوانیم.
رشته ها به عنوان اشاره گر:
اگه یادتون بیاد قبلا در مورد رشته ها صحبت کردیم، اما حالا ما میتونیم یکم به بخش های عمیق تر شیرجه بزنیم تا ببینیم واقعا رشته ها چی هستند ( در واقع به این رشته ها می گیم C-Strings) به خط کد زیر توجه کنید:
char * name = "John";
که سه تا موضوع هست:
۱ – یک متغیر محلی (پشته یا stack) اختصاص داده شده با نام name که در واقع یک اشاره گر به یک کاراکتر تکی است.
۲- پوینتر باعث شده که رشته “John” در هرجا از حافظه برنامه بتواند ظاهر شود (پس از اجرا شدن برنامه)
۳- از آرگومان name استفاده شده برای اشاره کردن به جایی که کارارکتر j در آنجا قرار دارد (که بقیه خانه ها به ترتیب بعد از آن قرار می گیرند)
اگر ما بخواهیم به متغیر name به عنوان یک آرایه دسترسی داشته باشیم، آن کار خواهد کرد و مقدار آن کاراکتر “J” خواهد بود و در واقع متغیر اشاره می کند به شروع رشته. از اونجا که می دونیم حافظه ترتیبی یا متوالی است، می توانیم حدس بزنیم که اگر در حافظه به سمت جلو حرکت کنیم به کاراکتر دوم یعنی “o” می رسیم و همینجوری میتونیم بریم جلو تا به آخرین کاراراکتر رشته برسیم (یعنی کاراکتر خالی که مقدار ترتیبی (ordinal) عدد صفر خواهد بود یا همان \۰)
ارجاع مجدد یا Dereferencing:
ارجاع مجدد در واقع عملی است که اشاره دارد به جایی که اشاره گر اشاره می کند، به جای آنکه به آدرس حافظه اشاره کند. ما در واقع در آرایه ها از ارجاع مجدد استفاده می کنیم. اپراتور براکت – برای مثال [۰] دسترسی به اولین آیتم آرایه را نشان می دهد. و در حالیکه آرایه ها در واقع اشاره گرها هستند، دسترسی به اولین آیتم در آرایه دقیقا شبیه ارجاع یک اشاره گر است.
ارجاع مجدد یک اشاره گر با استفاده از اپراتور * انجام میگیرد.
اگر ما می خواهیم یک آرایه ایجاد کنیم که قرار است به یک متغیر متفاوت در پشته (stack) ما اشاره کند، ما می توانیم کد زیر را بنویسیم:
/* define a local variable a */
int a = ۱;
/* define a pointer variable, and point it to a using the & operator */
int * pointer_to_a = &a;
printf("The value a is %d\n", a);
printf("The value of a is also %d\n", *pointer_to_a);
توجه داشته باشید که ما از اپراتور & استفاده کردیم برای اشاره کردن به متغیر a، که ما فقط ایجاد کرده ایم.
سپس ما اشاره کردیم به آن با استفاده از اپراتور ارجاع مجدد. ما می توانیم همچنین تغییر دهیم محتوای متغیر ارجاع داده شده را:
int a = ۱;
int * pointer_to_a = &a;
/* let's change the variable a */
a += ۱;
/* we just changed the variable again! */
*pointer_to_a += ۱;
/* will print out 3 */
printf("The value of a is now %d\n", a);
تمرین:
در کد زیر، یک اشاره گر برای متغیر محلی n به نام pointer_to_n ایجاد کنید و از آن استفاده کنید برای افزایش مقدار n به اندازه یک واحد.
#include <stdio.h>
int main() {
int n = 10;
/* your code goes here */
/* testing code */
if (pointer_to_n != &n) return 1;
if (*pointer_to_n != 11) return 1;
printf("Done!\n");
return 0;
}
جواب تمرین:
#include <stdio.h>
int main() {
int n = 10;
int * pointer_to_n = &n;
*pointer_to_n += 1;
/* testing code */
if (pointer_to_n != &n) return 1;
if (*pointer_to_n != 11) return 1;
printf("Done!\n");
return 0;
}
پایان آموزش زبان C (قسمت نهم – Pointers) ادامه دارد…