نحو ساخت نشانگر در زبان C
در جلسات قبل روش بدست آوردن آدرس حافظه داده های یک متغیر را با استفاده از عبارت اَمپِرسَند ( & ) (Ampersand) را آموختیم.
int myAge = 43;
printf("%d\n", myAge);
printf("%p\n", &myAge);
نشانگر، یک متغیر است که آدرس حافظه داده ذخیره شده را بعنوان یک مقدار در خود ذخیره می کند.
نشانگرها را با نوع ( int ) تعریف و با عملگر ( * ) ایجاد می کنیم.
در نتیجه آدرس متغیری که با آن کار می کنیم به نشانگر اختصاص داده می شود.
int myAge = 43; // An int variable
int* ptr = &myAge; // یک متغیر نشانگر با نام ptr ساختیم که آدرس ذخیره شده متغیر myAge را در آن ذخیره کردیم
// مقدار myAge را نمایش دادیم (43)
printf("%d\n", myAge);
// آدرس حافظه ذخیره شده myAge را نمایش دادیم (0x7ffe5367e044)
printf("%p\n", &myAge);
// آدرس حافظه ذخیره شده myAge را با متغیر نشانگر نمایش دادیم (0x7ffe5367e044)
printf("%p\n", ptr);
توضیح مثال بالا:
یک متغیر نشانگر با نام ( ptr ) ایجاد کردیم که به متغیر myAge اشاره می کند. (البته باید دقت داشته باشید که نوع داده هر دو متغیر باید از نوع ( int ) باشد.)
در ادامه از عملگر ( & ) برای ذخیره آدرس حافظه متغیر myAge استفاده کرده و آن را به نشانگر اختصاص می دهیم.
حالا متغیر ( ptr ) مقدار آدرس حافظه myAge را در خود ذخیره کرده است.
نشانگر غیر مرجع یا Dereference در زبان C
در مثال بالا با استفاده از عملگر ( & مرجع)، از متغیر نشانگر برای بدست آوردن آدرس حافظه استفاده کردیم.
همچنین می توان مقدار متغیری که نشانگر به آن اشاره کرده است را با استفاده از عملگر ( * غیر مرجع) بدست آورد.
int myAge = 43; // یک متغیر تعریف کردیم
int* ptr = &myAge; // یک نشانگر تعریف کردیم
// Reference: آدرس حافظه myAge را با متغیر نشانگر نمایش دادیم(0x7ffe5367e044)
printf("%p\n", ptr);
// Dereference: مقدار داده myAge را با نشانگر نمایش دادیم (43)
printf("%d\n", *ptr);
نکته: توجه کنید که استفاده از علامت ( * ) در اینجا می تواند کمی گیج کننده باشد، چرا که این علامت در جاهای مختلف، عملکرد متفاوتی خواهند دارد.
- حالت اول : ( int* ptr ) - یک متغیر نشانگر می سازد.
-حالت دوم : بعنوان عملگر غیر مرجع (dereference) استفاده می شود.
بهتر است بدانید:
دو راه برای تعریف متغیر نشانگر وجود دارد.
int* myNum;
int *myNum;
چند نکته مهم در مورد نشانگرها در زبان C
نشانگرها یکی از مواردی هستند که زبان C را از سایر زبان ها مانند Python , Java و . . . متمایز می کند.
چرا که این امکان به ما اجازه دستکاری آدرس حافظه داده های ذخیره شده در متغیرها در کامپیوتر را می دهد، که در نتیجه می توان کدهای برنامه را کاهش و عملکرد را بهبود بخشید.
همچنین از این امکان برای پیاده سازی مدریت فایل و مدیریت حافظه استفاده می کنند.
نکته: از نشانگرها با احتیاط استفاده کنید، چرا که امکان دارد به داده های ذخیره شده در سایر آدرس های حافظه آسیب برساند.
تمرین
یک متغیر نشانگر به نام ( ptr ) ایجاد کنید تا به متغیر دیگری به نام myAge از نوع داده int اشاره کند.
= &myAge;