نشانگرهای C

در این مقاله شما kahk’v ihd در مورد اشاره گرها یاد خواهید گرفت؛ آنها چه هستند، چگونه از آنها استفاده می کنید و اشتباهات رایج که ممکن است هنگام کار با آنها رخ دهد.

اشاره گرها ویژگی های قدرتمند C و (C ++) برنامه نویسی هستند که از دیگر زبان های برنامه نویسی محبوب مانند Java و Python متفاوت است.

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


آدرس در سی

قبل از اینکه به مفهوم اشاره گرها برسید، ابتدا با آدرس در C آشنا شوید.

اگر متغیر var را در برنامه خود داشته باشید، &var آدرس شما را در حافظه به شما می دهد، که در آن & عموما اپراتور مرجع نامیده می شود.

شما باید این علامت را در هنگام استفاده از تابع scanf() کنید. این در عملکرد برای ذخیره مقدار ورودی کاربر در آدرس var استفاده شد .

 اسکن ("٪ d"، & var)؛
#include <stdio.h> int main() { int var = 5; printf("Value: %d\n", var); printf("Address: %u", &var); //Notice, the ampersand(&) before var. return 0; }

خروجی

 ارزش: 5  
  آدرس: 2686778

توجه: در هنگام استفاده از این کد ممکن است ارزش آدرس متفاوت را بدست آورید.

در کد منبع بالا، مقدار 5 در مکان حافظه 2686778 ذخیره می شود. var فقط نامی است که به آن مکان داده می شود.


متغیرهای اشاره گر

در C، شما می توانید یک متغیر خاص ایجاد کنید که آدرس را ذخیره می کند (به جای مقدار). این متغیر به نام متغیر اشاره گر یا به سادگی یک اشاره گر است.

چگونه یک متغیر اشاره گر ایجاد کنیم؟

 data_type * pointer_variable_name؛
 int * p؛

بیانیه فوق، p را به عنوان متغیر اشاره گر نوع int تعریف می کند.


اپراتور مرجع (&) و اپراتور Dereference (*)

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

به همین ترتیب، اپراتور دیگری وجود دارد که ارزش آن را از آدرس دریافت می کند، آن را اپراتور Dereference نامیده می شود.

در زیر مثال به وضوح استفاده از اشاره گرها، اپراتور مرجع و اپراتور dereference را نشان می دهد.

نکته: علامت * هنگام اعلام یک اشاره گر اپراتور dereference نیست. این یک نماد مشابه است که نشانگر را ایجاد می کند.


مثال: چگونه نشانگر کار می کند

#include <stdio.h> int main() { int* pc, c; c = 22; printf("Address of c: %u\n", &c); printf("Value of c: %d\n\n", c); pc = &c; printf("Address of pointer pc: %u\n", pc); printf("Content of pointer pc: %d\n\n", *pc); c = 11; printf("Address of pointer pc: %u\n", pc); printf("Content of pointer pc: %d\n\n", *pc); *pc = 2; printf("Address of c: %u\n", &c); printf("Value of c: %d\n\n", c); return 0; } #include <stdio.h> int main() { int* pc, c; c = 22; printf("Address of c: %u\n", &c); printf("Value of c: %d\n\n", c); pc = &c; printf("Address of pointer pc: %u\n", pc); printf("Content of pointer pc: %d\n\n", *pc); c = 11; printf("Address of pointer pc: %u\n", pc); printf("Content of pointer pc: %d\n\n", *pc); *pc = 2; printf("Address of c: %u\n", &c); printf("Value of c: %d\n\n", c); return 0; }

خروجی

 آدرس c: 2686784 
  مقدار c: 22 

  آدرس اشاره گر کامپیوتر: 2686784 
  محتوای اشاره گر کامپیوتر: 22 

  آدرس اشاره گر کامپیوتر: 2686784 
  محتوای اشاره گر کامپیوتر: 11 

  آدرس c: 2686784 
  مقدار c: 2

توضیح برنامه

  1. int* pc, c;
    یک متغیر اشاره گر و متغیر عادی ایجاد شده است.
    در اینجا، یک اشاره گر کامپیوتر و یک متغیر نرمال c
    از آنجا که pc و c در ابتدا در ابتدا مقداردهی نمی شوند، اشاره گر pc به هیچ یک از آد هر دو نوع int ایجاد می شود. رس ها یا یک آدرس تصادفی اشاره نمی کند. و متغیر c دارای یک آدرس است اما حاوی مقدار تصادفی زباله است.
  2. c = 22;
    22 به متغیر c اختصاص داده شده است.
    این 22 را به متغیر c اختصاص می دهد، یعنی 22 در مکان حافظه متغیر c ذخیره می شود .
    توجه داشته باشید که هنگام چاپ &c (آدرس c)، از %u به جای %d استفاده می کنیم، زیرا آدرس معمولا به عنوان یک عدد صحیح بدون علامت (همیشه مثبت) بیان می شود.
  3. pc = &c;
    آدرس متغیر c به اشاره گر کامپیوتر اختصاص داده شده است.
    این آدرس متغیر c را به اشاره گر کامپیوتر اختصاص می دهد .
    شما می بینید که مقدار کامپیوتر همان آدرس c است و محتوای کامپیوتر نیز 22 است.
  4. c = 11;
    11 به متغیر c اختصاص داده شده است.
    این 11 را به متغیر c اختصاص می دهد.
    از آن جایی که اشاره گر کامپیوتر به همان آدرس c اشاره می کند، مقدار اشاره شده توسط اشاره گر کامپیوتر نیز 11 است.
  5. *pc = 2;
    5 به آدرس متغیر اشاره گر اختصاص داده شده است.
    این مقدار را در محل حافظه اشاره شده توسط اشاره گر کامپیوتر به 2 تغییر دهید.
    از آنجا که آدرس اشاره گر کامپیوتر همان آدرس آدرس c است ، مقدار c نیز به 2 تغییر می کند.